Claude-skill-registry api-endpoint
Create or modify API endpoints in IdeaForge backend. Triggers: new route, controller, service, repository, CRUD operation, Zod validation, API debugging. Pattern: Routes → Controller → Service → Repository.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/api-endpoint" ~/.claude/skills/majiayu000-claude-skill-registry-api-endpoint && rm -rf "$T"
manifest:
skills/data/api-endpoint/SKILL.mdsource content
API Endpoints
Architecture
Route (backend/src/api/routes/) → DI setup + routing Controller (backend/src/api/controllers/) → Zod validation + ApiResponse Service (backend/src/services/) → Business logic Repository (backend/src/repositories/) → Database queries
Quick Start
1. Route (routes/{resource}.ts
)
routes/{resource}.tsimport { Router } from 'express'; const router = Router(); // Manual DI const repo = new MyRepository(); const service = new MyService(repo); const controller = new MyController(service); router.get('/', (req, res, next) => controller.getAll(req, res, next)); router.post('/', (req, res, next) => controller.create(req, res, next)); export default router;
2. Controller (controllers/{resource}Controller.ts
)
controllers/{resource}Controller.tsconst CreateSchema = z.object({ name: z.string().min(1).max(255), }); export class MyController { constructor(private service: MyService) {} async create(req: Request, res: Response, next: NextFunction) { try { const data = CreateSchema.parse(req.body); const result = await this.service.create(data); res.json({ success: true, data: result } as ApiResponse<typeof result>); } catch (error) { next(error); } } }
3. Register (index.ts
)
index.tsimport myRouter from './api/routes/my'; app.use('/api/my-resource', myRouter);
Response Format
// Success { success: true, data: { ... } } // Error (via errorHandler middleware) { success: false, error: { message: "...", code: "ERROR_CODE" } }
Rules
- Controllers: validation + response only
- Services: all business logic
- Always use
wrapperApiResponse<T> - Always
- never catch and formatnext(error) - Zod for all input validation
- Manual DI in route files