بنقرة واحدة
manage-api-admin
新增或修改 Cat 项目的管理端 API(`/api/admin/<context>/<action>`)。用于 `api_admin` 计划层、admin 列表/详情/写操作的后端实现。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
新增或修改 Cat 项目的管理端 API(`/api/admin/<context>/<action>`)。用于 `api_admin` 计划层、admin 列表/详情/写操作的后端实现。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
生成、解释和修改 Cat 项目的 `priv/config/catalog_schema.yaml`。当任务涉及 Catalog schema、Class / Property 定义、ClassProperty 绑定、Property.constraint、Class.subject_page_layout、claim_display、subject_explore_config,或需要为新领域生成可同步的 Catalog YAML 时使用。
解释、生成和修改 Cat 项目的 `priv/config/class_ingestors_schema.yaml`。当任务涉及 class ingestor 的概念、YAML 语法,或 `steam`、`wikidata` 的 provider 配置时使用。手动调用触发。
使用 Cat 项目的 `mix cat.api_admin` 命令完成管理端操作任务。用于读取 `openapi/admin_openapi.yaml` 查找管理端接口,并调用管理端 API 查询列表、查看详情或执行管理端写操作。手动调用触发。
Add and manage user-facing API endpoints in the Cat project using the CatApiSpec DSL. Use for the `api` plan layer, frontend/public APIs, schemas, generated request modules, and routes. For `/api/admin/...` endpoints use `manage-api-admin`.
创建和维护 Cat 项目的 PRD。用于按 domain 总览 + 粗粒度 feature 文档组织 docs/prds,包括 docs/prds/{domain}/overview.md、data_model.md、features/{feature_title}.md;也用于判断 feature 粒度、迁移旧版 aspect PRD,或生成可按 feature 复制到其他系统的产品规格。
Create, modify, or remove admin UI pages for the Cat project. Use when adding/editing/removing admin pages, admin list/detail views, admin management features, or when the user mentions admin UI, admin frontend, 管理端界面.
| name | manage-api-admin |
| description | 新增或修改 Cat 项目的管理端 API(`/api/admin/<context>/<action>`)。用于 `api_admin` 计划层、admin 列表/详情/写操作的后端实现。 |
管理端 API 路径前缀 /api/admin/,DSL tag 使用 Admin<Context>,生成的 Request 模块为 CatWeb.AdminCatalogRequest 这类命名。
本 skill 只负责管理端 API。面向用户/前端的 /api/<context>/<action> 接口使用 manage-api。
Task Progress:
- [ ] Step 1: DSL 定义(admin api + schema)
- [ ] Step 2: 注册模块与 Admin Tag(如果是新 context)
- [ ] Step 3: 生成产物(mix cat.gen.spec)
- [ ] Step 4: 添加 admin 路由(:admin_api pipeline)
- [ ] Step 5: 实现 admin 控制器 + JSON 渲染
- [ ] Step 6: 更新 docs/prds/{domain}/features/{feature}.md 的 `## api_admin`
在 lib/cat_api_spec/<context>.ex 中定义 admin API 和 schema。admin API 可以和前端 API 放在同一个 DSL 模块里,通过 /api/admin/... 路径和 Admin<Context> tag 区分。
DSL 语法可直接复用前台 API 的参考:manage-api/dsl-reference.md。
管理端列表响应 schema 同样优先使用分页宏:
{items, pagination} 结构优先使用 paginated_schema{items, cursor_pagination} 结构优先使用 cursor_paginated_schemafilters 等附加字段,继续在宏后追加 do ... enddefmodule CatApiSpec.Catalog do
use CatApiSpec.Schema
use CatApiSpec.Api
api "/api/admin/catalog/list_classes" do
method(:get)
operation(tags: ["AdminCatalog"], summary: "管理端列出类型", description: "管理端列出类型")
parameter(:page, :integer, :query, description: "页码")
parameter(:page_size, :integer, :query, description: "每页条目数")
response(200, "AdminListClassesResp")
end
paginated_schema "AdminListClassesResp", "AdminClassItem",
items: [description: "类型列表"] do
field :filters, :object, description: "筛选条件", nullable: true
end
end
约定:
/api/admin/<context>/<action>AdminCatalog、AdminPosts 等 Admin<Context> 格式CatWeb.Admin<Context>Request如果是新的 context 模块,需在 lib/cat_api_spec.ex 中注册:
alias CatApiSpec.NewContext@all_modules 列表lib/cat_api_spec.ex 当前有 build_spec(:all)、build_spec(:api)、build_spec(:admin) 三套独立的 tags 列表。新增 Admin Tag 时必须同步:
| API 类型 | build_spec(:all) | build_spec(:api) | build_spec(:admin) |
|---|---|---|---|
Admin API Tag(如 AdminNewContext) | 要加 | 不加 | 要加 |
前端 API Tag(如 NewContext) | 转 manage-api | 转 manage-api | 转 manage-api |
示例:
alias CatApiSpec.{Accounts, Catalog, Misc, Subjects, Rankings, NewContext}
@all_modules [Accounts, Catalog, Misc, Subjects, Rankings, NewContext]
def build_spec(:all) do
%OpenApi{
tags: [
# ...existing tags...
%Tag{name: "AdminNewContext", description: "管理端描述"}
]
}
end
def build_spec(:admin) do
%OpenApi{
tags: [
# ...existing tags...
%Tag{name: "AdminNewContext", description: "管理端描述"}
]
}
end
已有模块中添加 API 不需要添加 alias 或修改 @all_modules,但新增 Tag 仍要按上表同步。
mix cat.gen.spec
生成三类文件:
lib/cat_web/generated/admin_<tag>_request.ex — Request 验证模块lib/cat_web/schemas/<name>.gen.ex — Schema Structopenapi/openapi.yaml — OpenAPI 文档在 lib/cat_web/router.ex 的 admin scope 中添加路由。必须使用 :admin_api pipeline;它包含 require_superuser。
scope "/api/admin", CatWeb.API.Admin do
pipe_through [:admin_api]
get "/catalog/list_classes", CatalogController, :list_classes
post "/catalog/create_class", CatalogController, :create_class
end
HTTP 方法规则:读操作用 get,写操作用 post。
不要把 admin 路由放进 scope "/api", CatWeb.API,也不要使用 :api / :public_api pipeline。
路径:lib/cat_web/controllers/api/admin/<context>_controller.ex
模块:CatWeb.API.Admin.<Context>Controller
defmodule CatWeb.API.Admin.CatalogController do
use CatWeb, :api_controller
alias CatWeb.AdminCatalogRequest
alias Cat.Catalog
def list_classes(conn, _params) do
with {:ok, conn} <-
cast_and_validate(conn, AdminCatalogRequest.operation(:get, :list_classes)) do
%{entries: entries, metadata: metadata} = Catalog.admin_list_classes(conn.params)
render(conn, :list_classes, classes: entries, metadata: metadata)
end
end
end
cast_and_validate/2 后,conn.params 和 conn.body_params 会被替换为 atom 键;控制器读取参数时优先使用 params[:key] / conn.params[:key],并把已校验的 conn.params 直接传给 Context。只有在 DSL 校验没有覆盖某些类型转换或需要兼容原始参数时,才额外写 normalize_params/1。
路径:lib/cat_web/controllers/api/admin/<context>_json.ex
模块:CatWeb.API.Admin.<Context>JSON
defmodule CatWeb.API.Admin.CatalogJSON do
import CatWeb.API.ResponseHelper
alias CatWeb.Schemas.Class
def list_classes(%{classes: classes, metadata: metadata}) do
items = Enum.map(classes, &build_class/1)
paginated(items, metadata)
end
defp build_class(class) do
%Class{
id: class.id,
idname: class.idname,
label: class.label
}
end
end
Context 层通常实现 admin_list_xxx、admin_get_xxx 等函数。列表接口使用 Cat.Paginator 做分页,分页与筛选模式详见 references/api-admin-patterns.md。
def admin_list_classes(params) do
Class
|> maybe_filter_by_idname(params[:idname])
|> maybe_filter_by_label(params[:label])
|> order_by(desc: :is_primary, asc: :label)
|> Paginator.paginate(params)
end
在 docs/prds/{domain}/features/{feature}.md 的 ## api_admin 小节中记录管理端 API 设计。PRD 已按 domain + feature 分层,不再创建或更新 docs/prds/{domain}/api_admin.md 这种 aspect 文件。
选择 feature 的规则:
docs/prds/{domain}/overview.md 的 Feature 列表和 features/ 下已有文档。## api_admin。manage-prd 的规则创建 / 更新 feature,并同步 overview.md 的 Feature 列表。data_model.md,并让 feature ## data_model 保持自包含。| 文件 | Admin API |
|---|---|
| DSL 定义 | lib/cat_api_spec/<ctx>.ex,路径 /api/admin/... |
| Request 模块 | generated/admin_<ctx>_request.ex |
| 路由 | scope "/api/admin" + pipe_through [:admin_api] |
| 控制器 | controllers/api/admin/<ctx>_controller.ex |
| JSON 渲染 | controllers/api/admin/<ctx>_json.ex |
| PRD | docs/prds/{domain}/features/{feature}.md 的 ## api_admin |