User 自定义 Right Templates 与 Open Call 关联 (2026-08-04)

变更概览

自定义 Right Template 的所有权由 Artist 调整为 User。Service 和 Open Call(后端模型名为 Project)现在共用当前登录用户维护的同一套自定义模板:

  • Service 通过 service.artist.user_id 使用所属用户的模板。
  • Open Call 通过 project.user_id 使用创建用户的模板。
  • 没有 Artist profile 的普通用户也可以创建、编辑和删除自己的自定义模板,并用于 Open Call。
  • 自定义模板管理接口统一归入 /api/user/right_templates/custom/*;不再提供 /api/artist_center/right_templates/custom/* 路由。

模板仍使用 type 区分来源:

type来源
platform平台 Right Template
custom当前 User 自定义模板

平台模板与自定义模板的数值 id 可能相同,前端必须使用 (type, id) 作为唯一标识。

接口变更

content

  • POST /api/content/projects/list
    • 功能:获取公开 Open Call 列表
    • 变更:right_template 支持平台/用户自定义模板,并返回 type 和完整 right_tree
  • GET /api/content/projects/info
    • 功能:获取公开 Open Call 详情
    • 变更:right_template 支持平台/用户自定义模板,并返回 type 和完整 right_tree

user

artist_center

接口示例

content

POST /api/content/projects/list

  • 功能说明:获取公开 Open Call 列表。
  • 变更说明:data[].right_template 支持两类模板,结构与公开详情一致。

请求参数

无新增,沿用原接口。

GET /api/content/projects/info

  • 功能说明:获取公开 Open Call 详情。
  • 变更说明:返回模板类型及完整权益树。

响应示例

{
    "data": {
        "id": 100,
        "right_template_type": "custom",
        "right_template_id": 12,
        "right_template": {
            "id": 12,
            "type": "custom",
            "name": {
                "zh": "商用插画授权",
                "en": "Commercial illustration license"
            },
            "summary": {
                "zh": "画师自定义授权模板",
                "en": "Artist-defined license template",
                "ja": "アーティスト作成のライセンステンプレート"
            },
            "right_tree": [
                {
                    "id": 1,
                    "state": 1,
                    "children": []
                }
            ]
        }
    }
}

未关联模板时,right_template_type、right_template_id、right_template 均为 null。

user

GET /api/user/right_templates/custom/meta

  • 功能说明:获取创建/编辑自定义模板所需的完整权益树。

请求参数

无。

响应示例

{
    "data": {
        "rights": [
            {
                "id": 1,
                "name": { "zh": "商业使用" },
                "children": []
            }
        ]
    }
}

GET /api/user/right_templates/custom/list

  • 功能说明:分页获取当前登录用户的自定义模板。

请求参数

字段类型必填说明
pagenumber否页码,默认 1
sizenumber否每页数量,最大 50

列表项包含:type: "custom"、right_tree、services_count、projects_count。

GET /api/user/right_templates/custom/info

  • 功能说明:获取当前用户的单个自定义模板。

请求参数

字段类型必填说明
idnumber是自定义模板 id

404:模板不存在、已删除或不属于当前用户。

POST /api/user/right_templates/custom/create

  • 功能说明:创建用户自定义模板。
  • 变更说明:普通用户无需 Artist profile 即可调用。

请求参数

字段类型必填说明
nameobject是多语言模板名称
right_statesobject[]是完整或部分权益状态
right_states[].right_idnumber是权益 id
right_states[].statenumber是权益状态

请求示例

{
    "name": {
        "zh": "商用插画授权",
        "en": "Commercial illustration license"
    },
    "right_states": [
        {
            "right_id": 1,
            "state": 1
        }
    ]
}

summary、description 继续由系统固定提供,Artist/User 均不可编辑。

POST /api/user/right_templates/custom/update

  • 功能说明:更新当前用户的自定义模板。

请求参数

字段类型必填说明
idnumber是自定义模板 id
nameobject否新的多语言名称
right_statesobject[]否新的权益状态集合

404:模板不存在、已删除或不属于当前用户。

POST /api/user/right_templates/custom/delete

  • 功能说明:删除当前用户的自定义模板。

请求参数

字段类型必填说明
idnumber是自定义模板 id
forceboolean否是否解除 Service/Open Call 关联并强制删除

错误响应

400:模板被 Service 使用,返回既有业务错误码 81001(ArtistRightTemplateUsedByService)。

400:模板未被 Service 使用、但被 Open Call 使用,返回新增业务错误码 81002(UserRightTemplateUsedByOpenCall)。前端必须按 code 处理,不依赖 message。

{
    "code": 81002,
    "message": "Template is used by Open Calls"
}

如果模板同时被 Service 和 Open Call 使用,非强制删除会优先返回 81001。传入 force: true 后会解除两类实时关联并软删除模板,历史快照不变。

POST /api/projects/create

  • 功能说明:创建 Open Call。

新增/调整请求参数

字段类型必填说明
right_template_type"platform" | "custom"否模板类型;省略时兼容为 platform
right_template_idnumber | null否对应类型下的模板 id;null 表示不关联模板

type = custom 时,模板必须属于当前登录用户,否则返回 422,错误字段为 right_template_id。

POST /api/projects/update

  • 功能说明:更新 Open Call。
  • 变更说明:模板校验与创建接口一致;传 right_template_id: null 会同时清空类型和 id。

清空示例

{
    "id": 100,
    "right_template_id": null
}

POST /api/projects/list

  • 功能说明:获取当前用户的 Open Call 列表。
  • 变更说明:data[].right_template 结构与公开 Open Call 详情一致。

GET /api/projects/info

  • 功能说明:获取当前用户的 Open Call 详情。
  • 变更说明:data.right_template 结构与公开 Open Call 详情一致。

POST /api/project_requests/choose

  • 功能说明:选择应征并创建 Work Task。
  • 变更说明:project_snaps.data.right_template 和 work_tasks.busable_snap.right_template 保存模板的 type、名称、固定说明和完整权益树。

模板后续改名、修改权益或强制删除,不影响已生成的快照。

artist_center

GET /api/artist_center/services/info

  • 功能说明:获取当前 Artist 的 Service 编辑详情。
  • 变更说明:right_templates[] 中的自定义模板来自当前 Artist 对应 User 的模板库。

POST /api/artist_center/services/create

  • 功能说明:创建 Service。
  • 变更说明:right_templates[].type = custom 时,id 必须属于当前登录 User。

POST /api/artist_center/services/update

  • 功能说明:更新 Service。
  • 变更说明:自定义模板所有权校验改为当前登录 User;请求字段结构不变。

数据与快照兼容

  • 迁移会把已有 artist_right_templates.artist_id 通过 artists.user_id 正式转换为 User ownership,并保留模板、权益 pivot、Service pivot 的原 id 和数据。
  • 如果旧模板无法找到有效 User owner,迁移会明确失败,不会静默删除数据。
  • 已有 Open Call 中非空的 right_template_id 会回填为 right_template_type = platform。
  • 创建/更新 Open Call 时只传 right_template_id,仍按平台模板处理。
  • 读取旧 Project 快照时,如果 right_template 存在但缺少 type,后端按 platform 返回;前端也应保留同样兼容逻辑。