Add endpoint for resolving character conflicts

This commit is contained in:
Justin Edmund 2022-11-19 06:36:36 -08:00
parent 4d8a7d4007
commit 3e0529a46d

View file

@ -1,9 +1,10 @@
import axios, { Axios, AxiosRequestConfig, AxiosResponse } from "axios" import axios, { Axios, AxiosRequestConfig, AxiosResponse } from "axios"
interface Entity { interface Entity {
name: string name: string
} }
// prettier-ignore
type CollectionEndpoint = (params?: {}) => Promise<AxiosResponse<any>> type CollectionEndpoint = (params?: {}) => Promise<AxiosResponse<any>>
type IdEndpoint = ({ id, params }: { id: string, params?: {} }) => Promise<AxiosResponse<any>> type IdEndpoint = ({ id, params }: { id: string, params?: {} }) => Promise<AxiosResponse<any>>
type IdWithObjectEndpoint = ({ id, object, params }: { id: string, object: string, params?: {} }) => Promise<AxiosResponse<any>> type IdWithObjectEndpoint = ({ id, object, params }: { id: string, object: string, params?: {} }) => Promise<AxiosResponse<any>>
@ -12,101 +13,117 @@ type PutEndpoint = (id: string, object: {}, headers?: {}) => Promise<AxiosRespo
type DestroyEndpoint = ({ id, params }: { id: string, params?: {} }) => Promise<AxiosResponse<any>> type DestroyEndpoint = ({ id, params }: { id: string, params?: {} }) => Promise<AxiosResponse<any>>
interface EndpointMap { interface EndpointMap {
getAll: CollectionEndpoint getAll: CollectionEndpoint
getOne: IdEndpoint getOne: IdEndpoint
getOneWithObject: IdWithObjectEndpoint getOneWithObject: IdWithObjectEndpoint
create: PostEndpoint create: PostEndpoint
update: PutEndpoint update: PutEndpoint
destroy: DestroyEndpoint destroy: DestroyEndpoint
} }
class Api { class Api {
url: string url: string
endpoints: { [key: string]: EndpointMap } endpoints: { [key: string]: EndpointMap }
constructor({url}: {url: string}) {
this.url = url
this.endpoints = {}
}
createEntity(entity: Entity) {
this.endpoints[entity.name] = this.createEndpoints(entity)
}
createEntities(entities: Entity[]) {
entities.forEach(this.createEntity.bind(this))
}
createEndpoints({name}: {name: string}) {
const resourceUrl = `${this.url}/${name}`
constructor({url}: {url: string}) { return {
this.url = url getAll: (params?: {}) => axios.get(resourceUrl, params),
this.endpoints = {} getOne: ({ id, params }: { id: string, params?: {} }) => axios.get(`${resourceUrl}/${id}/`, params),
} getOneWithObject: ({ id, object, params }: { id: string, object: string, params?: {} }) => axios.get(`${resourceUrl}/${id}/${object}`, params),
create: (object: {}, headers?: {}) => axios.post(resourceUrl, object, headers),
createEntity(entity: Entity) { update: (id: string, object: {}, headers?: {}) => axios.put(`${resourceUrl}/${id}`, object, headers),
this.endpoints[entity.name] = this.createEndpoints(entity) destroy: ({ id, params }: { id: string, params?: {} }) => axios.delete(`${resourceUrl}/${id}`, params)
} } as EndpointMap
}
createEntities(entities: Entity[]) {
entities.forEach(this.createEntity.bind(this)) login(object: {}) {
} const oauthUrl = process.env.NEXT_PUBLIC_SIERO_OAUTH_URL || 'https://localhost:3000/oauth'
return axios.post(`${ oauthUrl }/token`, object)
createEndpoints({name}: {name: string}) { }
const resourceUrl = `${this.url}/${name}`
search({ object, query, filters, locale = "en", page = 0 }:
return { { object: string, query: string, filters?: { [key: string]: number[] }, locale?: string, page?: number }) {
getAll: (params?: {}) => axios.get(resourceUrl, params), const resourceUrl = `${this.url}/${name}`
getOne: ({ id, params }: { id: string, params?: {} }) => axios.get(`${resourceUrl}/${id}/`, params), return axios.post(`${resourceUrl}search/${object}`, {
getOneWithObject: ({ id, object, params }: { id: string, object: string, params?: {} }) => axios.get(`${resourceUrl}/${id}/${object}`, params), search: {
create: (object: {}, headers?: {}) => axios.post(resourceUrl, object, headers), query: query,
update: (id: string, object: {}, headers?: {}) => axios.put(`${resourceUrl}/${id}`, object, headers), filters: filters,
destroy: ({ id, params }: { id: string, params?: {} }) => axios.delete(`${resourceUrl}/${id}`, params) locale: locale,
} as EndpointMap page: page
} }
})
login(object: {}) { }
const oauthUrl = process.env.NEXT_PUBLIC_SIERO_OAUTH_URL || 'https://localhost:3000/oauth'
return axios.post(`${ oauthUrl }/token`, object) check(resource: string, value: string) {
} const resourceUrl = `${this.url}/check/${resource}`
return axios.post(resourceUrl, {
search({ object, query, filters, locale = "en", page = 0 }: [resource]: value
{ object: string, query: string, filters?: { [key: string]: number[] }, locale?: string, page?: number }) { })
const resourceUrl = `${this.url}/${name}` }
return axios.post(`${resourceUrl}search/${object}`, {
search: { resolveCharacterConflict({ incoming, conflicting, position, params }: {
query: query, incoming: string
filters: filters, conflicting: string[]
locale: locale, position: number,
page: page params?: {}
} }) {
}) const body = {
} resolve: {
incoming: incoming,
check(resource: string, value: string) { conflicting: conflicting,
const resourceUrl = `${this.url}/check/${resource}` position: position,
return axios.post(resourceUrl, { },
[resource]: value
})
}
savedTeams(params: {}) {
const resourceUrl = `${this.url}/parties/favorites`
return axios.get(resourceUrl, params)
}
saveTeam({ id, params }: { id: string, params?: {} }) {
const body = { favorite: { party_id: id } }
const resourceUrl = `${this.url}/favorites`
return axios.post(resourceUrl, body, { headers: params })
}
unsaveTeam({ id, params }: { id: string, params?: {} }) {
const body = { favorite: { party_id: id } }
const resourceUrl = `${this.url}/favorites`
return axios.delete(resourceUrl, { data: body, headers: params })
}
updateUncap(resource: 'character'|'weapon'|'summon', id: string, value: number) {
const pluralized = resource + 's'
const resourceUrl = `${this.url}/${pluralized}/update_uncap`
return axios.post(resourceUrl, {
[resource]: {
id: id,
uncap_level: value
}
})
}
userInfo(id: string) {
const resourceUrl = `${this.url}/users/info/${id}`
return axios.get(resourceUrl)
} }
const resourceUrl = `${this.url}/characters/resolve`
return axios.post(resourceUrl, body, { headers: params })
}
savedTeams(params: {}) {
const resourceUrl = `${this.url}/parties/favorites`
return axios.get(resourceUrl, params)
}
saveTeam({ id, params }: { id: string, params?: {} }) {
const body = { favorite: { party_id: id } }
const resourceUrl = `${this.url}/favorites`
return axios.post(resourceUrl, body, { headers: params })
}
unsaveTeam({ id, params }: { id: string, params?: {} }) {
const body = { favorite: { party_id: id } }
const resourceUrl = `${this.url}/favorites`
return axios.delete(resourceUrl, { data: body, headers: params })
}
updateUncap(resource: 'character'|'weapon'|'summon', id: string, value: number) {
const pluralized = resource + 's'
const resourceUrl = `${this.url}/${pluralized}/update_uncap`
return axios.post(resourceUrl, {
[resource]: {
id: id,
uncap_level: value
}
})
}
userInfo(id: string) {
const resourceUrl = `${this.url}/users/info/${id}`
return axios.get(resourceUrl)
}
} }
const api: Api = new Api({ url: process.env.NEXT_PUBLIC_SIERO_API_URL || 'https://localhost:3000/api/v1'}) const api: Api = new Api({ url: process.env.NEXT_PUBLIC_SIERO_API_URL || 'https://localhost:3000/api/v1'})
@ -121,4 +138,4 @@ api.createEntity( { name: 'raids' })
api.createEntity( { name: 'weapon_keys' }) api.createEntity( { name: 'weapon_keys' })
api.createEntity( { name: 'favorites' }) api.createEntity( { name: 'favorites' })
export default api export default api