根据 OpenAPI 规范或自然语言描述,生成完整的 Phoenix JSON API。自动创建 contexts、Ecto schemas、migrations、controllers、JSON views / renderers、router 路由条目、带 factories 的 ExUnit 测试、auth plugs 以及 tenant scoping。适用于以下场景:构建全新的 Phoenix REST API、添加 CRUD 端点、为资源生成脚手架,或把 OpenAPI YAML 文件转换为
Phoenix API 生成器 : 工作流程 : 从 OpenAPI YAML. 移植 OpenAPI 谱面 —— 提取路径, 计划, 请求/ 响应机构是一项面向实际任务的技能,主要用于将每个计划映射到 Ecto 计划 + 迁移;将每个路径映射到一个缩写。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
securitySchemes 生成认证插件(auth plugs)。YYYYMMDDHHMMSS)*JSON 模块;旧版本使用 *View)参见 references/phoenix-conventions.md 获取项目结构、命名规则、上下文模式等说明。
核心规则:
Accounts、Billing、Notifications)。MyApp.Accounts.User。{:ok, resource} 或 {:error, changeset}。FallbackController 与 action_fallback/1 处理错误元组(error tuples)。参见 references/ecto-patterns.md 获取 schema、changeset、migration 的详细说明。
核心规则:
timestamps(type: :utc_datetime_usec)。@primary_key {:id, :binary_id, autogenerate: true} 并设置 @foreign_key_type :binary_id。create_changeset/2 和 update_changeset/2。为所有租户作用域内的表添加 tenant_id :binary_id 字段。典型模式如下:
# 在 context 中
def list_resources(tenant_id) do
Resource
|> where(tenant_id: ^tenant_id)
|> Repo.all()
end
# 在 plug 中 — 从 conn 提取 tenant 并 assign
defmodule MyAppWeb.Plugs.SetTenant do
import Plug.Conn
def init(opts), do: opts
def call(conn, _opts) do
tenant_id = get_req_header(conn, "x-tenant-id") |> List.first()
assign(conn, :tenant_id, tenant_id)
end
end
务必为 [:tenant_id, 添加复合索引(composite index)。
defmodule MyAppWeb.Plugs.ApiKeyAuth do
import Plug.Conn
def init(opts), do: opts
def call(conn, _opts) do
with [key] <- get_req_header(conn, "x-api-key"),
{:ok, account} <- Accounts.authenticate_api_key(key) do
assign(conn, :current_account, account)
else
_ -> conn |> send_resp(401, "Unauthorized") |> halt()
end
end
end
defmodule MyAppWeb.Plugs.BearerAuth do
import Plug.Conn
def init(opts), do: opts
def call(conn, _opts) do
with ["Bearer " <> token] <- get_req_header(conn, "authorization"),
{:ok, claims} <- MyApp.Token.verify(token) do
assign(conn, :current_user, claims)
else
_ -> conn |> send_resp(401, "Unauthorized") |> halt()
end
end
end
scope "/api/v1", MyAppWeb do
pipe_through [:api, :authenticated]
resources "/users", UserController, except: [:new, :edit]
resources "/teams", TeamController, except: [:new, :edit] do
resources "/members", MemberController, only: [:index, :create, :delete]
end
end
参见 references/test-patterns.md 获取 ExUnit、Mox、factory 相关模式说明。
核心规则:
async: true。Ecto.Adapters.SQL.Sandbox 实现数据库隔离。ex_machina 构建,或手动实现 build/1、insert/1 等函数。Mox 模拟外部服务 — 需明确定义 behaviour,并在测试中设定期望行为(expectations)。defmodule MyAppWeb.UserControllerTest do
use MyAppWeb.ConnCase, async: true
import MyApp.Factory
setup %{conn: conn} do
user = insert(:user)
conn = put_req_header(conn, "authorization", "Bearer #{token_for(user)}")
{:ok, conn: conn, user: user}
end
describe "index" do
test "lists users", %{conn: conn} do
conn = get(conn, ~p"/api/v1/users")
assert %{"data" => users} = json_response(conn, 200)
assert is_list(users)
end
end
describe "create" do
test "returns 201 with valid params", %{conn: conn} do
params = params_for(:user)
conn = post(conn, ~p"/api/v1/users", user: params)
assert %{"data" => %{"id" => _}} = json_response(conn, 201)
end
test "returns 422 with invalid params", %{conn: conn} do
conn = post(conn, ~p"/api/v1/users", user: %{})
assert json_response(conn, 422)["errors"] != %{}
end
end
end
defmodule MyAppWeb.UserJSON do
def index(%{users: users}), do: %{data: for(u <- users, do: data(u))}
def show(%{user: user}), do: %{data: data(user)}
defp data(user) do
%{
id: user.id,
email: user.email,
inserted_at: user.inserted_at
}
end
end
timestamps(type: :utc_datetime_usec){:error, changeset} 和 {:error, :not_found}相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章