// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs import "github.com/rogeecn/swag" const docTemplate = `{ "schemes": {{ marshal .Schemes }}, "swagger": "2.0", "info": { "description": "{{escape .Description}}", "title": "{{.Title}}", "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": "{{.Version}}" }, "host": "{{.Host}}", "basePath": "{{.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/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.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/" } }` // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ Version: "1.0", Host: "localhost:8080", BasePath: "/", Schemes: []string{}, Title: "ApiDoc", Description: "Multi-tenant media platform backend API.", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, LeftDelim: "{{", RightDelim: "}}", } func init() { swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) }