{
  "openapi": "3.0.3",
  "info": {
    "title": "Drama Server API",
    "description": "OpenAPI spec generated from the current drama-server routes and API documentation.",
    "version": "1.0.1"
  },
  "servers": [
    {
      "url": "https://m.iaoo.de",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Health",
      "description": "Health check"
    },
    {
      "name": "Public",
      "description": "Public user-facing APIs"
    },
    {
      "name": "User",
      "description": "Authenticated user APIs"
    },
    {
      "name": "Admin",
      "description": "Admin APIs"
    }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Use JWT bearer token: Authorization: Bearer <token>"
      }
    },
    "schemas": {
      "BaseResponse": {
        "type": "object",
        "required": [
          "code",
          "message",
          "data"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "example": 0
          },
          "message": {
            "type": "string",
            "example": "ok"
          },
          "data": {
            "nullable": true
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "code",
          "message",
          "data"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "example": 4000
          },
          "message": {
            "type": "string",
            "example": "bad_request"
          },
          "data": {
            "nullable": true,
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "boolean"
              },
              {
                "type": "object"
              },
              {
                "type": "array",
                "items": {}
              }
            ]
          }
        }
      },
      "HealthResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "string",
                "example": "healthy"
              }
            }
          }
        ]
      },
      "Pagination": {
        "type": "object",
        "properties": {
          "page": {
            "type": "integer",
            "example": 1
          },
          "pageSize": {
            "type": "integer",
            "example": 20
          },
          "total": {
            "type": "integer",
            "format": "int64",
            "example": 3
          },
          "hasMore": {
            "type": "boolean",
            "example": false
          }
        }
      },
      "Category": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "example": 1
          },
          "name": {
            "type": "string",
            "example": "都市"
          },
          "sort": {
            "type": "integer",
            "example": 100
          },
          "status": {
            "type": "integer",
            "example": 1
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Tag": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "example": 1
          },
          "dramaId": {
            "type": "integer",
            "format": "int64",
            "example": 101
          },
          "tagName": {
            "type": "string",
            "example": "甜宠"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Drama": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "example": 101
          },
          "categoryId": {
            "type": "integer",
            "format": "int64",
            "example": 1
          },
          "title": {
            "type": "string",
            "example": "闪婚后我成了首富太太"
          },
          "coverUrl": {
            "type": "string",
            "example": "https://cdn.example.com/drama/101-cover.jpg"
          },
          "posterUrl": {
            "type": "string",
            "example": "https://cdn.example.com/drama/101-poster.jpg"
          },
          "description": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "example": 1
          },
          "isFinished": {
            "type": "integer",
            "example": 1
          },
          "isFree": {
            "type": "integer",
            "example": 0
          },
          "trialEpisodeCount": {
            "type": "integer",
            "example": 10
          },
          "unlockMode": {
            "type": "string",
            "example": "episode"
          },
          "vipFree": {
            "type": "integer",
            "example": 1
          },
          "coinPerEpisode": {
            "type": "integer",
            "example": 30
          },
          "fullUnlockPrice": {
            "type": "integer",
            "example": 999
          },
          "episodeCount": {
            "type": "integer",
            "example": 12
          },
          "viewCount": {
            "type": "integer",
            "format": "int64",
            "example": 2891234
          },
          "favoriteCount": {
            "type": "integer",
            "format": "int64",
            "example": 92311
          },
          "heatScore": {
            "type": "integer",
            "format": "int64",
            "example": 99999
          },
          "sort": {
            "type": "integer",
            "example": 100
          },
          "category": {
            "$ref": "#/components/schemas/Category"
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tag"
            }
          }
        }
      },
      "Episode": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "example": 1001
          },
          "dramaId": {
            "type": "integer",
            "format": "int64",
            "example": 101
          },
          "episodeNo": {
            "type": "integer",
            "example": 1
          },
          "title": {
            "type": "string",
            "example": "第1集"
          },
          "duration": {
            "type": "integer",
            "example": 95
          },
          "coverUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-ep1.jpg"
          },
          "videoUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-ep1.mp4"
          },
          "hlsUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-ep1.m3u8"
          },
          "isFree": {
            "type": "integer",
            "example": 1
          },
          "price": {
            "type": "integer",
            "example": 0
          },
          "sort": {
            "type": "integer",
            "example": 1
          },
          "status": {
            "type": "integer",
            "example": 1
          }
        }
      },
      "UserLoginRequest": {
        "type": "object",
        "required": [
          "mobile",
          "code"
        ],
        "properties": {
          "mobile": {
            "type": "string",
            "example": "13800138000"
          },
          "code": {
            "type": "string",
            "example": "1234"
          }
        }
      },
      "UserLoginResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string"
                  },
                  "refreshToken": {
                    "type": "string"
                  },
                  "user": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "integer",
                        "format": "int64"
                      },
                      "mobile": {
                        "type": "string"
                      },
                      "nickname": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "AdminLoginRequest": {
        "type": "object",
        "required": [
          "username",
          "password"
        ],
        "properties": {
          "username": {
            "type": "string",
            "example": "admin"
          },
          "password": {
            "type": "string",
            "example": "admin123"
          }
        }
      },
      "AdminLoginResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "token": {
                    "type": "string"
                  },
                  "admin": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "integer",
                        "format": "int64"
                      },
                      "username": {
                        "type": "string"
                      },
                      "nickname": {
                        "type": "string"
                      },
                      "role": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "HomeResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "banners": {
                    "type": "array",
                    "items": {}
                  },
                  "continueWatching": {
                    "type": "array",
                    "items": {}
                  },
                  "sections": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string",
                          "example": "为你推荐"
                        },
                        "type": {
                          "type": "string",
                          "example": "recommend"
                        },
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Drama"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "CategoryListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Category"
                }
              }
            }
          }
        ]
      },
      "DramaListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "list": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Drama"
                    }
                  },
                  "pagination": {
                    "$ref": "#/components/schemas/Pagination"
                  }
                }
              }
            }
          }
        ]
      },
      "DramaDetailResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Drama"
              }
            }
          }
        ]
      },
      "DramaEpisodesResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "dramaId": {
                    "type": "integer",
                    "format": "int64",
                    "example": 101
                  },
                  "episodes": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Episode"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "PlayResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "episodeId": {
                    "type": "integer",
                    "format": "int64"
                  },
                  "dramaId": {
                    "type": "integer",
                    "format": "int64"
                  },
                  "title": {
                    "type": "string"
                  },
                  "playType": {
                    "type": "string",
                    "example": "hls"
                  },
                  "playUrl": {
                    "type": "string"
                  },
                  "backupUrl": {
                    "type": "string"
                  },
                  "duration": {
                    "type": "integer"
                  },
                  "progressSeconds": {
                    "type": "integer"
                  },
                  "autoplayNext": {
                    "type": "boolean"
                  },
                  "nextEpisodeId": {
                    "type": "integer",
                    "format": "int64",
                    "nullable": true
                  },
                  "access": {
                    "type": "object",
                    "properties": {
                      "playable": {
                        "type": "boolean"
                      },
                      "reason": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "SaveProgressRequest": {
        "type": "object",
        "required": [
          "dramaId",
          "episodeId",
          "progressSeconds",
          "duration"
        ],
        "properties": {
          "dramaId": {
            "type": "integer",
            "format": "int64",
            "example": 101
          },
          "episodeId": {
            "type": "integer",
            "format": "int64",
            "example": 1001
          },
          "progressSeconds": {
            "type": "integer",
            "example": 35
          },
          "duration": {
            "type": "integer",
            "example": 95
          },
          "finished": {
            "type": "boolean",
            "example": false
          }
        }
      },
      "BooleanSuccessResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "boolean",
                "example": true
              }
            }
          }
        ]
      },
      "PaymentCreateRequest": {
        "type": "object",
        "required": [
          "orderType",
          "targetId"
        ],
        "properties": {
          "orderType": {
            "type": "string",
            "enum": [
              "episode",
              "drama"
            ],
            "example": "episode"
          },
          "targetId": {
            "type": "integer",
            "format": "int64",
            "example": 1012
          }
        }
      },
      "OrderResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "orderNo": {
                    "type": "string"
                  },
                  "orderType": {
                    "type": "string"
                  },
                  "targetId": {
                    "type": "integer",
                    "format": "int64"
                  },
                  "amount": {
                    "type": "integer"
                  },
                  "currency": {
                    "type": "string",
                    "example": "coin"
                  },
                  "status": {
                    "type": "string",
                    "example": "pending"
                  },
                  "title": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "expiredAt": {
                    "type": "string",
                    "format": "date-time"
                  }
                }
              }
            }
          }
        ]
      },
      "PaymentMockPayRequest": {
        "type": "object",
        "required": [
          "orderNo"
        ],
        "properties": {
          "orderNo": {
            "type": "string",
            "example": "PO1775780000000"
          }
        }
      },
      "CategoryPayload": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "example": "悬疑"
          },
          "sort": {
            "type": "integer",
            "example": 80
          },
          "status": {
            "type": "integer",
            "example": 1
          }
        }
      },
      "DramaPayload": {
        "type": "object",
        "required": [
          "categoryId",
          "title"
        ],
        "properties": {
          "categoryId": {
            "type": "integer",
            "format": "int64",
            "example": 1
          },
          "title": {
            "type": "string",
            "example": "测试上新短剧"
          },
          "coverUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-cover.jpg"
          },
          "posterUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-poster.jpg"
          },
          "description": {
            "type": "string",
            "example": "用于验证后台新增接口"
          },
          "status": {
            "type": "integer",
            "example": 1
          },
          "isFinished": {
            "type": "integer",
            "example": 0
          },
          "isFree": {
            "type": "integer",
            "example": 0
          },
          "trialEpisodeCount": {
            "type": "integer",
            "example": 2
          },
          "unlockMode": {
            "type": "string",
            "example": "episode"
          },
          "vipFree": {
            "type": "integer",
            "example": 0
          },
          "coinPerEpisode": {
            "type": "integer",
            "example": 20
          },
          "fullUnlockPrice": {
            "type": "integer",
            "example": 199
          },
          "episodeCount": {
            "type": "integer",
            "example": 1
          },
          "viewCount": {
            "type": "integer",
            "format": "int64",
            "example": 0
          },
          "favoriteCount": {
            "type": "integer",
            "format": "int64",
            "example": 0
          },
          "heatScore": {
            "type": "integer",
            "format": "int64",
            "example": 4
          },
          "sort": {
            "type": "integer",
            "example": 60
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "测试",
              "运营"
            ]
          }
        }
      },
      "EpisodePayload": {
        "type": "object",
        "required": [
          "dramaId",
          "episodeNo",
          "title"
        ],
        "properties": {
          "dramaId": {
            "type": "integer",
            "format": "int64",
            "example": 103
          },
          "episodeNo": {
            "type": "integer",
            "example": 1
          },
          "title": {
            "type": "string",
            "example": "测试第一集"
          },
          "duration": {
            "type": "integer",
            "example": 95
          },
          "coverUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-ep1.jpg"
          },
          "videoUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-ep1.mp4"
          },
          "hlsUrl": {
            "type": "string",
            "example": "https://cdn.example.com/test-ep1.m3u8"
          },
          "isFree": {
            "type": "integer",
            "example": 1
          },
          "price": {
            "type": "integer",
            "example": 0
          },
          "sort": {
            "type": "integer",
            "example": 1
          },
          "status": {
            "type": "integer",
            "example": 1
          }
        }
      },
      "User": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64",
            "example": 1
          },
          "mobile": {
            "type": "string",
            "example": "13800138000"
          },
          "nickname": {
            "type": "string",
            "example": "测试用户"
          },
          "avatar": {
            "type": "string",
            "example": ""
          },
          "status": {
            "type": "integer",
            "example": 1
          },
          "vipExpireAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "coinBalance": {
            "type": "integer",
            "example": 1000
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "PaymentOrder": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64"
          },
          "orderNo": {
            "type": "string",
            "example": "PO1775780000000"
          },
          "userId": {
            "type": "integer",
            "format": "int64"
          },
          "orderType": {
            "type": "string",
            "example": "episode"
          },
          "targetId": {
            "type": "integer",
            "format": "int64"
          },
          "amount": {
            "type": "integer",
            "example": 30
          },
          "currency": {
            "type": "string",
            "example": "coin"
          },
          "status": {
            "type": "string",
            "example": "pending"
          },
          "title": {
            "type": "string",
            "example": "解锁第12集"
          },
          "description": {
            "type": "string",
            "example": "闪婚后我成了首富太太"
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "expiredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "UserProfileResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/User"
              }
            }
          }
        ]
      },
      "AdminDashboardOverviewResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "userCount": {
                    "type": "integer",
                    "example": 3
                  },
                  "orderCount": {
                    "type": "integer",
                    "example": 12
                  },
                  "dramaCount": {
                    "type": "integer",
                    "example": 3
                  },
                  "todayRevenue": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        ]
      },
      "AdminCategoryListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "list": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Category"
                    }
                  },
                  "pagination": {
                    "$ref": "#/components/schemas/Pagination"
                  },
                  "filters": {
                    "type": "object",
                    "properties": {
                      "status": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "AdminDramaListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "list": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Drama"
                    }
                  },
                  "pagination": {
                    "$ref": "#/components/schemas/Pagination"
                  },
                  "filters": {
                    "type": "object",
                    "properties": {
                      "title": {
                        "type": "string",
                        "example": "闪婚"
                      },
                      "categoryId": {
                        "type": "integer",
                        "format": "int64",
                        "example": 1,
                        "nullable": true
                      },
                      "status": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "AdminEpisodeListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "dramaId": {
                    "type": "integer",
                    "format": "int64",
                    "example": 101
                  },
                  "list": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Episode"
                    }
                  },
                  "pagination": {
                    "$ref": "#/components/schemas/Pagination"
                  },
                  "filters": {
                    "type": "object",
                    "properties": {
                      "status": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "AdminOrderListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "list": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/PaymentOrder"
                    }
                  },
                  "pagination": {
                    "$ref": "#/components/schemas/Pagination"
                  },
                  "filters": {
                    "type": "object",
                    "properties": {
                      "status": {
                        "type": "string",
                        "example": "pending"
                      },
                      "orderNo": {
                        "type": "string",
                        "example": "PO1775780000000"
                      },
                      "orderType": {
                        "type": "string",
                        "example": "episode"
                      },
                      "userId": {
                        "type": "integer",
                        "format": "int64",
                        "example": 1,
                        "nullable": true
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "AdminUserListResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BaseResponse"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "list": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/User"
                    }
                  },
                  "pagination": {
                    "$ref": "#/components/schemas/Pagination"
                  },
                  "filters": {
                    "type": "object",
                    "properties": {
                      "mobile": {
                        "type": "string",
                        "example": "138"
                      },
                      "nickname": {
                        "type": "string",
                        "example": "测试"
                      },
                      "status": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Bad request",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4000,
              "message": "bad_request",
              "data": null
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Unauthorized",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4010,
              "message": "unauthorized",
              "data": null
            }
          }
        }
      },
      "NotFound": {
        "description": "Not found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 4040,
              "message": "not_found",
              "data": null
            }
          }
        }
      },
      "ServerError": {
        "description": "Server error",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "code": 5000,
              "message": "internal_error",
              "data": null
            }
          }
        }
      }
    }
  },
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "Health check",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": "healthy"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/auth/login/mobile": {
      "post": {
        "tags": [
          "Public"
        ],
        "summary": "User mobile login",
        "description": "Current implementation accepts development-style verification flow for frontend integration.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserLoginRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Login success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserLoginResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "token": "<user_token>",
                    "refreshToken": "<refresh_token>",
                    "user": {
                      "id": 1,
                      "mobile": "13800138000",
                      "nickname": "测试用户"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/home": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Home aggregated content",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HomeResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "banners": [],
                    "continueWatching": [],
                    "sections": [
                      {
                        "title": "为你推荐",
                        "type": "recommend",
                        "items": [
                          {
                            "id": 101,
                            "categoryId": 1,
                            "title": "闪婚后我成了首富太太",
                            "coverUrl": "https://cdn.example.com/drama/101-cover.jpg",
                            "posterUrl": "https://cdn.example.com/drama/101-poster.jpg",
                            "description": "替嫁闪婚后，她以为只是协议婚姻，没想到对方竟是首富。",
                            "status": 1,
                            "isFinished": 1,
                            "isFree": 0,
                            "trialEpisodeCount": 10,
                            "unlockMode": "episode",
                            "vipFree": 1,
                            "coinPerEpisode": 30,
                            "fullUnlockPrice": 999,
                            "episodeCount": 12,
                            "viewCount": 2891234,
                            "favoriteCount": 92311,
                            "heatScore": 99999,
                            "sort": 100,
                            "category": {
                              "id": 1,
                              "name": "都市",
                              "sort": 100,
                              "status": 1
                            },
                            "tags": [
                              {
                                "id": 1,
                                "dramaId": 101,
                                "tagName": "都市"
                              }
                            ]
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/categories": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Category list",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryListResponse"
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/dramas": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Drama list",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DramaListResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "list": [
                      {
                        "id": 101,
                        "categoryId": 1,
                        "title": "闪婚后我成了首富太太",
                        "coverUrl": "https://cdn.example.com/drama/101-cover.jpg",
                        "posterUrl": "https://cdn.example.com/drama/101-poster.jpg",
                        "description": "替嫁闪婚后，她以为只是协议婚姻，没想到对方竟是首富。",
                        "status": 1,
                        "isFinished": 1,
                        "isFree": 0,
                        "trialEpisodeCount": 10,
                        "unlockMode": "episode",
                        "vipFree": 1,
                        "coinPerEpisode": 30,
                        "fullUnlockPrice": 999,
                        "episodeCount": 12,
                        "viewCount": 2891234,
                        "favoriteCount": 92311,
                        "heatScore": 99999,
                        "sort": 100
                      }
                    ],
                    "pagination": {
                      "page": 1,
                      "pageSize": 20,
                      "total": 3,
                      "hasMore": false
                    }
                  }
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/dramas/{id}": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Drama detail",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DramaDetailResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/dramas/{id}/episodes": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Drama episodes",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DramaEpisodesResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/episodes/{id}/play": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Episode play access check",
        "description": "Returns play information when unlocked. May also return business code 4003 (episode_locked) with HTTP 200.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK or business-locked",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlayResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "episodeId": 1001,
                    "dramaId": 101,
                    "title": "第1集",
                    "playType": "hls",
                    "playUrl": "https://cdn.example.com/test-ep1.m3u8",
                    "backupUrl": "",
                    "duration": 95,
                    "progressSeconds": 0,
                    "autoplayNext": true,
                    "nextEpisodeId": 1002,
                    "access": {
                      "playable": true,
                      "reason": ""
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/user/profile": {
      "get": {
        "tags": [
          "User"
        ],
        "summary": "User profile",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserProfileResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "id": 1,
                    "mobile": "13800138000",
                    "nickname": "测试用户",
                    "avatar": "",
                    "status": 1,
                    "vipExpireAt": null,
                    "coinBalance": 1000
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/history/progress": {
      "post": {
        "tags": [
          "User"
        ],
        "summary": "Save watch progress",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SaveProgressRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BooleanSuccessResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/payment/create": {
      "post": {
        "tags": [
          "User"
        ],
        "summary": "Create payment order",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentCreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrderResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "orderNo": "PO1775780000000",
                    "orderType": "episode",
                    "targetId": 1012,
                    "amount": 30,
                    "currency": "coin",
                    "status": "pending",
                    "title": "解锁第12集",
                    "description": "闪婚后我成了首富太太",
                    "expiredAt": "2026-04-10T08:30:00+08:00"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/api/v1/payment/mock-pay": {
      "post": {
        "tags": [
          "User"
        ],
        "summary": "Mock pay",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentMockPayRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BooleanSuccessResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/admin/v1/auth/login": {
      "post": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin login",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdminLoginRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminLoginResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "token": "<admin_token>",
                    "admin": {
                      "id": 1,
                      "username": "admin",
                      "nickname": "系统管理员",
                      "role": "super_admin"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          }
        }
      }
    },
    "/admin/v1/dashboard/overview": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin dashboard overview",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminDashboardOverviewResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "userCount": 3,
                    "orderCount": 12,
                    "dramaCount": 3,
                    "todayRevenue": 0
                  }
                }
              }
            }
          }
        }
      }
    },
    "/admin/v1/categories": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin category list",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminCategoryListResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "list": [
                      {
                        "id": 1,
                        "name": "都市",
                        "sort": 100,
                        "status": 1
                      }
                    ],
                    "pagination": {
                      "page": 1,
                      "pageSize": 20,
                      "total": 3,
                      "hasMore": false
                    },
                    "filters": {
                      "status": 1
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Filter by category status"
          }
        ]
      },
      "post": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin create category",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CategoryPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      }
    },
    "/admin/v1/categories/{id}": {
      "put": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin update category",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CategoryPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      },
      "delete": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin delete category",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BooleanSuccessResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": true
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/admin/v1/dramas": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin drama list",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminDramaListResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "list": [
                      {
                        "id": 101,
                        "categoryId": 1,
                        "title": "闪婚后我成了首富太太",
                        "status": 1
                      }
                    ],
                    "pagination": {
                      "page": 1,
                      "pageSize": 20,
                      "total": 1,
                      "hasMore": false
                    },
                    "filters": {
                      "title": "闪婚",
                      "categoryId": 1,
                      "status": 1
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "title",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by drama title keyword"
          },
          {
            "name": "categoryId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int64"
            },
            "description": "Filter by category id"
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Filter by drama status"
          }
        ]
      },
      "post": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin create drama",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DramaPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      }
    },
    "/admin/v1/dramas/{id}": {
      "put": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin update drama",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DramaPayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      },
      "delete": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin delete drama",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BooleanSuccessResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": true
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/admin/v1/dramas/{id}/episodes": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin episode list by drama",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Filter by episode status"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminEpisodeListResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "dramaId": 101,
                    "list": [
                      {
                        "id": 1001,
                        "dramaId": 101,
                        "episodeNo": 1,
                        "title": "第1集",
                        "duration": 95,
                        "isFree": 1,
                        "price": 0,
                        "sort": 1,
                        "status": 1
                      }
                    ],
                    "pagination": {
                      "page": 1,
                      "pageSize": 20,
                      "total": 12,
                      "hasMore": false
                    },
                    "filters": {
                      "status": 1
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      }
    },
    "/admin/v1/episodes": {
      "post": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin create episode",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EpisodePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      }
    },
    "/admin/v1/episodes/{id}": {
      "put": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin update episode",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EpisodePayload"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          }
        }
      },
      "delete": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin delete episode",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BooleanSuccessResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": true
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/admin/v1/orders": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin order list",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminOrderListResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "list": [
                      {
                        "id": 1,
                        "orderNo": "PO1775780000000",
                        "userId": 1,
                        "orderType": "episode",
                        "targetId": 1012,
                        "amount": 30,
                        "currency": "coin",
                        "status": "paid",
                        "title": "解锁第12集",
                        "description": "闪婚后我成了首富太太"
                      }
                    ],
                    "pagination": {
                      "page": 1,
                      "pageSize": 20,
                      "total": 1,
                      "hasMore": false
                    },
                    "filters": {
                      "status": "paid",
                      "orderNo": "PO1775780000",
                      "orderType": "episode",
                      "userId": 1
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by order status"
          },
          {
            "name": "orderNo",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by order number keyword"
          },
          {
            "name": "orderType",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by order type, e.g. episode or drama"
          },
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int64"
            },
            "description": "Filter by user id"
          }
        ]
      }
    },
    "/admin/v1/users": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin user list",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdminUserListResponse"
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "list": [
                      {
                        "id": 1,
                        "mobile": "13800138000",
                        "nickname": "测试用户",
                        "status": 1,
                        "coinBalance": 1000
                      }
                    ],
                    "pagination": {
                      "page": 1,
                      "pageSize": 20,
                      "total": 1,
                      "hasMore": false
                    },
                    "filters": {
                      "mobile": "138",
                      "nickname": "测试",
                      "status": 1
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20,
              "maximum": 100
            }
          },
          {
            "name": "mobile",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by mobile keyword"
          },
          {
            "name": "nickname",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter by nickname keyword"
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Filter by user status"
          }
        ]
      }
    },
    "/admin/v1/orders/{id}": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin order detail",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseResponse"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/PaymentOrder"
                        }
                      }
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "id": 1,
                    "orderNo": "PO1775780000000",
                    "userId": 1,
                    "orderType": "episode",
                    "targetId": 1012,
                    "amount": 30,
                    "currency": "coin",
                    "status": "paid",
                    "title": "解锁第12集",
                    "description": "闪婚后我成了首富太太"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/admin/v1/users/{id}": {
      "get": {
        "tags": [
          "Admin"
        ],
        "summary": "Admin user detail",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseResponse"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/User"
                        }
                      }
                    }
                  ]
                },
                "example": {
                  "code": 0,
                  "message": "ok",
                  "data": {
                    "id": 1,
                    "mobile": "13800138000",
                    "nickname": "测试用户",
                    "status": 1,
                    "coinBalance": 1000
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    }
  }
}