Skip to content
cccskills
FreePublished on GitHub

backend-api-design

Design RPC-style APIs with layered architecture (Controller → Manager → Repository). Use when creating new API endpoints, designing API contracts, or reviewing API patterns.

The English summary is being prepared. Showing the original description.

See how to install

Files included (2)

  • SKILL.md3.2 KB
  • code-patterns.md2.9 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Backend API Design — Quick Reference

URL Patterns

GET  /api/v1/employees              # List (plural)
GET  /api/v1/employee               # Get one (?id=xxx)
POST /api/v1/employee               # Create
POST /api/v1/employee/update        # Update (?id=xxx)
POST /api/v1/employee/delete        # Soft delete (?id=xxx)
POST /api/v1/employee/restore       # Restore (?id=xxx)
POST /api/v1/sync/employees         # Action

Hard Rules

  • NO path params — always @QueryValue, never @PathVariable
  • Singular for single resource — /employee not /employees/{id}
  • Plural for collections — /employees
  • Verb sub-paths for actions — /delete, /restore, /sync

Layered Architecture

Controller  →  thin, just delegates
    ↓
Manager     →  business logic, transactions, Either returns
    ↓
Repository  →  data access only, no business logic

Controller: Thin Wrapper

  • Parse query params with defaults
  • Delegate to manager
  • Unwrap Either with .throwOrValue()
  • NO business logic, NO repository access

Manager: Business Logic

  • Returns Either<ClientException, T>
  • Wraps DB ops in transaction(db.primary) { }
  • Orchestrates multiple repositories
  • Validates business rules

Repository: Data Access

  • Returns entities or null
  • db.replica for reads, db.primary for writes
  • Always checks deletedAt.isNull()

Quick Code Reference

The core controller delegation pattern:

@Get("/employee")
suspend fun getEmployee(@QueryValue id: UUID): EmployeeResponse {
  return employeeManager.findById(id).throwOrValue()
}
  • Response models — companion object { fun from(entity) } in module-client/response/{domain}/
  • Pagination — offset-based, manager returns EmployeeListResponse with items, total, page, limit, hasMore
  • Errors — return ClientError.NOT_FOUND.asException().left() from managers, never throw
  • Factory beans — @Factory class with @Singleton method, wire repos + db into manager

See code-patterns.md for complete controller, response model, pagination, error handling, and factory bean templates.

Gotchas

  • Multi-word @QueryValue params MUST have explicit snake_case names. The frontend axios interceptor sends project_id but Micronaut matches the literal param name. Write @QueryValue("project_id") projectId: UUID, not bare @QueryValue projectId: UUID.
  • Don't use @Put, @Delete, or @Patch. This is RPC-style — all mutations are @Post. The only @Get is for reads.
  • Controllers that inject repositories are a code smell. If you see private val fooRepository: FooRepository in a controller, move it to the manager.
  • andWhere {} not second .where {}. Calling .where {} twice replaces the first condition. Use .andWhere {} to chain.
  • Don't forget @ExecuteOn(TaskExecutors.IO). Without it, suspend functions may hang or run on the wrong thread pool. Every controller needs it.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Creates RPC-style endpoint following layered architecture (Controller → Manager → Repository). Use when creating new API endpoints or CRUD operations.

The English summary is being prepared. Showing the original description.

c0x12c/ai-toolkit108Updated Jun 18, 2026

Write blog posts, guides, tutorials, and long-form content. Sounds like a real person, not AI. Use when the user wants polished written content.

The English summary is being prepared. Showing the original description.

c0x12c/ai-toolkit108Updated Jun 18, 2026

Run a structured brainstorm session for startup ideas. Takes a theme or problem and generates ideas with quick gut-checks. Use when the user wants to explore a space or generate new ideas.

The English summary is being prepared. Showing the original description.

c0x12c/ai-toolkit108Updated Jun 18, 2026

Run real browser QA with Playwright. Use when testing a frontend feature, verifying UI before PR, smoke testing after deploy, or investigating reported visual bugs.

The English summary is being prepared. Showing the original description.

c0x12c/ai-toolkit108Updated Jun 18, 2026

CI/CD pipeline patterns for GitHub Actions, PR automation, and deployment workflows. Use when setting up CI, fixing broken pipelines, automating PR checks, or configuring deployment.

The English summary is being prepared. Showing the original description.

c0x12c/ai-toolkit108Updated Jun 18, 2026

Deep competitor analysis. Tear apart a specific competitor or compare multiple competitors. Use when the user names a competitor or asks "who else is doing this?"

The English summary is being prepared. Showing the original description.

c0x12c/ai-toolkit108Updated Jun 18, 2026

See all skills by c0x12c

Report a problem with this skill