# API Feature

> Implement or review an end-to-end gocron HTTP API change. Use when adding or changing Gin routes, handlers, request or response payloads, authorization, audit behavior, frontend API clients, API types, OpenAPI-style documentation, or API tests.

- Skill: `gocronx-team/api-feature` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add gocronx-team/api-feature`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gocronx-team/api-feature/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: gocronx-team (https://skillmd.com/u/gocronx-team)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/gocronx-team/api-feature

---


# Build a gocron API feature

Keep the route, authorization rule, handler, frontend client, types,
translations, documentation, and tests as one change.

## Compatibility invariants

- When the contract changes, preserve both deployment orders: an `N`
  frontend/client must tolerate an `N-1` backend, and an `N` backend must serve
  `N-1` frontends/clients.
- Keep routes, methods, accepted requests, response fields and types, status
  codes, pagination, and SSE event contracts stable. New response fields must
  be optional; new request fields must have compatible defaults.
- Detect new server capabilities before depending on them. If `N-1` lacks an
  endpoint, field, or stream behavior, retain a safe legacy path or hide it.
- Never repurpose an existing field or error code. Breaking contracts require
  explicit approval, a major version, and migration/rollout/rollback plans.

## Performance invariants

- Bound every collection response and expensive input. Require pagination,
  maximum page sizes, upload/body limits, and bounded filters where applicable.
- Prevent N+1 queries and per-row remote calls. Capture query counts for list
  endpoints and inspect query plans for new filters, sorting, or joins.
- For polling and SSE, bound connection/resource use, clean up on disconnect,
  avoid per-client database polling where sharing is safe, and apply
  backpressure or a documented drop/coalescing policy.
- Do not return or retain unbounded task output/logs. Use paging, cursors,
  bounded chunks, or streaming with cancellation.
- Benchmark materially affected high-traffic or high-volume endpoints with
  representative data and report applicable metrics.

## Trace the existing path

- Inspect neighboring registrations in `internal/routers/routers.go`, handlers
  under `internal/routers`, models/services called by the handler, and the
  matching frontend module under `web/gocronx-admin/src/api`.
- Identify every middleware applied to the route group. Classify the endpoint
  as public, authenticated, admin-only, API-token accessible, or agent-facing.
- Search path allowlists and permission maps before adding a route. Never make
  an endpoint public merely to make a request succeed.
- Preserve the response conventions in `internal/routers/base`. Do not expose
  raw database, filesystem, command, provider, or secret errors to clients.

## Implement the complete contract

- Use the appropriate HTTP method. Mutating operations must not use `GET`.
- Bind into an explicit request type, validate required fields and bounds, and
  reject unknown or dangerous input where the existing API pattern permits.
- Enforce authorization server-side before loading or mutating protected data.
  For resource ids, verify access to the resource rather than only validating
  that the caller is logged in.
- Use transactions for multi-write operations. Add an audit event for
  security-sensitive or administrative mutations following existing patterns.
- Update the frontend API wrapper and `src/types/api/api.d.ts` when the UI uses
  the endpoint. Keep backend and frontend field names/types aligned.
- Add both Chinese and English strings when user-visible text changes:
  backend `internal/modules/i18n/{zh_cn,en_us}.go`, frontend
  `src/locales/langs/{zh,en}.json`.
- Update `docs/zh/guide/api.md` for a public API contract. Include auth,
  parameters, example response, error behavior, and compatibility impact.

## Test risk, not just success

Add focused tests for:

- valid requests and stable response shape;
- missing, malformed, boundary, and nonexistent-resource input;
- unauthenticated and unauthorized callers;
- ownership or tenant boundary where applicable;
- duplicate submissions or retry behavior for mutations;
- secret/error redaction for sensitive endpoints.
- `N-1` requests/responses and both frontend/backend deployment orders when
  the feature crosses that boundary.

Run the changed router package with race detection, then relevant service/model
tests. Run frontend type checking when the contract is consumed by the UI.
Finally invoke `$verify` before committing.

Report the route and method, authorization class, contract changes, backward
compatibility, tests added, performance evidence when relevant, and any
documentation or i18n files intentionally left unchanged.

