hensei-web/utils/api.tsx
Justin Edmund c9014913db Add api call for raidGroups and update pages
Pages fetch raids and store them in the app state. We needed to update this to pull raid groups instead
2023-06-05 20:18:17 -07:00

190 lines
6.1 KiB
TypeScript

import axios, { Axios, AxiosRequestConfig, AxiosResponse } from "axios"
interface Entity {
name: string
}
// prettier-ignore
type CollectionEndpoint = (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 PostEndpoint = (object: {}, headers?: {}) => Promise<AxiosResponse<any>>
type PutEndpoint = (id: string, object: {}, headers?: {}) => Promise<AxiosResponse<any>>
type DestroyEndpoint = ({ id, params }: { id: string, params?: {} }) => Promise<AxiosResponse<any>>
interface EndpointMap {
getAll: CollectionEndpoint
getOne: IdEndpoint
getOneWithObject: IdWithObjectEndpoint
create: PostEndpoint
update: PutEndpoint
destroy: DestroyEndpoint
}
class Api {
url: string
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}`
return {
getAll: (params?: {}) => axios.get(resourceUrl, params),
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),
update: (id: string, object: {}, headers?: {}) => axios.put(`${resourceUrl}/${id}`, object, headers),
destroy: ({ id, params }: { id: string, params?: {} }) => axios.delete(`${resourceUrl}/${id}`, params)
} as EndpointMap
}
login(object: {}) {
const oauthUrl = process.env.NEXT_PUBLIC_SIERO_OAUTH_URL || 'https://localhost:3000/oauth'
return axios.post(`${ oauthUrl }/token`, object)
}
search({ object, query, job, filters, locale = "en", page = 0 }:
{ object: string, query: string, job?: string, filters?: { [key: string]: number[] }, locale?: string, page?: number }) {
const resourceUrl = `${this.url}/${name}`
return axios.post(`${resourceUrl}search/${object}`, {
search: {
query: query,
filters: filters,
job: job,
locale: locale,
page: page
}
})
}
check(resource: string, value: string) {
const resourceUrl = `${this.url}/check/${resource}`
return axios.post(resourceUrl, {
[resource]: value
})
}
resolveConflict({ object, incoming, conflicting, position, params }: {
object: 'characters' | 'weapons'
incoming: string
conflicting: string[]
position: number,
params?: {}
}) {
const body = {
resolve: {
incoming: incoming,
conflicting: conflicting,
position: position,
},
}
const resourceUrl = `${this.url}/${object}/resolve`
return axios.post(resourceUrl, body, { headers: params })
}
updateJob({ partyId, params }: { partyId: string, params?: {} }) {
const resourceUrl = `${this.url}/parties/${partyId}/jobs`
return axios.put(resourceUrl, params)
}
updateJobSkills({ partyId, params }: { partyId: string, params?: {} }) {
const resourceUrl = `${this.url}/parties/${partyId}/job_skills`
return axios.put(resourceUrl, params)
}
allJobSkills(params?: {}) {
const resourceUrl = `${this.url}/jobs/skills`
return axios.get(resourceUrl, params)
}
jobSkillsForJob(jobId: string, params?: {}) {
const resourceUrl = `${this.url}/jobs/${jobId}/skills`
return axios.get(resourceUrl, params)
}
jobAccessoriesForJob(jobId: string, params?: {}) {
const resourceUrl = `${this.url}/jobs/${jobId}/accessories`
return axios.get(resourceUrl, params)
}
raidGroups(params?: {}) {
const resourceUrl = `${this.url}/raids/groups`
return axios.get(resourceUrl, params)
}
remix({ shortcode, body, params}: { shortcode: string, body?: {}, params?: {} }) {
const resourceUrl = `${this.url}/parties/${shortcode}/remix`
return axios.post(resourceUrl, body, 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,
transcendence_step: 0
}
})
}
userInfo(id: string) {
const resourceUrl = `${this.url}/users/info/${id}`
return axios.get(resourceUrl)
}
version() {
const resourceUrl = `${this.url}/version`
return axios.get(resourceUrl)
}
}
const api: Api = new Api({ url: process.env.NEXT_PUBLIC_SIERO_API_URL || 'https://localhost:3000/api/v1'})
api.createEntity({ name: 'users' })
api.createEntity({ name: 'parties' })
api.createEntity({ name: 'characters' })
api.createEntity({ name: 'weapons' })
api.createEntity({ name: 'summons' })
api.createEntity({ name: 'grid_characters' })
api.createEntity({ name: 'grid_weapons' })
api.createEntity({ name: 'grid_summons' })
api.createEntity({ name: 'characters' })
api.createEntity({ name: 'weapons' })
api.createEntity({ name: 'summons' })
api.createEntity({ name: 'jobs' })
api.createEntity({ name: 'raids' })
api.createEntity({ name: 'weapon_keys' })
api.createEntity({ name: 'favorites' })
export default api