import axios from "axios" import _ from "lodash" import config from "../config" import { axiosConfig } from "./auth" export type ElementWithId = unknown & { id: number } export type ElementTranslation = { [k in keyof Element]: string } export default class ServiceAccessors< // eslint-disable-next-line @typescript-eslint/ban-types ElementNoId extends object, Element extends ElementNoId & ElementWithId > { // eslint-disable-next-line no-useless-constructor constructor(readonly elementName: string) {} get(): (id: number) => Promise<{ data?: Element error?: Error }> { interface ElementGetResponse { data?: Element error?: Error } return async (id: number): Promise => { try { const { data } = await axios.get(`${config.API_URL}/${this.elementName}Get`, { ...axiosConfig, params: { id }, }) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } listGet(): () => Promise<{ data?: Element[] error?: Error }> { interface ElementListGetResponse { data?: Element[] error?: Error } return async (): Promise => { try { const { data } = await axios.get( `${config.API_URL}/${this.elementName}ListGet`, axiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } secureListGet(): (jwt: string) => Promise<{ data?: Element[] error?: Error }> { interface ElementListGetResponse { data?: Element[] error?: Error } return async (jwt: string): Promise => { try { const auth = { headers: { Authorization: `Bearer ${jwt}` } } const fullAxiosConfig = _.defaultsDeep(auth, axiosConfig) const { data } = await axios.get( `${config.API_URL}/${this.elementName}ListGet`, fullAxiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } // eslint-disable-next-line @typescript-eslint/ban-types add(): (volunteerWithoutId: ElementNoId) => Promise<{ data?: Element error?: Error }> { interface ElementGetResponse { data?: Element error?: Error } return async (volunteerWithoutId: ElementNoId): Promise => { try { const { data } = await axios.post( `${config.API_URL}/${this.elementName}Add`, volunteerWithoutId, axiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } set(): (volunteer: Element) => Promise<{ data?: Element error?: Error }> { interface ElementGetResponse { data?: Element error?: Error } return async (volunteer: Element): Promise => { try { const { data } = await axios.post( `${config.API_URL}/${this.elementName}Set`, volunteer, axiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } countGet(): () => Promise<{ data?: number error?: Error }> { interface ElementCountGetResponse { data?: number error?: Error } return async (): Promise => { try { const { data } = await axios.get( `${config.API_URL}/${this.elementName}CountGet`, axiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } customPost>( apiName: string ): (...params: InputElements) => Promise<{ data?: any error?: Error }> { interface ElementGetResponse { data?: any error?: Error } return async (...params: InputElements): Promise => { try { const { data } = await axios.post( `${config.API_URL}/${this.elementName}${apiName}`, params, axiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } securedCustomPost>( apiName: string ): ( jwt: string, ...params: InputElements ) => Promise<{ data?: any error?: Error }> { interface ElementGetResponse { data?: any error?: Error } return async (jwt: string, ...params: InputElements): Promise => { try { const auth = { headers: { Authorization: `Bearer ${jwt}` } } const fullAxiosConfig = _.defaultsDeep(auth, axiosConfig) const { data } = await axios.post( `${config.API_URL}/${this.elementName}${apiName}`, params, fullAxiosConfig ) if (data.error) { throw Error(data.error) } return { data } } catch (error) { return { error: error as Error } } } } }