Files
cms.fellies.org/docs/product-engineering/crud-examples.md

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

  1. Add entity schemas in @cms/content
  2. Add repository + service in @cms/db
  3. Add unit tests for contract + validation
  4. Wire route/action permission checks before mutations
  5. Add docs links and TODO updates