1799 lines
45 KiB
JSON
1799 lines
45 KiB
JSON
{
|
||
"openapi": "3.0.2",
|
||
"info": {
|
||
"title": "FastAPI example application",
|
||
"version": "0.0.0"
|
||
},
|
||
"paths": {
|
||
"/api/auth/email-code": {
|
||
"post": {
|
||
"tags": [
|
||
"authentication"
|
||
],
|
||
"summary": "Auth:Email-Code",
|
||
"description": "发送邮箱验证码并写入数据库(若仓库存在)。",
|
||
"operationId": "auth_email_code_api_auth_email_code_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/EmailCodeSendIn"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/EmailCodeSendOut"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/auth/login": {
|
||
"post": {
|
||
"tags": [
|
||
"authentication"
|
||
],
|
||
"summary": "Auth:Login",
|
||
"description": "邮箱 + 密码登录(签发 Access & Set-Cookie Refresh)",
|
||
"operationId": "auth_login_api_auth_login_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_auth_login_api_auth_login_post"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/UserInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/auth": {
|
||
"post": {
|
||
"tags": [
|
||
"authentication"
|
||
],
|
||
"summary": "Auth:Register",
|
||
"description": "注册流程:\n1) 校验两次密码一致\n2) 校验邮箱未被占用\n3) 校验验证码(若存在验证码仓库)\n4) 生成唯一用户名\n5) 创建用户\n6) 如仓库提供 set_email_verified,则置为 True\n7) 签发 Access & Set-Cookie Refresh",
|
||
"operationId": "auth_register_api_auth_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_auth_register_api_auth_post"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"201": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/UserInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/auth/refresh": {
|
||
"post": {
|
||
"tags": [
|
||
"authentication"
|
||
],
|
||
"summary": "Auth:Refresh",
|
||
"description": "从 HttpOnly Cookie 读取 refresh,校验后签发新的 access,并重置 refresh Cookie。\n最小改造版本:refresh 不轮换(如需轮换/重放检测,请走“增表方案”)。",
|
||
"operationId": "auth_refresh_api_auth_refresh_post",
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/auth/logout": {
|
||
"post": {
|
||
"tags": [
|
||
"authentication"
|
||
],
|
||
"summary": "Auth:Logout",
|
||
"operationId": "auth_logout_api_auth_logout_post",
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/auth/password/forgot": {
|
||
"post": {
|
||
"tags": [
|
||
"auth-password"
|
||
],
|
||
"summary": "Forgot Password",
|
||
"operationId": "forgot_password_api_auth_password_forgot_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/PasswordForgotIn"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/auth/password/reset": {
|
||
"post": {
|
||
"tags": [
|
||
"auth-password"
|
||
],
|
||
"summary": "Reset Password",
|
||
"operationId": "reset_password_api_auth_password_reset_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/PasswordResetIn"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/user": {
|
||
"get": {
|
||
"tags": [
|
||
"users"
|
||
],
|
||
"summary": "Users:Get-Current-User",
|
||
"operationId": "users_get_current_user_api_user_get",
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/UserInResponse"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"put": {
|
||
"tags": [
|
||
"users"
|
||
],
|
||
"summary": "Users:Update-Current-User",
|
||
"operationId": "users_update_current_user_api_user_put",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_users_update_current_user_api_user_put"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/UserInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/profiles/{username}": {
|
||
"get": {
|
||
"tags": [
|
||
"profiles"
|
||
],
|
||
"summary": "Profiles:Get-Profile",
|
||
"operationId": "profiles_get_profile_api_profiles__username__get",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Username",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "username",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ProfileInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/profiles/{username}/follow": {
|
||
"post": {
|
||
"tags": [
|
||
"profiles"
|
||
],
|
||
"summary": "Profiles:Follow-User",
|
||
"operationId": "profiles_follow_user_api_profiles__username__follow_post",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Username",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "username",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ProfileInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"delete": {
|
||
"tags": [
|
||
"profiles"
|
||
],
|
||
"summary": "Profiles:Unsubscribe-From-User",
|
||
"operationId": "profiles_unsubscribe_from_user_api_profiles__username__follow_delete",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Username",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "username",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ProfileInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/articles/feed": {
|
||
"get": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Get-User-Feed-Articles",
|
||
"operationId": "articles_get_user_feed_articles_api_articles_feed_get",
|
||
"parameters": [
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Limit",
|
||
"minimum": 1,
|
||
"type": "integer",
|
||
"default": 20
|
||
},
|
||
"name": "limit",
|
||
"in": "query"
|
||
},
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Offset",
|
||
"minimum": 0,
|
||
"type": "integer",
|
||
"default": 0
|
||
},
|
||
"name": "offset",
|
||
"in": "query"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ListOfArticlesInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/articles/{slug}/favorite": {
|
||
"post": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Mark-Article-Favorite",
|
||
"operationId": "articles_mark_article_favorite_api_articles__slug__favorite_post",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ArticleInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"delete": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Unmark-Article-Favorite",
|
||
"operationId": "articles_unmark_article_favorite_api_articles__slug__favorite_delete",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ArticleInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/articles": {
|
||
"get": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:List-Articles",
|
||
"operationId": "articles_list_articles_api_articles_get",
|
||
"parameters": [
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Tag",
|
||
"type": "string"
|
||
},
|
||
"name": "tag",
|
||
"in": "query"
|
||
},
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Author",
|
||
"type": "string"
|
||
},
|
||
"name": "author",
|
||
"in": "query"
|
||
},
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Favorited",
|
||
"type": "string"
|
||
},
|
||
"name": "favorited",
|
||
"in": "query"
|
||
},
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Limit",
|
||
"minimum": 1,
|
||
"type": "integer",
|
||
"default": 20
|
||
},
|
||
"name": "limit",
|
||
"in": "query"
|
||
},
|
||
{
|
||
"required": false,
|
||
"schema": {
|
||
"title": "Offset",
|
||
"minimum": 0,
|
||
"type": "integer",
|
||
"default": 0
|
||
},
|
||
"name": "offset",
|
||
"in": "query"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ListOfArticlesInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"post": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Create-Article",
|
||
"operationId": "articles_create_article_api_articles_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_articles_create_article_api_articles_post"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"201": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ArticleInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/articles/{slug}": {
|
||
"get": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Get-Article",
|
||
"description": "文章详情:对所有人开放访问。\n- 未登录 / token 缺失 / token 无效 -\u003E user 为 None,正常返回文章。\n- 已登录且 token 有效 -\u003E user 有值,可用于 favorited 等字段计算。",
|
||
"operationId": "articles_get_article_api_articles__slug__get",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ArticleInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"put": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Update-Article",
|
||
"operationId": "articles_update_article_api_articles__slug__put",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_articles_update_article_api_articles__slug__put"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ArticleInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"delete": {
|
||
"tags": [
|
||
"articles"
|
||
],
|
||
"summary": "Articles:Delete-Article",
|
||
"operationId": "articles_delete_article_api_articles__slug__delete",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"204": {
|
||
"description": "Successful Response"
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/articles/{slug}/comments": {
|
||
"get": {
|
||
"tags": [
|
||
"comments"
|
||
],
|
||
"summary": "Comments:Get-Comments-For-Article",
|
||
"operationId": "comments_get_comments_for_article_api_articles__slug__comments_get",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/ListOfCommentsInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
},
|
||
"post": {
|
||
"tags": [
|
||
"comments"
|
||
],
|
||
"summary": "Comments:Create-Comment-For-Article",
|
||
"operationId": "comments_create_comment_for_article_api_articles__slug__comments_post",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"requestBody": {
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_comments_create_comment_for_article_api_articles__slug__comments_post"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"201": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/CommentInResponse"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/articles/{slug}/comments/{comment_id}": {
|
||
"delete": {
|
||
"tags": [
|
||
"comments"
|
||
],
|
||
"summary": "Comments:Delete-Comment-From-Article",
|
||
"operationId": "comments_delete_comment_from_article_api_articles__slug__comments__comment_id__delete",
|
||
"parameters": [
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Comment Id",
|
||
"minimum": 1,
|
||
"type": "integer"
|
||
},
|
||
"name": "comment_id",
|
||
"in": "path"
|
||
},
|
||
{
|
||
"required": true,
|
||
"schema": {
|
||
"title": "Slug",
|
||
"minLength": 1,
|
||
"type": "string"
|
||
},
|
||
"name": "slug",
|
||
"in": "path"
|
||
}
|
||
],
|
||
"responses": {
|
||
"204": {
|
||
"description": "Successful Response"
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"security": [
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
},
|
||
{
|
||
"RWAPIKeyHeader": []
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"/api/tags": {
|
||
"get": {
|
||
"tags": [
|
||
"tags"
|
||
],
|
||
"summary": "Tags:Get-All",
|
||
"operationId": "tags_get_all_api_tags_get",
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/TagsInList"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"/api/upload-image": {
|
||
"post": {
|
||
"tags": [
|
||
"uploads"
|
||
],
|
||
"summary": "Upload Image",
|
||
"operationId": "upload_image_api_upload_image_post",
|
||
"requestBody": {
|
||
"content": {
|
||
"multipart/form-data": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/Body_upload_image_api_upload_image_post"
|
||
}
|
||
}
|
||
},
|
||
"required": true
|
||
},
|
||
"responses": {
|
||
"200": {
|
||
"description": "Successful Response",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"422": {
|
||
"description": "Validation Error",
|
||
"content": {
|
||
"application/json": {
|
||
"schema": {
|
||
"$ref": "#/components/schemas/HTTPValidationError"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"components": {
|
||
"schemas": {
|
||
"ArticleForResponse": {
|
||
"title": "ArticleForResponse",
|
||
"required": [
|
||
"slug",
|
||
"title",
|
||
"description",
|
||
"body",
|
||
"tagList",
|
||
"author",
|
||
"favorited",
|
||
"favoritesCount"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"createdAt": {
|
||
"title": "Createdat",
|
||
"type": "string",
|
||
"format": "date-time"
|
||
},
|
||
"updatedAt": {
|
||
"title": "Updatedat",
|
||
"type": "string",
|
||
"format": "date-time"
|
||
},
|
||
"id": {
|
||
"title": "Id",
|
||
"type": "integer",
|
||
"default": 0
|
||
},
|
||
"slug": {
|
||
"title": "Slug",
|
||
"type": "string"
|
||
},
|
||
"title": {
|
||
"title": "Title",
|
||
"type": "string"
|
||
},
|
||
"description": {
|
||
"title": "Description",
|
||
"type": "string"
|
||
},
|
||
"body": {
|
||
"title": "Body",
|
||
"type": "string"
|
||
},
|
||
"cover": {
|
||
"title": "Cover",
|
||
"type": "string"
|
||
},
|
||
"tagList": {
|
||
"title": "Taglist",
|
||
"type": "array",
|
||
"items": {
|
||
"type": "string"
|
||
}
|
||
},
|
||
"author": {
|
||
"$ref": "#/components/schemas/Profile"
|
||
},
|
||
"favorited": {
|
||
"title": "Favorited",
|
||
"type": "boolean"
|
||
},
|
||
"favoritesCount": {
|
||
"title": "Favoritescount",
|
||
"type": "integer"
|
||
}
|
||
},
|
||
"description": "返回给前端的文章结构:\n- 继承 Article(包含 cover、tags、author 等)\n- 其中 tags 字段通过 alias 暴露为 tagList,兼容现有前端"
|
||
},
|
||
"ArticleInCreate": {
|
||
"title": "ArticleInCreate",
|
||
"required": [
|
||
"title",
|
||
"description",
|
||
"body"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"title": {
|
||
"title": "Title",
|
||
"type": "string"
|
||
},
|
||
"description": {
|
||
"title": "Description",
|
||
"type": "string"
|
||
},
|
||
"body": {
|
||
"title": "Body",
|
||
"type": "string"
|
||
},
|
||
"tagList": {
|
||
"title": "Taglist",
|
||
"type": "array",
|
||
"items": {
|
||
"type": "string"
|
||
},
|
||
"default": []
|
||
},
|
||
"cover": {
|
||
"title": "Cover",
|
||
"type": "string"
|
||
}
|
||
},
|
||
"description": "创建文章时请求体:\n{\n \"article\": {\n \"title\": \"...\",\n \"description\": \"...\",\n \"body\": \"...\",\n \"tagList\": [\"...\"],\n \"cover\": \"可选封面URL\"\n }\n}"
|
||
},
|
||
"ArticleInResponse": {
|
||
"title": "ArticleInResponse",
|
||
"required": [
|
||
"article"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"article": {
|
||
"$ref": "#/components/schemas/ArticleForResponse"
|
||
}
|
||
}
|
||
},
|
||
"ArticleInUpdate": {
|
||
"title": "ArticleInUpdate",
|
||
"type": "object",
|
||
"properties": {
|
||
"title": {
|
||
"title": "Title",
|
||
"type": "string"
|
||
},
|
||
"description": {
|
||
"title": "Description",
|
||
"type": "string"
|
||
},
|
||
"body": {
|
||
"title": "Body",
|
||
"type": "string"
|
||
},
|
||
"cover": {
|
||
"title": "Cover",
|
||
"type": "string"
|
||
}
|
||
},
|
||
"description": "更新文章时请求体(全部可选):\n- 不传的字段不改\n- cover:\n - 不传:不改\n - 传 null / \"\":清空封面(配合 repo 里 cover_provided 使用)\n - 传字符串:更新为新封面"
|
||
},
|
||
"Body_articles_create_article_api_articles_post": {
|
||
"title": "Body_articles_create_article_api_articles_post",
|
||
"required": [
|
||
"article"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"article": {
|
||
"$ref": "#/components/schemas/ArticleInCreate"
|
||
}
|
||
}
|
||
},
|
||
"Body_articles_update_article_api_articles__slug__put": {
|
||
"title": "Body_articles_update_article_api_articles__slug__put",
|
||
"required": [
|
||
"article"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"article": {
|
||
"$ref": "#/components/schemas/ArticleInUpdate"
|
||
}
|
||
}
|
||
},
|
||
"Body_auth_login_api_auth_login_post": {
|
||
"title": "Body_auth_login_api_auth_login_post",
|
||
"required": [
|
||
"user"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"user": {
|
||
"$ref": "#/components/schemas/UserInLogin"
|
||
}
|
||
}
|
||
},
|
||
"Body_auth_register_api_auth_post": {
|
||
"title": "Body_auth_register_api_auth_post",
|
||
"required": [
|
||
"user"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"user": {
|
||
"$ref": "#/components/schemas/RegisterWithEmailIn"
|
||
}
|
||
}
|
||
},
|
||
"Body_comments_create_comment_for_article_api_articles__slug__comments_post": {
|
||
"title": "Body_comments_create_comment_for_article_api_articles__slug__comments_post",
|
||
"required": [
|
||
"comment"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"comment": {
|
||
"$ref": "#/components/schemas/CommentInCreate"
|
||
}
|
||
}
|
||
},
|
||
"Body_upload_image_api_upload_image_post": {
|
||
"title": "Body_upload_image_api_upload_image_post",
|
||
"required": [
|
||
"file"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"file": {
|
||
"title": "File",
|
||
"type": "string",
|
||
"format": "binary"
|
||
}
|
||
}
|
||
},
|
||
"Body_users_update_current_user_api_user_put": {
|
||
"title": "Body_users_update_current_user_api_user_put",
|
||
"required": [
|
||
"user"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"user": {
|
||
"$ref": "#/components/schemas/UserInUpdate"
|
||
}
|
||
}
|
||
},
|
||
"Comment": {
|
||
"title": "Comment",
|
||
"required": [
|
||
"body",
|
||
"author"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"createdAt": {
|
||
"title": "Createdat",
|
||
"type": "string",
|
||
"format": "date-time"
|
||
},
|
||
"updatedAt": {
|
||
"title": "Updatedat",
|
||
"type": "string",
|
||
"format": "date-time"
|
||
},
|
||
"id": {
|
||
"title": "Id",
|
||
"type": "integer",
|
||
"default": 0
|
||
},
|
||
"body": {
|
||
"title": "Body",
|
||
"type": "string"
|
||
},
|
||
"author": {
|
||
"$ref": "#/components/schemas/Profile"
|
||
}
|
||
}
|
||
},
|
||
"CommentInCreate": {
|
||
"title": "CommentInCreate",
|
||
"required": [
|
||
"body"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"body": {
|
||
"title": "Body",
|
||
"type": "string"
|
||
}
|
||
}
|
||
},
|
||
"CommentInResponse": {
|
||
"title": "CommentInResponse",
|
||
"required": [
|
||
"comment"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"comment": {
|
||
"$ref": "#/components/schemas/Comment"
|
||
}
|
||
}
|
||
},
|
||
"EmailCodeSendIn": {
|
||
"title": "EmailCodeSendIn",
|
||
"required": [
|
||
"email"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string",
|
||
"format": "email"
|
||
},
|
||
"scene": {
|
||
"allOf": [
|
||
{
|
||
"$ref": "#/components/schemas/EmailScene"
|
||
}
|
||
],
|
||
"default": "register"
|
||
}
|
||
}
|
||
},
|
||
"EmailCodeSendOut": {
|
||
"title": "EmailCodeSendOut",
|
||
"type": "object",
|
||
"properties": {
|
||
"ok": {
|
||
"title": "Ok",
|
||
"type": "boolean",
|
||
"default": true
|
||
}
|
||
}
|
||
},
|
||
"EmailScene": {
|
||
"title": "EmailScene",
|
||
"enum": [
|
||
"register",
|
||
"reset",
|
||
"login"
|
||
],
|
||
"type": "string",
|
||
"description": "An enumeration."
|
||
},
|
||
"HTTPValidationError": {
|
||
"title": "HTTPValidationError",
|
||
"type": "object",
|
||
"properties": {
|
||
"errors": {
|
||
"title": "Errors",
|
||
"type": "array",
|
||
"items": {
|
||
"$ref": "#/components/schemas/ValidationError"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"ListOfArticlesInResponse": {
|
||
"title": "ListOfArticlesInResponse",
|
||
"required": [
|
||
"articles",
|
||
"articlesCount"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"articles": {
|
||
"title": "Articles",
|
||
"type": "array",
|
||
"items": {
|
||
"$ref": "#/components/schemas/ArticleForResponse"
|
||
}
|
||
},
|
||
"articlesCount": {
|
||
"title": "Articlescount",
|
||
"type": "integer"
|
||
}
|
||
}
|
||
},
|
||
"ListOfCommentsInResponse": {
|
||
"title": "ListOfCommentsInResponse",
|
||
"required": [
|
||
"comments"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"comments": {
|
||
"title": "Comments",
|
||
"type": "array",
|
||
"items": {
|
||
"$ref": "#/components/schemas/Comment"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"PasswordForgotIn": {
|
||
"title": "PasswordForgotIn",
|
||
"required": [
|
||
"email"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string",
|
||
"format": "email"
|
||
}
|
||
}
|
||
},
|
||
"PasswordResetIn": {
|
||
"title": "PasswordResetIn",
|
||
"required": [
|
||
"email",
|
||
"code",
|
||
"password",
|
||
"confirm_password"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string",
|
||
"format": "email"
|
||
},
|
||
"code": {
|
||
"title": "Code",
|
||
"maxLength": 12,
|
||
"minLength": 4,
|
||
"type": "string"
|
||
},
|
||
"password": {
|
||
"title": "Password",
|
||
"minLength": 6,
|
||
"type": "string"
|
||
},
|
||
"confirm_password": {
|
||
"title": "Confirm Password",
|
||
"minLength": 6,
|
||
"type": "string"
|
||
}
|
||
}
|
||
},
|
||
"Profile": {
|
||
"title": "Profile",
|
||
"required": [
|
||
"username"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"username": {
|
||
"title": "Username",
|
||
"type": "string"
|
||
},
|
||
"bio": {
|
||
"title": "Bio",
|
||
"type": "string",
|
||
"default": ""
|
||
},
|
||
"image": {
|
||
"title": "Image",
|
||
"type": "string"
|
||
},
|
||
"following": {
|
||
"title": "Following",
|
||
"type": "boolean",
|
||
"default": false
|
||
}
|
||
}
|
||
},
|
||
"ProfileInResponse": {
|
||
"title": "ProfileInResponse",
|
||
"required": [
|
||
"profile"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"profile": {
|
||
"$ref": "#/components/schemas/Profile"
|
||
}
|
||
}
|
||
},
|
||
"RegisterWithEmailIn": {
|
||
"title": "RegisterWithEmailIn",
|
||
"required": [
|
||
"email",
|
||
"password",
|
||
"confirmPassword",
|
||
"code"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string",
|
||
"format": "email"
|
||
},
|
||
"password": {
|
||
"title": "Password",
|
||
"maxLength": 64,
|
||
"minLength": 6,
|
||
"type": "string"
|
||
},
|
||
"confirmPassword": {
|
||
"title": "Confirmpassword",
|
||
"maxLength": 64,
|
||
"minLength": 6,
|
||
"type": "string"
|
||
},
|
||
"code": {
|
||
"title": "Code",
|
||
"maxLength": 8,
|
||
"minLength": 4,
|
||
"type": "string"
|
||
}
|
||
},
|
||
"description": "邮箱注册:邮箱 + 密码 + 确认密码 + 验证码"
|
||
},
|
||
"TagsInList": {
|
||
"title": "TagsInList",
|
||
"required": [
|
||
"tags"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"tags": {
|
||
"title": "Tags",
|
||
"type": "array",
|
||
"items": {
|
||
"type": "string"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"UserInLogin": {
|
||
"title": "UserInLogin",
|
||
"required": [
|
||
"email",
|
||
"password"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string",
|
||
"format": "email"
|
||
},
|
||
"password": {
|
||
"title": "Password",
|
||
"type": "string"
|
||
}
|
||
}
|
||
},
|
||
"UserInResponse": {
|
||
"title": "UserInResponse",
|
||
"required": [
|
||
"user"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"user": {
|
||
"$ref": "#/components/schemas/UserWithToken"
|
||
}
|
||
}
|
||
},
|
||
"UserInUpdate": {
|
||
"title": "UserInUpdate",
|
||
"type": "object",
|
||
"properties": {
|
||
"username": {
|
||
"title": "Username",
|
||
"type": "string"
|
||
},
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string",
|
||
"format": "email"
|
||
},
|
||
"password": {
|
||
"title": "Password",
|
||
"type": "string"
|
||
},
|
||
"bio": {
|
||
"title": "Bio",
|
||
"type": "string"
|
||
},
|
||
"image": {
|
||
"title": "Image",
|
||
"maxLength": 2083,
|
||
"minLength": 1,
|
||
"type": "string",
|
||
"format": "uri"
|
||
}
|
||
}
|
||
},
|
||
"UserWithToken": {
|
||
"title": "UserWithToken",
|
||
"required": [
|
||
"username",
|
||
"email",
|
||
"token"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"username": {
|
||
"title": "Username",
|
||
"type": "string"
|
||
},
|
||
"email": {
|
||
"title": "Email",
|
||
"type": "string"
|
||
},
|
||
"bio": {
|
||
"title": "Bio",
|
||
"type": "string",
|
||
"default": ""
|
||
},
|
||
"image": {
|
||
"title": "Image",
|
||
"type": "string"
|
||
},
|
||
"emailVerified": {
|
||
"title": "Emailverified",
|
||
"type": "boolean",
|
||
"default": false
|
||
},
|
||
"token": {
|
||
"title": "Token",
|
||
"type": "string"
|
||
}
|
||
},
|
||
"description": "公开用户信息(会被用于文章作者、Profile 等场景)。\n新增 email_verified 字段,便于前端展示与登录后逻辑判断。"
|
||
},
|
||
"ValidationError": {
|
||
"title": "ValidationError",
|
||
"required": [
|
||
"loc",
|
||
"msg",
|
||
"type"
|
||
],
|
||
"type": "object",
|
||
"properties": {
|
||
"loc": {
|
||
"title": "Location",
|
||
"type": "array",
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "integer"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"msg": {
|
||
"title": "Message",
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"title": "Error Type",
|
||
"type": "string"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"securitySchemes": {
|
||
"RWAPIKeyHeader": {
|
||
"type": "apiKey",
|
||
"in": "header",
|
||
"name": "Authorization"
|
||
}
|
||
}
|
||
}
|
||
} |