import {isNotEmpty} from '_referers/common'; import {http} from '../infrastructure/Http'; type Filter = { field: keyof T; search: string; }; type Sort = { field: keyof T; order: 'ASC' | 'DECS'; }; type RequestEntities = { filters?: Filter[]; sort?: Sort; limit?: number; offset?: number; }; type EntityWithId = T & { id: string; }; type ResponseEntities = { data: EntityWithId[]; count: number; total: number; page: number; pageCount: number; }; type BulkCreateRequest = { bulk: T[]; }; export class CrudAPI { endpoint: string; constructor(endpoint: string) { this.endpoint = endpoint; } request = (options?: RequestEntities): Promise> => { const {filters, sort, limit = 50, offset = 0} = options ?? {}; const query = []; filters?.forEach(({field, search}) => { query.push(`filter=${field}||$eq||${search}`); }); if (sort) { query.push(`sort=${sort.field},${sort.order}`); } query.push(`limit=${limit}`); query.push(`offset=${offset}`); return http.get>([this.endpoint, query.join('&')].filter(isNotEmpty).join('?')); } find = (id: string): Promise => { return http.get(`${this.endpoint}/${id}`); } create = (entity: T): Promise> => { return http.post>(this.endpoint, undefined, entity); } update = (id: string, entity: T): Promise> => { return http.patch>(`${this.endpoint}/${id}`, undefined, entity); } replace = (id: string, entity: T): Promise> => { return http.put>(`${this.endpoint}/${id}`, undefined, entity); } remove = (id: string): Promise => { return http.delete(`${this.endpoint}/${id}`); } bulkCreate = (entities: T[]): Promise[]> => { return http.post, EntityWithId[]>(`${this.endpoint}/bulk`, undefined, { bulk: entities, }); } }