@furystack/rest-service
Version:
Repository implementation for FuryStack
40 lines (38 loc) • 1.51 kB
text/typescript
import type { Constructable } from '@furystack/inject'
import type { PostEndpoint } from '@furystack/rest'
import { RequestError } from '@furystack/rest'
import '@furystack/repository'
import type { RequestAction } from '../request-action-implementation.js'
import { JsonResult } from '../request-action-implementation.js'
import type { WithOptionalId } from '@furystack/core'
import { getRepository } from '@furystack/repository'
import { readPostBody } from '../read-post-body.js'
/**
* Creates a POST endpoint for updating entities
* @param options The options for endpoint creation
* @param options.model The Model class
* @param options.primaryKey The field name used as primary key
* @returns a boolean that indicates the success
*/
export const createPostEndpoint = <
T extends object,
TPrimaryKey extends keyof T,
TWritableData = WithOptionalId<T, TPrimaryKey>,
>(options: {
model: Constructable<T>
primaryKey: TPrimaryKey
}) => {
const endpoint: RequestAction<PostEndpoint<T, TPrimaryKey, TWritableData>> = async ({ injector, request }) => {
const dataSet = getRepository(injector).getDataSetFor<T, TPrimaryKey, TWritableData>(
options.model,
options.primaryKey,
)
const entityToCreate = await readPostBody<TWritableData>(request)
const { created } = await dataSet.add(injector, entityToCreate)
if (!created || !created.length) {
throw new RequestError('Entity not found', 404)
}
return JsonResult(created[0], 201)
}
return endpoint
}