import type { DB } from "core"; import type { EntityData, RepoQuery, RepositoryResponse } from "data"; import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType } from "modules"; export type DataApiOptions = BaseModuleApiOptions & { defaultQuery?: Partial; }; export class DataApi extends ModuleApi { protected override getDefaultOptions(): Partial { return { basepath: "/api/data", defaultQuery: { limit: 10 } }; } readOne( entity: E, id: PrimaryFieldType, query: Partial> = {} ) { return this.get, "meta" | "data">>([entity as any, id], query); } readMany( entity: E, query: Partial = {} ) { return this.get, "meta" | "data">>( [entity as any], query ?? this.options.defaultQuery ); } 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: Partial = {}) { 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 ); } }