import type { DB } from "core"; import type { EntityData, RepoQuery, RepoQueryIn, RepositoryResponse } from "data"; import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType } from "modules"; export type DataApiOptions = BaseModuleApiOptions & { queryLengthLimit: number; defaultQuery: Partial; }; export class DataApi extends ModuleApi { protected override getDefaultOptions(): Partial { return { basepath: "/api/data", queryLengthLimit: 1000, defaultQuery: { limit: 10 } }; } readOne( entity: E, id: PrimaryFieldType, query: Omit = {} ) { return this.get, "meta" | "data">>([entity as any, id], query); } readMany( entity: E, query: RepoQueryIn = {} ) { type T = Pick, "meta" | "data">; const input = query ?? this.options.defaultQuery; const req = this.get([entity as any], input); if (req.request.url.length <= this.options.queryLengthLimit) { return req; } return this.post([entity as any, "query"], input); } readManyByReference< E extends keyof DB | string, R extends keyof DB | string, Data = R extends keyof DB ? DB[R] : EntityData >(entity: E, id: PrimaryFieldType, reference: R, query: RepoQueryIn = {}) { return this.get, "meta" | "data">>( [entity as any, id, reference], query ?? this.options.defaultQuery ); } createOne( entity: E, input: Omit ) { return this.post>([entity as any], input); } updateOne( entity: E, id: PrimaryFieldType, input: Partial> ) { return this.patch>([entity as any, id], input); } deleteOne( entity: E, id: PrimaryFieldType ) { return this.delete>([entity as any, id]); } count(entity: E, where: RepoQuery["where"] = {}) { return this.post>( [entity as any, "fn", "count"], where ); } }