Files
quyun-v2/backend/docs/swagger.json

2506 lines
88 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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/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": "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": [
"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"
},
{
"type": "integer",
"description": "UserID filters orders by buyer user id.",
"name": "user_id",
"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/{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/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/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": "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": [
"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.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.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.LoginForm": {
"type": "object",
"properties": {
"password": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"dto.LoginResponse": {
"type": "object",
"properties": {
"token": {
"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.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/blockedpublished 才对外展示",
"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/expiredrevoked 表示立即失效(例如退款/违规)",
"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/previewpreview 必须为独立资源以满足禁下载与防绕过",
"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/deletedready 才可被内容引用对外提供",
"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.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/"
}
}