mirror of
https://github.com/Paris-est-Ludique/intranet.git
synced 2025-06-10 01:24:20 +02:00
227 lines
6.7 KiB
TypeScript
227 lines
6.7 KiB
TypeScript
import axios from "axios"
|
|
import _ from "lodash"
|
|
|
|
import config from "../config"
|
|
import { axiosConfig } from "./auth"
|
|
|
|
export type ElementWithId = unknown & { id: number }
|
|
|
|
export type ElementTranslation<Element> = { [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<ElementGetResponse> => {
|
|
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<ElementListGetResponse> => {
|
|
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<ElementListGetResponse> => {
|
|
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<ElementGetResponse> => {
|
|
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<ElementGetResponse> => {
|
|
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<ElementCountGetResponse> => {
|
|
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<InputElements extends Array<any>>(
|
|
apiName: string
|
|
): (...params: InputElements) => Promise<{
|
|
data?: any
|
|
error?: Error
|
|
}> {
|
|
interface ElementGetResponse {
|
|
data?: any
|
|
error?: Error
|
|
}
|
|
return async (...params: InputElements): Promise<ElementGetResponse> => {
|
|
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<InputElements extends Array<any>>(
|
|
apiName: string
|
|
): (
|
|
jwt: string,
|
|
...params: InputElements
|
|
) => Promise<{
|
|
data?: any
|
|
error?: Error
|
|
}> {
|
|
interface ElementGetResponse {
|
|
data?: any
|
|
error?: Error
|
|
}
|
|
return async (jwt: string, ...params: InputElements): Promise<ElementGetResponse> => {
|
|
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 }
|
|
}
|
|
}
|
|
}
|
|
}
|