{ "swagger": "2.0", "info": { "description": "Multi-tenant media platform backend API.", "title": "ApiDoc", "termsOfService": "http://swagger.io/terms/", "contact": { "name": "UserName", "url": "http://www.swagger.io/support", "email": "support@swagger.io" }, "license": { "name": "Apache 2.0", "url": "http://www.apache.org/licenses/LICENSE-2.0.html" }, "version": "1.0" }, "host": "localhost:8080", "basePath": "/", "paths": { "/super/v1/auth/login": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "parameters": [ { "description": "form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.LoginForm" } } ], "responses": { "200": { "description": "成功", "schema": { "$ref": "#/definitions/dto.LoginResponse" } } } } }, "/super/v1/auth/token": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "responses": { "200": { "description": "成功", "schema": { "$ref": "#/definitions/dto.LoginResponse" } } } } }, "/super/v1/tenants": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "租户列表", "parameters": [ { "type": "string", "description": "Asc specifies comma-separated field names to sort ascending by.", "name": "asc", "in": "query" }, { "type": "string", "description": "Desc specifies comma-separated field names to sort descending by.", "name": "desc", "in": "query" }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "string", "name": "name", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "enum": [ "pending_verify", "verified", "banned" ], "type": "string", "x-enum-varnames": [ "TenantStatusPendingVerify", "TenantStatusVerified", "TenantStatusBanned" ], "name": "status", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/dto.TenantItem" } } } ] } } } } }, "/super/v1/tenants/statuses": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "租户状态列表", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/requests.KV" } } } } } }, "/super/v1/tenants/{tenantID}": { "patch": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "更新过期时间", "parameters": [ { "type": "integer", "format": "int64", "description": "TenantID", "name": "tenantID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.TenantExpireUpdateForm" } } ], "responses": {} } }, "/super/v1/tenants/{tenantID}/status": { "patch": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "更新租户状态", "parameters": [ { "type": "integer", "format": "int64", "description": "TenantID", "name": "tenantID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.TenantStatusUpdateForm" } } ], "responses": {} } }, "/super/v1/users": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "租户列表", "parameters": [ { "type": "string", "description": "Asc specifies comma-separated field names to sort ascending by.", "name": "asc", "in": "query" }, { "type": "string", "description": "Desc specifies comma-separated field names to sort descending by.", "name": "desc", "in": "query" }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "enum": [ "pending_verify", "verified", "banned" ], "type": "string", "x-enum-varnames": [ "UserStatusPendingVerify", "UserStatusVerified", "UserStatusBanned" ], "name": "status", "in": "query" }, { "type": "integer", "name": "tenantID", "in": "query" }, { "type": "string", "name": "username", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/dto.UserItem" } } } ] } } } } }, "/super/v1/users/statistics": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "用户统计信息", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/dto.UserStatistics" } } } } } }, "/super/v1/users/statuses": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "用户状态列表", "responses": { "200": { "description": "OK", "schema": { "type": "array", "items": { "$ref": "#/definitions/requests.KV" } } } } } }, "/super/v1/users/{userID}/status": { "patch": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Super" ], "summary": "更新用户状态", "parameters": [ { "type": "integer", "format": "int64", "description": "UserID", "name": "userID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.UserStatusUpdateForm" } } ], "responses": {} } }, "/t/{tenantCode}/v1/admin/contents": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "创建内容(草稿)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.ContentCreateForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Content" } } } } }, "/t/{tenantCode}/v1/admin/contents/{contentID}": { "patch": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "更新内容(标题/描述/状态等)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.ContentUpdateForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Content" } } } } }, "/t/{tenantCode}/v1/admin/contents/{contentID}/assets": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "绑定媒体资源到内容(main/cover/preview)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.ContentAssetAttachForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.ContentAsset" } } } } }, "/t/{tenantCode}/v1/admin/contents/{contentID}/price": { "put": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "设置内容价格与折扣", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.ContentPriceUpsertForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.ContentPrice" } } } } }, "/t/{tenantCode}/v1/admin/invites": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "邀请码列表(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "string", "description": "Code 按邀请码模糊过滤(可选):支持部分匹配(like)。", "name": "code", "in": "query" }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "enum": [ "active", "disabled", "expired" ], "type": "string", "x-enum-varnames": [ "TenantInviteStatusActive", "TenantInviteStatusDisabled", "TenantInviteStatusExpired" ], "description": "Status 按状态过滤(可选):active/disabled/expired。", "name": "status", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/models.TenantInvite" } } } ] } } } }, "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "创建邀请码(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminTenantInviteCreateForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.TenantInvite" } } } } }, "/t/{tenantCode}/v1/admin/invites/{inviteID}/disable": { "patch": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "禁用邀请码(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "InviteID", "name": "inviteID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminTenantInviteDisableForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.TenantInvite" } } } } }, "/t/{tenantCode}/v1/admin/join-requests": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "加入申请列表(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "enum": [ "pending", "approved", "rejected" ], "type": "string", "x-enum-varnames": [ "TenantJoinRequestStatusPending", "TenantJoinRequestStatusApproved", "TenantJoinRequestStatusRejected" ], "description": "Status 按申请状态过滤(可选):pending/approved/rejected。", "name": "status", "in": "query" }, { "type": "integer", "description": "UserID 按申请人用户ID过滤(可选)。", "name": "user_id", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/models.TenantJoinRequest" } } } ] } } } } }, "/t/{tenantCode}/v1/admin/join-requests/{requestID}/approve": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "通过加入申请(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "RequestID", "name": "requestID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminTenantJoinRequestDecideForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.TenantJoinRequest" } } } } }, "/t/{tenantCode}/v1/admin/join-requests/{requestID}/reject": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "拒绝加入申请(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "RequestID", "name": "requestID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminTenantJoinRequestDecideForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.TenantJoinRequest" } } } } }, "/t/{tenantCode}/v1/admin/orders": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "订单列表(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "description": "AmountPaidMax 实付金额上限(可选):amount_paid \u003c= 该值(单位分)。", "name": "amount_paid_max", "in": "query" }, { "type": "integer", "description": "AmountPaidMin 实付金额下限(可选):amount_paid \u003e= 该值(单位分)。", "name": "amount_paid_min", "in": "query" }, { "type": "string", "description": "Asc specifies comma-separated field names to sort ascending by.", "name": "asc", "in": "query" }, { "type": "integer", "description": "ContentID 内容ID(可选):通过 order_items 关联过滤。", "name": "content_id", "in": "query" }, { "type": "string", "description": "ContentTitle 内容标题关键字(可选):通过 order_items + contents 关联,模糊匹配 contents.title(like)。", "name": "content_title", "in": "query" }, { "type": "string", "description": "CreatedAtFrom 创建时间起(可选):created_at \u003e= 该时间(用于按创建时间筛选)。", "name": "created_at_from", "in": "query" }, { "type": "string", "description": "CreatedAtTo 创建时间止(可选):created_at \u003c= 该时间(用于按创建时间筛选)。", "name": "created_at_to", "in": "query" }, { "type": "string", "description": "Desc specifies comma-separated field names to sort descending by.", "name": "desc", "in": "query" }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "type": "string", "description": "PaidAtFrom 支付时间起(可选):paid_at \u003e= 该时间(用于按支付时间筛选)。", "name": "paid_at_from", "in": "query" }, { "type": "string", "description": "PaidAtTo 支付时间止(可选):paid_at \u003c= 该时间(用于按支付时间筛选)。", "name": "paid_at_to", "in": "query" }, { "enum": [ "created", "paid", "refunding", "refunded", "canceled", "failed" ], "type": "string", "x-enum-varnames": [ "OrderStatusCreated", "OrderStatusPaid", "OrderStatusRefunding", "OrderStatusRefunded", "OrderStatusCanceled", "OrderStatusFailed" ], "description": "Status 订单状态(可选):created/paid/refunding/refunded/canceled/failed。", "name": "status", "in": "query" }, { "enum": [ "content_purchase", "topup" ], "type": "string", "x-enum-varnames": [ "OrderTypeContentPurchase", "OrderTypeTopup" ], "description": "Type 订单类型(可选):content_purchase/topup 等。", "name": "type", "in": "query" }, { "type": "integer", "description": "UserID 下单用户ID(可选):按买家用户ID精确过滤。", "name": "user_id", "in": "query" }, { "type": "string", "description": "Username 下单用户用户名关键字(可选):模糊匹配 users.username(like)。", "name": "username", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/models.Order" } } } ] } } } } }, "/t/{tenantCode}/v1/admin/orders/{orderID}": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "订单详情(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "OrderID", "name": "orderID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.AdminOrderDetail" } } } } }, "/t/{tenantCode}/v1/admin/orders/{orderID}/refund": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "订单退款(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "OrderID", "name": "orderID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminOrderRefundForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Order" } } } } }, "/t/{tenantCode}/v1/admin/users": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "成员列表(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "enum": [ "member", "tenant_admin" ], "type": "string", "x-enum-varnames": [ "TenantUserRoleMember", "TenantUserRoleTenantAdmin" ], "description": "Role 按角色过滤(可选):member/tenant_admin。", "name": "role", "in": "query" }, { "enum": [ "pending_verify", "verified", "banned" ], "type": "string", "x-enum-varnames": [ "UserStatusPendingVerify", "UserStatusVerified", "UserStatusBanned" ], "description": "Status 按成员状态过滤(可选):pending_verify/verified/banned。", "name": "status", "in": "query" }, { "type": "integer", "description": "UserID 按用户ID过滤(可选)。", "name": "user_id", "in": "query" }, { "type": "string", "description": "Username 按用户名模糊查询(可选,支持包含匹配)。", "name": "username", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/dto.AdminTenantUserItem" } } } ] } } } } }, "/t/{tenantCode}/v1/admin/users/{userID}": { "delete": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "移除租户成员(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "UserID", "name": "userID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/requests.Pager" } } } } }, "/t/{tenantCode}/v1/admin/users/{userID}/join": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "添加租户成员(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "UserID", "name": "userID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.AdminTenantUserJoinResponse" } } } } }, "/t/{tenantCode}/v1/admin/users/{userID}/role": { "patch": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "设置成员角色(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "UserID", "name": "userID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminTenantUserRoleUpdateForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.AdminTenantUserJoinResponse" } } } } }, "/t/{tenantCode}/v1/admin/users/{userID}/topup": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "为租户成员充值(租户管理)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "UserID", "name": "userID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.AdminTopupForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Order" } } } } }, "/t/{tenantCode}/v1/contents": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "内容列表(已发布)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "string", "description": "Keyword filters by title keyword (LIKE).", "name": "keyword", "in": "query" }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/dto.ContentItem" } } } ] } } } } }, "/t/{tenantCode}/v1/contents/{contentID}": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "内容详情(可见性+权益校验)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.ContentDetail" } } } } }, "/t/{tenantCode}/v1/contents/{contentID}/assets": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "获取正片资源(main role,需要已购或免费)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.ContentAssetsResponse" } } } } }, "/t/{tenantCode}/v1/contents/{contentID}/preview": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "获取试看资源(preview role)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.ContentAssetsResponse" } } } } }, "/t/{tenantCode}/v1/contents/{contentID}/purchase": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "购买内容(余额支付)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "ContentID", "name": "contentID", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.PurchaseContentForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.PurchaseContentResponse" } } } } }, "/t/{tenantCode}/v1/join/invite": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "TenantJoin" ], "summary": "通过邀请码加入租户", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.JoinByInviteForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.TenantUser" } } } } }, "/t/{tenantCode}/v1/join/request": { "post": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "TenantJoin" ], "summary": "提交加入租户申请", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "description": "Form", "name": "form", "in": "body", "required": true, "schema": { "$ref": "#/definitions/dto.JoinRequestCreateForm" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.TenantJoinRequest" } } } } }, "/t/{tenantCode}/v1/me": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "当前租户上下文信息", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.MeResponse" } } } } }, "/t/{tenantCode}/v1/me/balance": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "当前租户余额信息", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/dto.MeBalanceResponse" } } } } }, "/t/{tenantCode}/v1/me/ledgers": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "当前租户余额流水(分页)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/dto.MyLedgerItem" } } } ] } } } } }, "/t/{tenantCode}/v1/orders": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "我的订单列表(当前租户)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "description": "ContentID filters orders by purchased content id (via order_items join).", "name": "content_id", "in": "query" }, { "type": "integer", "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "name": "limit", "in": "query" }, { "type": "integer", "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "name": "page", "in": "query" }, { "type": "string", "description": "PaidAtFrom filters orders by paid_at \u003e= this time.", "name": "paid_at_from", "in": "query" }, { "type": "string", "description": "PaidAtTo filters orders by paid_at \u003c= this time.", "name": "paid_at_to", "in": "query" }, { "enum": [ "created", "paid", "refunding", "refunded", "canceled", "failed" ], "type": "string", "x-enum-varnames": [ "OrderStatusCreated", "OrderStatusPaid", "OrderStatusRefunding", "OrderStatusRefunded", "OrderStatusCanceled", "OrderStatusFailed" ], "description": "Status filters orders by order status.", "name": "status", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/requests.Pager" }, { "type": "object", "properties": { "items": { "$ref": "#/definitions/models.Order" } } } ] } } } } }, "/t/{tenantCode}/v1/orders/{orderID}": { "get": { "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "Tenant" ], "summary": "我的订单详情(当前租户)", "parameters": [ { "type": "string", "description": "Tenant Code", "name": "tenantCode", "in": "path", "required": true }, { "type": "integer", "format": "int64", "description": "OrderID", "name": "orderID", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/models.Order" } } } } } }, "definitions": { "consts.ContentAccessStatus": { "type": "string", "enum": [ "active", "revoked", "expired" ], "x-enum-varnames": [ "ContentAccessStatusActive", "ContentAccessStatusRevoked", "ContentAccessStatusExpired" ] }, "consts.ContentAssetRole": { "type": "string", "enum": [ "main", "cover", "preview" ], "x-enum-varnames": [ "ContentAssetRoleMain", "ContentAssetRoleCover", "ContentAssetRolePreview" ] }, "consts.ContentStatus": { "type": "string", "enum": [ "draft", "reviewing", "published", "unpublished", "blocked" ], "x-enum-varnames": [ "ContentStatusDraft", "ContentStatusReviewing", "ContentStatusPublished", "ContentStatusUnpublished", "ContentStatusBlocked" ] }, "consts.ContentVisibility": { "type": "string", "enum": [ "public", "tenant_only", "private" ], "x-enum-varnames": [ "ContentVisibilityPublic", "ContentVisibilityTenantOnly", "ContentVisibilityPrivate" ] }, "consts.Currency": { "type": "string", "enum": [ "CNY" ], "x-enum-varnames": [ "CurrencyCNY" ] }, "consts.DiscountType": { "type": "string", "enum": [ "none", "percent", "amount" ], "x-enum-varnames": [ "DiscountTypeNone", "DiscountTypePercent", "DiscountTypeAmount" ] }, "consts.MediaAssetStatus": { "type": "string", "enum": [ "uploaded", "processing", "ready", "failed", "deleted" ], "x-enum-varnames": [ "MediaAssetStatusUploaded", "MediaAssetStatusProcessing", "MediaAssetStatusReady", "MediaAssetStatusFailed", "MediaAssetStatusDeleted" ] }, "consts.MediaAssetType": { "type": "string", "enum": [ "video", "audio", "image" ], "x-enum-varnames": [ "MediaAssetTypeVideo", "MediaAssetTypeAudio", "MediaAssetTypeImage" ] }, "consts.OrderStatus": { "type": "string", "enum": [ "created", "paid", "refunding", "refunded", "canceled", "failed" ], "x-enum-varnames": [ "OrderStatusCreated", "OrderStatusPaid", "OrderStatusRefunding", "OrderStatusRefunded", "OrderStatusCanceled", "OrderStatusFailed" ] }, "consts.OrderType": { "type": "string", "enum": [ "content_purchase", "topup" ], "x-enum-varnames": [ "OrderTypeContentPurchase", "OrderTypeTopup" ] }, "consts.Role": { "type": "string", "enum": [ "user", "super_admin" ], "x-enum-varnames": [ "RoleUser", "RoleSuperAdmin" ] }, "consts.TenantInviteStatus": { "type": "string", "enum": [ "active", "disabled", "expired" ], "x-enum-varnames": [ "TenantInviteStatusActive", "TenantInviteStatusDisabled", "TenantInviteStatusExpired" ] }, "consts.TenantJoinRequestStatus": { "type": "string", "enum": [ "pending", "approved", "rejected" ], "x-enum-varnames": [ "TenantJoinRequestStatusPending", "TenantJoinRequestStatusApproved", "TenantJoinRequestStatusRejected" ] }, "consts.TenantLedgerType": { "type": "string", "enum": [ "credit_topup", "debit_purchase", "credit_refund", "freeze", "unfreeze", "adjustment" ], "x-enum-varnames": [ "TenantLedgerTypeCreditTopup", "TenantLedgerTypeDebitPurchase", "TenantLedgerTypeCreditRefund", "TenantLedgerTypeFreeze", "TenantLedgerTypeUnfreeze", "TenantLedgerTypeAdjustment" ] }, "consts.TenantStatus": { "type": "string", "enum": [ "pending_verify", "verified", "banned" ], "x-enum-varnames": [ "TenantStatusPendingVerify", "TenantStatusVerified", "TenantStatusBanned" ] }, "consts.TenantUserRole": { "type": "string", "enum": [ "member", "tenant_admin" ], "x-enum-varnames": [ "TenantUserRoleMember", "TenantUserRoleTenantAdmin" ] }, "consts.UserStatus": { "type": "string", "enum": [ "pending_verify", "verified", "banned" ], "x-enum-varnames": [ "UserStatusPendingVerify", "UserStatusVerified", "UserStatusBanned" ] }, "dto.AdminOrderDetail": { "type": "object", "properties": { "order": { "description": "Order is the order with items preloaded.", "allOf": [ { "$ref": "#/definitions/models.Order" } ] } } }, "dto.AdminOrderRefundForm": { "type": "object", "properties": { "force": { "description": "Force indicates bypassing the default refund window check (paid_at + 24h).\n强制退款:true 表示绕过默认退款时间窗限制(需审计)。", "type": "boolean" }, "idempotency_key": { "description": "IdempotencyKey ensures refund request is processed at most once.\n幂等键:同一笔退款重复请求时返回一致结果,避免重复退款/重复回滚。", "type": "string" }, "reason": { "description": "Reason is the human-readable refund reason used for audit.\n退款原因:建议必填(由业务侧校验);用于审计与追责。", "type": "string" } } }, "dto.AdminTenantInviteCreateForm": { "type": "object", "properties": { "code": { "description": "Code 邀请码(可选):为空时由后端生成;建议只包含数字/字母,便于人工输入。", "type": "string" }, "expires_at": { "description": "ExpiresAt 过期时间(可选):为空表示不过期;到期后不可再使用。", "type": "string" }, "max_uses": { "description": "MaxUses 最大可使用次数(可选):0 表示不限次数;大于 0 时用尽后自动失效。", "type": "integer" }, "remark": { "description": "Remark 备注(可选):用于审计记录生成目的/投放渠道等。", "type": "string" } } }, "dto.AdminTenantInviteDisableForm": { "type": "object", "properties": { "reason": { "description": "Reason 禁用原因(可选):用于审计与追溯。", "type": "string" } } }, "dto.AdminTenantJoinRequestDecideForm": { "type": "object", "properties": { "reason": { "description": "Reason 审核说明(可选):用于审计记录通过/拒绝原因。", "type": "string" } } }, "dto.AdminTenantUserItem": { "type": "object", "properties": { "tenant_user": { "description": "TenantUser 租户成员关系记录。", "allOf": [ { "$ref": "#/definitions/models.TenantUser" } ] }, "user": { "description": "User 用户基础信息(用于展示 username 等)。", "allOf": [ { "$ref": "#/definitions/models.User" } ] } } }, "dto.AdminTenantUserJoinResponse": { "type": "object", "properties": { "tenant_user": { "description": "TenantUser 租户成员关系记录。", "allOf": [ { "$ref": "#/definitions/models.TenantUser" } ] } } }, "dto.AdminTenantUserRoleUpdateForm": { "type": "object", "properties": { "role": { "description": "Role 角色:member/tenant_admin。", "type": "string" } } }, "dto.AdminTopupForm": { "type": "object", "properties": { "amount": { "description": "Amount is the topup amount in cents (CNY 分); must be \u003e 0.", "type": "integer" }, "idempotency_key": { "description": "IdempotencyKey ensures the topup request is processed at most once.", "type": "string" }, "reason": { "description": "Reason is the human-readable topup reason used for audit.", "type": "string" } } }, "dto.ContentAssetAttachForm": { "type": "object", "properties": { "asset_id": { "description": "AssetID is the media asset id to attach.", "type": "integer" }, "role": { "description": "Role indicates how this asset is used (main/cover/preview).", "allOf": [ { "$ref": "#/definitions/consts.ContentAssetRole" } ] }, "sort": { "description": "Sort controls ordering under the same role.", "type": "integer" } } }, "dto.ContentAssetsResponse": { "type": "object", "properties": { "assets": { "description": "Assets is the list of media assets for the requested role (preview/main).", "type": "array", "items": { "$ref": "#/definitions/models.MediaAsset" } }, "content": { "description": "Content is the content entity.", "allOf": [ { "$ref": "#/definitions/models.Content" } ] }, "preview_seconds": { "description": "PreviewSeconds indicates the max preview duration (only meaningful for preview response).", "type": "integer" } } }, "dto.ContentCreateForm": { "type": "object", "properties": { "description": { "description": "Description is the content description.", "type": "string" }, "preview_seconds": { "description": "PreviewSeconds controls preview duration (defaults to 60 when omitted).", "type": "integer" }, "title": { "description": "Title is the content title.", "type": "string" }, "visibility": { "description": "Visibility controls who can view the content detail (main assets still require free/purchase).", "allOf": [ { "$ref": "#/definitions/consts.ContentVisibility" } ] } } }, "dto.ContentDetail": { "type": "object", "properties": { "content": { "description": "Content is the content entity.", "allOf": [ { "$ref": "#/definitions/models.Content" } ] }, "has_access": { "description": "HasAccess indicates whether current user can access main assets (free/owner/purchased).", "type": "boolean" }, "price": { "description": "Price is the current price settings for the content (may be nil if not set).", "allOf": [ { "$ref": "#/definitions/models.ContentPrice" } ] } } }, "dto.ContentItem": { "type": "object", "properties": { "content": { "description": "Content is the content entity.", "allOf": [ { "$ref": "#/definitions/models.Content" } ] }, "has_access": { "description": "HasAccess indicates whether current user can access main assets (free/owner/purchased).", "type": "boolean" }, "price": { "description": "Price is the current price settings for the content (may be nil if not set).", "allOf": [ { "$ref": "#/definitions/models.ContentPrice" } ] } } }, "dto.ContentPriceUpsertForm": { "type": "object", "properties": { "currency": { "description": "Currency is fixed to CNY for now.", "allOf": [ { "$ref": "#/definitions/consts.Currency" } ] }, "discount_end_at": { "description": "DiscountEndAt disables discount after this time (optional).", "type": "string" }, "discount_start_at": { "description": "DiscountStartAt enables discount from this time (optional).", "type": "string" }, "discount_type": { "description": "DiscountType defines the discount algorithm (none/percent/amount).", "allOf": [ { "$ref": "#/definitions/consts.DiscountType" } ] }, "discount_value": { "description": "DiscountValue is interpreted based on DiscountType.", "type": "integer" }, "price_amount": { "description": "PriceAmount is the base price in cents (CNY 分).", "type": "integer" } } }, "dto.ContentUpdateForm": { "type": "object", "properties": { "description": { "description": "Description updates the description when provided.", "type": "string" }, "preview_seconds": { "description": "PreviewSeconds updates preview duration when provided (must be \u003e 0).", "type": "integer" }, "status": { "description": "Status updates the content status when provided (e.g. publish/unpublish).", "allOf": [ { "$ref": "#/definitions/consts.ContentStatus" } ] }, "title": { "description": "Title updates the title when provided.", "type": "string" }, "visibility": { "description": "Visibility updates the visibility when provided.", "allOf": [ { "$ref": "#/definitions/consts.ContentVisibility" } ] } } }, "dto.JoinByInviteForm": { "type": "object", "properties": { "invite_code": { "description": "InviteCode 邀请码:由租户管理员生成;用户提交后加入对应租户。", "type": "string" } } }, "dto.JoinRequestCreateForm": { "type": "object", "properties": { "reason": { "description": "Reason 申请原因(可选):用于向租户管理员说明申请加入的目的。", "type": "string" } } }, "dto.LoginForm": { "type": "object", "properties": { "password": { "type": "string" }, "username": { "type": "string" } } }, "dto.LoginResponse": { "type": "object", "properties": { "token": { "type": "string" } } }, "dto.MeBalanceResponse": { "type": "object", "properties": { "balance": { "description": "Balance 可用余额:可用于购买/消费。", "type": "integer" }, "balance_frozen": { "description": "BalanceFrozen 冻结余额:用于下单冻结/争议期等。", "type": "integer" }, "currency": { "description": "Currency 币种:当前固定 CNY(金额单位为分)。", "allOf": [ { "$ref": "#/definitions/consts.Currency" } ] }, "updated_at": { "description": "UpdatedAt 更新时间:余额变更时更新。", "type": "string" } } }, "dto.MeResponse": { "type": "object", "properties": { "tenant": { "description": "Tenant is the resolved tenant by `tenantCode`.", "allOf": [ { "$ref": "#/definitions/models.Tenant" } ] }, "tenant_user": { "description": "TenantUser is the membership record of the authenticated user within the tenant.", "allOf": [ { "$ref": "#/definitions/models.TenantUser" } ] }, "user": { "description": "User is the authenticated user derived from JWT `user_id`.", "allOf": [ { "$ref": "#/definitions/models.User" } ] } } }, "dto.MyLedgerItem": { "type": "object", "properties": { "ledger": { "description": "Ledger 流水记录(租户内隔离)。", "allOf": [ { "$ref": "#/definitions/models.TenantLedger" } ] }, "type_description": { "description": "TypeDescription 流水类型中文说明(用于前端展示)。", "type": "string" } } }, "dto.PurchaseContentForm": { "type": "object", "properties": { "idempotency_key": { "description": "IdempotencyKey is used to ensure the purchase request is processed at most once.\n建议由客户端生成并保持稳定:同一笔购买重复请求时返回相同结果,避免重复扣款/重复下单。", "type": "string" } } }, "dto.PurchaseContentResponse": { "type": "object", "properties": { "access": { "description": "Access is the content access record after purchase grant.", "allOf": [ { "$ref": "#/definitions/models.ContentAccess" } ] }, "amount_paid": { "description": "AmountPaid is the final paid amount in cents (CNY 分).", "type": "integer" }, "item": { "description": "Item is the single order item of this purchase (current implementation is 1 order -\u003e 1 content).", "allOf": [ { "$ref": "#/definitions/models.OrderItem" } ] }, "order": { "description": "Order is the created or existing order record (may be nil for owner/free-path without order).", "allOf": [ { "$ref": "#/definitions/models.Order" } ] } } }, "dto.TenantExpireUpdateForm": { "type": "object", "required": [ "duration" ], "properties": { "duration": { "type": "integer", "enum": [ 7, 30, 90, 180, 365 ] } } }, "dto.TenantItem": { "type": "object", "properties": { "code": { "type": "string" }, "config": { "type": "array", "items": { "type": "integer" } }, "created_at": { "type": "string" }, "expired_at": { "type": "string" }, "id": { "type": "integer" }, "name": { "type": "string" }, "status": { "$ref": "#/definitions/consts.TenantStatus" }, "status_description": { "type": "string" }, "updated_at": { "type": "string" }, "user_balance": { "type": "integer" }, "user_count": { "type": "integer" }, "user_id": { "type": "integer" }, "users": { "type": "array", "items": { "$ref": "#/definitions/models.User" } }, "uuid": { "type": "string" } } }, "dto.TenantStatusUpdateForm": { "type": "object", "required": [ "status" ], "properties": { "status": { "enum": [ "normal", "disabled" ], "allOf": [ { "$ref": "#/definitions/consts.TenantStatus" } ] } } }, "dto.UserItem": { "type": "object", "properties": { "created_at": { "type": "string" }, "deleted_at": { "$ref": "#/definitions/gorm.DeletedAt" }, "id": { "type": "integer" }, "metas": { "type": "array", "items": { "type": "integer" } }, "owned": { "$ref": "#/definitions/models.Tenant" }, "password": { "type": "string" }, "roles": { "type": "array", "items": { "$ref": "#/definitions/consts.Role" } }, "status": { "$ref": "#/definitions/consts.UserStatus" }, "status_description": { "type": "string" }, "tenants": { "type": "array", "items": { "$ref": "#/definitions/models.Tenant" } }, "updated_at": { "type": "string" }, "username": { "type": "string" }, "verified_at": { "type": "string" } } }, "dto.UserStatistics": { "type": "object", "properties": { "count": { "type": "integer" }, "status": { "$ref": "#/definitions/consts.UserStatus" }, "status_description": { "type": "string" } } }, "dto.UserStatusUpdateForm": { "type": "object", "required": [ "status" ], "properties": { "status": { "enum": [ "normal", "disabled" ], "allOf": [ { "$ref": "#/definitions/consts.UserStatus" } ] } } }, "gorm.DeletedAt": { "type": "object", "properties": { "time": { "type": "string" }, "valid": { "description": "Valid is true if Time is not NULL", "type": "boolean" } } }, "models.Content": { "type": "object", "properties": { "created_at": { "description": "创建时间:默认 now();用于审计与排序", "type": "string" }, "deleted_at": { "description": "软删除时间:非空表示已删除;对外接口需过滤", "allOf": [ { "$ref": "#/definitions/gorm.DeletedAt" } ] }, "description": { "description": "描述:用于详情页展示;可为空字符串", "type": "string" }, "id": { "description": "主键ID:自增;用于内容引用", "type": "integer" }, "preview_downloadable": { "description": "试看是否允许下载:默认 false;当前策略固定为不允许下载(仅 streaming)", "type": "boolean" }, "preview_seconds": { "description": "试看秒数:默认 60;只对 preview 资源生效;必须为正整数", "type": "integer" }, "published_at": { "description": "发布时间:首次发布时写入;用于时间窗与排序", "type": "string" }, "status": { "description": "状态:draft/reviewing/published/unpublished/blocked;published 才对外展示", "allOf": [ { "$ref": "#/definitions/consts.ContentStatus" } ] }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;所有查询/写入必须限定 tenant_id", "type": "integer" }, "title": { "description": "标题:用于列表展示与搜索;建议限制长度(由业务校验)", "type": "string" }, "updated_at": { "description": "更新时间:默认 now();编辑内容时写入", "type": "string" }, "user_id": { "description": "用户ID:内容创建者/发布者;用于权限与审计(例如私有内容仅作者可见)", "type": "integer" }, "visibility": { "description": "可见性:public/tenant_only/private;仅控制详情可见,正片资源仍需按价格/权益校验", "allOf": [ { "$ref": "#/definitions/consts.ContentVisibility" } ] } } }, "models.ContentAccess": { "type": "object", "properties": { "content_id": { "description": "内容ID:权益对应内容;唯一约束 (tenant_id, user_id, content_id)", "type": "integer" }, "created_at": { "description": "创建时间:默认 now();用于审计", "type": "string" }, "id": { "description": "主键ID:自增", "type": "integer" }, "order_id": { "description": "订单ID:产生该权益的订单;可为空(例如后台补发/迁移)", "type": "integer" }, "revoked_at": { "description": "撤销时间:当 status=revoked 时写入;用于审计与追责", "type": "string" }, "status": { "description": "权益状态:active/revoked/expired;revoked 表示立即失效(例如退款/违规)", "allOf": [ { "$ref": "#/definitions/consts.ContentAccessStatus" } ] }, "tenant_id": { "description": "租户ID:多租户隔离;与内容、用户归属一致", "type": "integer" }, "updated_at": { "description": "更新时间:默认 now();更新 status 时写入", "type": "string" }, "user_id": { "description": "用户ID:权益所属用户;用于访问校验", "type": "integer" } } }, "models.ContentAsset": { "type": "object", "properties": { "asset_id": { "description": "资源ID:关联 media_assets.id;用于查询资源归属内容", "type": "integer" }, "content_id": { "description": "内容ID:关联 contents.id;用于查询内容下资源列表", "type": "integer" }, "created_at": { "description": "创建时间:默认 now();用于审计", "type": "string" }, "id": { "description": "主键ID:自增", "type": "integer" }, "role": { "description": "资源角色:main/cover/preview;preview 必须为独立资源以满足禁下载与防绕过", "allOf": [ { "$ref": "#/definitions/consts.ContentAssetRole" } ] }, "sort": { "description": "排序:同一 role 下的展示顺序,数值越小越靠前", "type": "integer" }, "tenant_id": { "description": "租户ID:多租户隔离;必须与 content_id、asset_id 所属租户一致", "type": "integer" }, "updated_at": { "description": "更新时间:默认 now();更新 sort/role 时写入", "type": "string" }, "user_id": { "description": "用户ID:操作人/绑定人;用于审计(通常为租户管理员或作者)", "type": "integer" } } }, "models.ContentPrice": { "type": "object", "properties": { "content_id": { "description": "内容ID:唯一约束 (tenant_id, content_id);一个内容在一个租户内仅一份定价", "type": "integer" }, "created_at": { "description": "创建时间:默认 now();用于审计", "type": "string" }, "currency": { "description": "币种:当前固定 CNY;金额单位为分", "allOf": [ { "$ref": "#/definitions/consts.Currency" } ] }, "discount_end_at": { "description": "折扣结束时间:可为空;为空表示长期有效(由业务逻辑解释)", "type": "string" }, "discount_start_at": { "description": "折扣开始时间:可为空;为空表示立即生效(由业务逻辑解释)", "type": "string" }, "discount_type": { "description": "折扣类型:none/percent/amount;仅影响下单时成交价,需写入订单快照", "allOf": [ { "$ref": "#/definitions/consts.DiscountType" } ] }, "discount_value": { "description": "折扣值:percent=0-100(按业务校验);amount=分;none 时忽略", "type": "integer" }, "id": { "description": "主键ID:自增", "type": "integer" }, "price_amount": { "description": "基础价格:分;0 表示免费(可直接访问正片资源)", "type": "integer" }, "tenant_id": { "description": "租户ID:多租户隔离;与内容归属一致", "type": "integer" }, "updated_at": { "description": "更新时间:默认 now();更新价格/折扣时写入", "type": "string" }, "user_id": { "description": "用户ID:设置/更新价格的操作人(通常为 tenant_admin);用于审计", "type": "integer" } } }, "models.MediaAsset": { "type": "object", "properties": { "bucket": { "description": "存储桶:对象所在 bucket;与 provider 组合确定存储定位", "type": "string" }, "created_at": { "description": "创建时间:默认 now();用于审计与排序", "type": "string" }, "deleted_at": { "description": "软删除时间:非空表示已删除;对外接口需过滤", "allOf": [ { "$ref": "#/definitions/gorm.DeletedAt" } ] }, "id": { "description": "主键ID:自增;仅用于内部关联", "type": "integer" }, "meta": { "description": "元数据:JSON;包含 hash、duration、width、height、bitrate、codec 等;用于展示与计费/风控", "type": "array", "items": { "type": "integer" } }, "object_key": { "description": "对象键:对象在 bucket 内的 key;不得暴露可长期复用的直链(通过签名URL/token下发)", "type": "string" }, "provider": { "description": "存储提供方:例如 s3/minio/oss;便于多存储扩展", "type": "string" }, "status": { "description": "处理状态:uploaded/processing/ready/failed/deleted;ready 才可被内容引用对外提供", "allOf": [ { "$ref": "#/definitions/consts.MediaAssetStatus" } ] }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;所有查询/写入必须限定 tenant_id", "type": "integer" }, "type": { "description": "资源类型:video/audio/image;决定后续处理流程(转码/缩略图/封面等)", "allOf": [ { "$ref": "#/definitions/consts.MediaAssetType" } ] }, "updated_at": { "description": "更新时间:默认 now();更新状态/元数据时写入", "type": "string" }, "user_id": { "description": "用户ID:资源上传者;用于审计与权限控制", "type": "integer" } } }, "models.Order": { "type": "object", "properties": { "amount_discount": { "description": "优惠金额:分;amount_paid = amount_original - amount_discount(下单时快照)", "type": "integer" }, "amount_original": { "description": "原价金额:分;未折扣前金额(用于展示与对账)", "type": "integer" }, "amount_paid": { "description": "实付金额:分;从租户内余额扣款的金额(下单时快照)", "type": "integer" }, "created_at": { "description": "创建时间:默认 now();用于审计与排序", "type": "string" }, "currency": { "description": "币种:当前固定 CNY;金额单位为分", "allOf": [ { "$ref": "#/definitions/consts.Currency" } ] }, "id": { "description": "主键ID:自增;用于关联订单明细、账本流水、权益等", "type": "integer" }, "idempotency_key": { "description": "幂等键:同一租户同一用户同一业务请求可用;用于防重复下单/重复扣款(建议由客户端生成)", "type": "string" }, "items": { "type": "array", "items": { "$ref": "#/definitions/models.OrderItem" } }, "paid_at": { "description": "支付/扣款完成时间:余额支付在 debit_purchase 成功后写入", "type": "string" }, "refund_forced": { "description": "是否强制退款:true 表示租户管理侧绕过时间窗执行退款(需审计)", "type": "boolean" }, "refund_operator_user_id": { "description": "退款操作人用户ID:租户管理员/系统;用于审计与追责", "type": "integer" }, "refund_reason": { "description": "退款原因:后台/用户发起退款的原因说明;用于审计", "type": "string" }, "refunded_at": { "description": "退款完成时间:退款落账成功后写入", "type": "string" }, "snapshot": { "description": "订单快照:JSON;建议包含 content 标题/定价/折扣、请求来源等,避免改价影响历史展示", "type": "array", "items": { "type": "integer" } }, "status": { "description": "订单状态:created/paid/refunding/refunded/canceled/failed;状态变更需与账本/权益保持一致", "allOf": [ { "$ref": "#/definitions/consts.OrderStatus" } ] }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;所有查询/写入必须限定 tenant_id", "type": "integer" }, "type": { "description": "订单类型:content_purchase(购买内容)/topup(充值)等;当前默认 content_purchase", "allOf": [ { "$ref": "#/definitions/consts.OrderType" } ] }, "updated_at": { "description": "更新时间:默认 now();状态变更/退款写入时更新", "type": "string" }, "user_id": { "description": "用户ID:下单用户(buyer);余额扣款与权益归属以该 user_id 为准", "type": "integer" } } }, "models.OrderItem": { "type": "object", "properties": { "amount_paid": { "description": "该行实付金额:分;通常等于订单 amount_paid(单内容场景)", "type": "integer" }, "content": { "$ref": "#/definitions/models.Content" }, "content_id": { "description": "内容ID:关联 contents.id;用于生成/撤销 content_access", "type": "integer" }, "content_user_id": { "description": "内容作者用户ID:用于后续分成/对账扩展;当前可为 0 或写入内容创建者", "type": "integer" }, "created_at": { "description": "创建时间:默认 now()", "type": "string" }, "id": { "description": "主键ID:自增", "type": "integer" }, "order": { "$ref": "#/definitions/models.Order" }, "order_id": { "description": "订单ID:关联 orders.id;用于聚合订单明细", "type": "integer" }, "snapshot": { "description": "内容快照:JSON;建议包含 title/price/discount 等,用于历史展示与审计", "type": "array", "items": { "type": "integer" } }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;必须与 orders.tenant_id 一致", "type": "integer" }, "updated_at": { "description": "更新时间:默认 now()", "type": "string" }, "user_id": { "description": "用户ID:下单用户(buyer);冗余字段用于查询加速与审计", "type": "integer" } } }, "models.Tenant": { "type": "object", "properties": { "code": { "type": "string" }, "config": { "type": "array", "items": { "type": "integer" } }, "created_at": { "type": "string" }, "expired_at": { "type": "string" }, "id": { "type": "integer" }, "name": { "type": "string" }, "status": { "$ref": "#/definitions/consts.TenantStatus" }, "updated_at": { "type": "string" }, "user_id": { "type": "integer" }, "users": { "type": "array", "items": { "$ref": "#/definitions/models.User" } }, "uuid": { "type": "string" } } }, "models.TenantInvite": { "type": "object", "properties": { "code": { "description": "邀请码:用户加入租户时提交;同一租户内唯一", "type": "string" }, "created_at": { "description": "创建时间:默认 now()", "type": "string" }, "disabled_at": { "description": "禁用时间:租户管理员禁用该邀请的时间(UTC)", "type": "string" }, "disabled_operator_user_id": { "description": "禁用操作人用户ID:租户管理员(审计用)", "type": "integer" }, "expires_at": { "description": "过期时间:到期后不可再使用(UTC);为空表示不过期", "type": "string" }, "id": { "description": "主键ID:自增", "type": "integer" }, "max_uses": { "description": "最大可使用次数:0 表示不限制;\u003e0 时 used_count 达到该值后视为失效", "type": "integer" }, "remark": { "description": "备注:生成/禁用原因等(审计用)", "type": "string" }, "status": { "description": "邀请状态:active/disabled/expired;expired 也可由 expires_at 推导,业务侧需保持一致", "allOf": [ { "$ref": "#/definitions/consts.TenantInviteStatus" } ] }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;所有查询/写入必须限定 tenant_id", "type": "integer" }, "updated_at": { "description": "更新时间:默认 now()", "type": "string" }, "used_count": { "description": "已使用次数:每次成功加入时 +1;需事务保证并发下不超发", "type": "integer" }, "user_id": { "description": "创建人用户ID:生成邀请码的租户管理员(审计用)", "type": "integer" } } }, "models.TenantJoinRequest": { "type": "object", "properties": { "created_at": { "description": "创建时间:默认 now()", "type": "string" }, "decided_at": { "description": "处理时间:审核通过/拒绝时记录(UTC)", "type": "string" }, "decided_operator_user_id": { "description": "处理人用户ID:租户管理员(审计用)", "type": "integer" }, "decided_reason": { "description": "处理说明:管理员通过/拒绝的原因(可选,审计用)", "type": "string" }, "id": { "description": "主键ID:自增", "type": "integer" }, "reason": { "description": "申请原因:用户填写的加入说明(可选)", "type": "string" }, "status": { "description": "申请状态:pending/approved/rejected;状态变更需记录 decided_at 与 decided_operator_user_id", "allOf": [ { "$ref": "#/definitions/consts.TenantJoinRequestStatus" } ] }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;所有查询/写入必须限定 tenant_id", "type": "integer" }, "updated_at": { "description": "更新时间:默认 now()", "type": "string" }, "user_id": { "description": "申请人用户ID:发起加入申请的用户", "type": "integer" } } }, "models.TenantLedger": { "type": "object", "properties": { "amount": { "description": "流水金额:分/最小货币单位;通常为正数,方向由 type 决定(由业务层约束)", "type": "integer" }, "balance_after": { "description": "变更后可用余额:用于审计与对账回放", "type": "integer" }, "balance_before": { "description": "变更前可用余额:用于审计与对账回放", "type": "integer" }, "created_at": { "description": "创建时间:默认 now()", "type": "string" }, "frozen_after": { "description": "变更后冻结余额:用于审计与对账回放", "type": "integer" }, "frozen_before": { "description": "变更前冻结余额:用于审计与对账回放", "type": "integer" }, "id": { "description": "主键ID:自增", "type": "integer" }, "idempotency_key": { "description": "幂等键:同一租户同一用户同一业务操作固定;用于防止重复落账(建议由业务层生成)", "type": "string" }, "order": { "$ref": "#/definitions/models.Order" }, "order_id": { "description": "关联订单ID:购买/退款类流水应关联 orders.id;非订单类可为空", "type": "integer" }, "remark": { "description": "备注:业务说明/后台操作原因等;用于审计", "type": "string" }, "tenant_id": { "description": "租户ID:多租户隔离关键字段;必须与 tenant_users.tenant_id 一致", "type": "integer" }, "type": { "description": "流水类型:credit_topup/debit_purchase/credit_refund/freeze/unfreeze/adjustment;不同类型决定余额/冻结余额的变更方向", "allOf": [ { "$ref": "#/definitions/consts.TenantLedgerType" } ] }, "updated_at": { "description": "更新时间:默认 now()", "type": "string" }, "user_id": { "description": "用户ID:余额账户归属用户;对应 tenant_users.user_id", "type": "integer" } } }, "models.TenantUser": { "type": "object", "properties": { "balance": { "type": "integer" }, "balance_frozen": { "description": "冻结余额:分/最小货币单位;下单冻结时从可用余额转入,最终扣款或回滚时转出;默认 0", "type": "integer" }, "created_at": { "type": "string" }, "id": { "type": "integer" }, "role": { "type": "array", "items": { "$ref": "#/definitions/consts.TenantUserRole" } }, "status": { "$ref": "#/definitions/consts.UserStatus" }, "tenant_id": { "type": "integer" }, "updated_at": { "type": "string" }, "user_id": { "type": "integer" } } }, "models.User": { "type": "object", "properties": { "created_at": { "type": "string" }, "deleted_at": { "$ref": "#/definitions/gorm.DeletedAt" }, "id": { "type": "integer" }, "metas": { "type": "array", "items": { "type": "integer" } }, "owned": { "$ref": "#/definitions/models.Tenant" }, "password": { "type": "string" }, "roles": { "type": "array", "items": { "$ref": "#/definitions/consts.Role" } }, "status": { "$ref": "#/definitions/consts.UserStatus" }, "tenants": { "type": "array", "items": { "$ref": "#/definitions/models.Tenant" } }, "updated_at": { "type": "string" }, "username": { "type": "string" }, "verified_at": { "type": "string" } } }, "requests.KV": { "type": "object", "properties": { "key": { "description": "Key is a machine-readable value, usually an enum string.", "type": "string" }, "value": { "description": "Value is the label payload, often a human-readable string." } } }, "requests.Pager": { "type": "object", "properties": { "items": { "description": "Items is the paged result list; concrete type depends on endpoint." }, "limit": { "description": "Limit is page size; only values in {10,20,50,100} are accepted (otherwise defaults to 10).", "type": "integer" }, "page": { "description": "Page is 1-based page index; values \u003c= 0 are normalized to 1.", "type": "integer" }, "total": { "description": "Total is the total number of items matching current filter (before paging).", "type": "integer" } } } }, "securityDefinitions": { "BasicAuth": { "type": "basic" } }, "externalDocs": { "description": "OpenAPI", "url": "https://swagger.io/resources/open-api/" } }