Skip to content

Commit

Permalink
Merge pull request #75 from KenEucker/develop
Browse files Browse the repository at this point in the history
Adds updload functionality
  • Loading branch information
KenEucker authored Nov 6, 2021
2 parents d96ed63 + 8948e60 commit dc220c6
Show file tree
Hide file tree
Showing 13 changed files with 378 additions and 117 deletions.
2 changes: 0 additions & 2 deletions examples/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ test('BikeTagClient imgur instance can retrieve tag data', async () => {
hint: null,
mysteryImageUrl: 'https://i.imgur.com/6cXbPlZ.jpg',
foundImageUrl: 'https://i.imgur.com/UATbr0p.jpg',
mysteryImage: '',
foundImage: '',
gps: { lat: 0, long: 0, alt: 0 },
},
source: "imgur",
Expand Down
116 changes: 86 additions & 30 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,16 @@ import {
SanityCredentials,
RedditCredentials,
RequireAtLeastOne,
BikeTagCredentials,
BikeTagConfiguration,
PartialBikeTagConfiguration,
} from './common/types'
import {
getTagPayload,
getTagsPayload,
updateTagPayload,
getGameDataPayload,
uploadTagImagePayload,
} from './common/payloads'
import {
constructTagNumberSlug,
Expand All @@ -25,6 +29,10 @@ import {
isRedditCredentials,
isSanityCredentials,
isBikeTagCredentials,
isBikeTagApiReady,
isSanityApiReady,
isImgurApiReady,
isRedditApiReady,
} from './common/methods'
import { setup } from 'axios-cache-adapter'

Expand All @@ -40,8 +48,6 @@ import ImgurClient from 'imgur'
import sanityClient, { SanityClient } from '@sanity/client'

const USERAGENT = 'biketag-api (https://github.com/keneucker/biketag-api)'

import { BikeTagCredentials, BikeTagConfiguration } from './common/types'
export class BikeTagClient extends EventEmitter {
expressions: any = BikeTagExpressions
getters: any = BikeTagGetters
Expand Down Expand Up @@ -115,15 +121,17 @@ export class BikeTagClient extends EventEmitter {
})
}

private getDefaultOptions(opts: any, optsType = 'default'): any {
private getDefaultOptions(opts: any, optsType = 'tag'): any {
/// If the options passed in was a string, set it as the slug
const options =
typeof opts === 'string'
? { slug: opts }
: typeof opts === 'number'
: typeof opts === 'number' && optsType === 'tag'
? { tagnumber: opts }
: Array.isArray(opts)
: Array.isArray(opts) && optsType === 'tag'
? { tagnumbers: opts }
: Array.isArray(opts)
? { payload: opts }
: opts

/// Set the game in the options, defaulting to the configured game
Expand All @@ -137,8 +145,6 @@ export class BikeTagClient extends EventEmitter {
options.slug = options.slug ?? options.game.toLowerCase()
break

default:
case 'default':
case 'tag':
/// Set the album hash, if present (Imgur specific)
if (this.imgurConfig?.hash) {
Expand Down Expand Up @@ -172,9 +178,13 @@ export class BikeTagClient extends EventEmitter {

private getDefaultAPI(
opts: any = {},
overloads: any = {},
getOptionsDefault: string | undefined = undefined
): any {
const options = this.getDefaultOptions(opts, getOptionsDefault)
const options = {
...this.getDefaultOptions(opts, getOptionsDefault),
...overloads,
}
const availableAPI = options.source
? options.source
: this.getMostAvailableAPI()
Expand Down Expand Up @@ -214,28 +224,59 @@ export class BikeTagClient extends EventEmitter {
return this.mostAvailableApi
}

if (this.biketagConfig && isBikeTagCredentials(this.biketagConfig)) {
if (
this.biketagConfig &&
isBikeTagCredentials(this.biketagConfig) &&
isBikeTagApiReady(this.biketagConfig)
) {
return (this.mostAvailableApi = 'biketag')
} else if (this.imgurConfig) {
} else if (
this.imgurConfig &&
isImgurCredentials(this.imgurConfig) &&
isImgurApiReady(this.imgurConfig)
) {
return (this.mostAvailableApi = 'imgur')
} else if (this.sanityConfig) {
} else if (
this.sanityConfig &&
isSanityCredentials(this.sanityConfig) &&
isSanityApiReady(this.sanityConfig)
) {
return (this.mostAvailableApi = 'sanity')
} else if (this.redditConfig) {
} else if (
this.redditConfig &&
isRedditCredentials(this.redditConfig) &&
isRedditApiReady(this.redditConfig)
) {
return (this.mostAvailableApi = 'reddit')
}

return ''
}

setConfiguration(
config: Credentials | BikeTagConfiguration
config: Credentials | BikeTagConfiguration | PartialBikeTagConfiguration,
overwrite = true
): BikeTagConfiguration {
config = assignBikeTagConfiguration(config as BikeTagConfiguration)
const parsedConfig = assignBikeTagConfiguration(
config as BikeTagConfiguration
)

this.biketagConfig = (config as BikeTagConfiguration).biketag
this.imgurConfig = (config as BikeTagConfiguration).imgur
this.sanityConfig = (config as BikeTagConfiguration).sanity
this.redditConfig = (config as BikeTagConfiguration).reddit
let biketagConfig = (parsedConfig as BikeTagConfiguration).biketag
let imgurConfig = (parsedConfig as BikeTagConfiguration).imgur
let sanityConfig = (parsedConfig as BikeTagConfiguration).sanity
let redditConfig = (parsedConfig as BikeTagConfiguration).reddit

if (!overwrite) {
biketagConfig = { ...this.biketagConfig, ...biketagConfig }
imgurConfig = { ...this.imgurConfig, ...imgurConfig }
sanityConfig = { ...this.sanityConfig, ...sanityConfig }
redditConfig = { ...this.redditConfig, ...redditConfig }
}

this.biketagConfig = biketagConfig
this.imgurConfig = imgurConfig
this.sanityConfig = sanityConfig
this.redditConfig = redditConfig

return this.getConfiguration()
}
Expand Down Expand Up @@ -270,6 +311,7 @@ export class BikeTagClient extends EventEmitter {
}
const { client, options, api, source } = this.getDefaultAPI(
onlyApplicableOpts,
{},
'game'
)

Expand Down Expand Up @@ -298,9 +340,10 @@ export class BikeTagClient extends EventEmitter {
// }

getTag(
payload: RequireAtLeastOne<getTagPayload> | number
payload: RequireAtLeastOne<getTagPayload> | number,
opts?: Credentials
): Promise<BikeTagApiResponse<TagData>> {
const { client, options, api, source } = this.getDefaultAPI(payload)
const { client, options, api, source } = this.getDefaultAPI(payload, opts)

return api.getTag(client, options).catch((e) => {
return {
Expand All @@ -314,9 +357,10 @@ export class BikeTagClient extends EventEmitter {
}

getTags(
payload?: getTagsPayload | number[]
): Promise<BikeTagApiResponse<TagData>> {
const { client, options, api, source } = this.getDefaultAPI(payload)
payload?: getTagsPayload | number[],
opts?: Credentials
): Promise<BikeTagApiResponse<TagData[]>> {
const { client, options, api, source } = this.getDefaultAPI(payload, opts)

return api.getTags(client, options).catch((e) => {
return {
Expand All @@ -330,9 +374,10 @@ export class BikeTagClient extends EventEmitter {
}

updateTag(
payload: RequireAtLeastOne<updateTagPayload> | updateTagPayload[]
payload: updateTagPayload | updateTagPayload[],
opts?: Credentials
): Promise<BikeTagApiResponse<boolean> | BikeTagApiResponse<boolean>[]> {
const { client, options, api, source } = this.getDefaultAPI(payload)
const { client, options, api, source } = this.getDefaultAPI(payload, opts)

return api.updateTag(client, options).catch((e) => {
return Promise.resolve({
Expand All @@ -345,11 +390,22 @@ export class BikeTagClient extends EventEmitter {
})
}

// upload(
// payload: string | string[] | Payload | Payload[]
// ): Promise<BikeTagApiResponse<TagData> | BikeTagApiResponse<TagData>[]> {
// return upload(this, payload)
// }
uploadTagImage(
payload: uploadTagImagePayload | uploadTagImagePayload[],
opts?: Credentials
): Promise<BikeTagApiResponse<any | any[]>> {
const { client, options, api, source } = this.getDefaultAPI(payload, opts)

return api.uploadTagImage(client, options).catch((e) => {
return Promise.resolve({
status: 500,
data: null,
error: e,
success: false,
source,
})
})
}

// getBikeTag(
// payload: UpdateImagePayload | UpdateImagePayload[]
Expand Down
15 changes: 13 additions & 2 deletions src/common/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,34 @@ import { TagData, GameData } from './types'
export const createTag = (tagData: any = {}): TagData => {
return {
tagnumber: tagData.tagnumber ?? 'latest',
mysteryImage: tagData.mysteryImage ?? '',
mysteryImage: tagData.mysteryImage,
mysteryImageUrl: tagData.mysteryImageUrl ?? '',
game: tagData.game ?? '',
slug: tagData.slug ?? '',
name: tagData.name ?? '',
player: tagData.player ?? '',
hint: tagData.hint ?? '',
discussionUrl: tagData.discussionUrl ?? '',
foundLocation: tagData.foundLocation ?? '',
gps: tagData.gps ?? '',
foundImage: tagData.foundImage ?? '',
foundImage: tagData.foundImage,
foundImageUrl: tagData.foundImageUrl ?? '',
_id: tagData._id,
_type: tagData._type,
} as TagData
}

export const tagDataFields = Object.keys(createTag())

export const tagDataReferenceFields = ['game', 'player']

export const tagDataAssetFields = ['foundImage', 'mysteryImage']

export const tagDataObjectFields = {
foundImage: 'asset->_ref',
mysteryImage: 'asset->_ref',
}

export const createGame = (gameData: any = {}): GameData => {
return {
name: gameData.name ?? '',
Expand Down
Loading

0 comments on commit dc220c6

Please sign in to comment.