1.8 KiB
1.8 KiB
CRUD Examples
Goal
Provide concrete implementation patterns for new entities adopting @cms/crud.
Example: Service Factory Wiring
import { createCrudService } from "@cms/crud"
import { createPageInputSchema, updatePageInputSchema } from "@cms/content"
const pageCrudService = createCrudService({
resource: "page",
repository: pageRepository,
schemas: {
create: createPageInputSchema,
update: updatePageInputSchema,
},
auditHooks: pageAuditHooks,
})
Example: Repository Contract
const pageRepository = {
list: () => db.page.findMany({ orderBy: { updatedAt: "desc" } }),
findById: (id: string) => db.page.findUnique({ where: { id } }),
create: (input: CreatePageInput) => db.page.create({ data: input }),
update: (id: string, input: UpdatePageInput) =>
db.page.update({
where: { id },
data: input,
}),
delete: (id: string) => db.page.delete({ where: { id } }),
}
Example: Action Usage
export async function createPage(input: unknown, context?: CrudMutationContext) {
return pageCrudService.create(input, context)
}
export async function updatePage(id: string, input: unknown, context?: CrudMutationContext) {
return pageCrudService.update(id, input, context)
}
export async function deletePage(id: string, context?: CrudMutationContext) {
return pageCrudService.delete(id, context)
}
Testing Expectations
- validation failure returns
CrudValidationError - missing IDs return
CrudNotFoundError - repository methods are called in expected order
- audit hooks receive
actor,metadata,before,after
Adoption Checklist
- Add entity schemas in
@cms/content - Add repository + service in
@cms/db - Add unit tests for contract + validation
- Wire route/action permission checks before mutations
- Add docs links and TODO updates