@furystack/rest-service
Version:
Repository implementation for FuryStack
29 lines (26 loc) • 1.28 kB
text/typescript
import type { Constructable } from '@furystack/inject'
import type { GetCollectionEndpoint } from '@furystack/rest'
import type { RequestAction } from '../request-action-implementation.js'
import { JsonResult } from '../request-action-implementation.js'
import { getRepository } from '@furystack/repository'
/**
* Creates a GetCollection endpoint for the given model. The model should have a Repository DataSet
* @param options The options for endpoint creation
* @param options.model The Model class
* @param options.primaryKey The field used as primary key on the model
* @returns The created endpoint
*/
export const createGetCollectionEndpoint = <T, TPrimaryKey extends keyof T>(options: {
model: Constructable<T>
primaryKey: TPrimaryKey
}) => {
const endpoint: RequestAction<GetCollectionEndpoint<T>> = async ({ injector, getQuery }) => {
const { findOptions } = getQuery()
const dataSet = getRepository(injector).getDataSetFor(options.model, options.primaryKey)
const entriesPromise = dataSet.find<any>(injector, findOptions || {})
const countPromise = dataSet.count(injector, findOptions?.filter)
const [entries, count] = await Promise.all([entriesPromise, countPromise])
return JsonResult({ entries, count })
}
return endpoint
}