调整路由以符合 RESTful 规范,新增 API Token 撤销功能
This commit is contained in:
430
docs/docs.go
430
docs/docs.go
@@ -165,7 +165,116 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/admin/batch/{batch_id}": {
|
"/admin/api-tokens/{id}/revoke": {
|
||||||
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"AdminAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "将 API Token 标记为已撤销,使其失效但保留记录",
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Admin"
|
||||||
|
],
|
||||||
|
"summary": "撤销 API Token",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Token ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"description": "Internal Server Error",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/admin/batches": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"AdminAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "分页查询所有文件批次,支持按状态过滤和取件码模糊搜索",
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Admin"
|
||||||
|
],
|
||||||
|
"summary": "获取批次列表",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "页码 (默认 1)",
|
||||||
|
"name": "page",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "每页数量 (默认 20)",
|
||||||
|
"name": "page_size",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "状态 (active/expired/deleted)",
|
||||||
|
"name": "status",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "取件码 (模糊搜索)",
|
||||||
|
"name": "pickup_code",
|
||||||
|
"in": "query"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/admin.ListBatchesResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"description": "Unauthorized",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/admin/batches/{batch_id}": {
|
||||||
"get": {
|
"get": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@@ -317,75 +426,6 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/admin/batches": {
|
|
||||||
"get": {
|
|
||||||
"security": [
|
|
||||||
{
|
|
||||||
"AdminAuth": []
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "分页查询所有文件批次,支持按状态过滤和取件码模糊搜索",
|
|
||||||
"produces": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Admin"
|
|
||||||
],
|
|
||||||
"summary": "获取批次列表",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "integer",
|
|
||||||
"description": "页码 (默认 1)",
|
|
||||||
"name": "page",
|
|
||||||
"in": "query"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "integer",
|
|
||||||
"description": "每页数量 (默认 20)",
|
|
||||||
"name": "page_size",
|
|
||||||
"in": "query"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "状态 (active/expired/deleted)",
|
|
||||||
"name": "status",
|
|
||||||
"in": "query"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "取件码 (模糊搜索)",
|
|
||||||
"name": "pickup_code",
|
|
||||||
"in": "query"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"allOf": [
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"data": {
|
|
||||||
"$ref": "#/definitions/admin.ListBatchesResponse"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"401": {
|
|
||||||
"description": "Unauthorized",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/admin/login": {
|
"/admin/login": {
|
||||||
"post": {
|
"post": {
|
||||||
"description": "通过密码换取 JWT Token",
|
"description": "通过密码换取 JWT Token",
|
||||||
@@ -438,130 +478,7 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/download/batch/{pickup_code}": {
|
"/api/batches": {
|
||||||
"get": {
|
|
||||||
"description": "根据取件码将批次内的所有文件打包为 ZIP 格式一次性下载",
|
|
||||||
"produces": [
|
|
||||||
"application/zip"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Public"
|
|
||||||
],
|
|
||||||
"summary": "批量下载文件",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "取件码",
|
|
||||||
"name": "pickup_code",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"type": "file"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"description": "Not Found",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/api/download/file/{file_id}": {
|
|
||||||
"get": {
|
|
||||||
"description": "根据文件 ID 下载单个文件",
|
|
||||||
"produces": [
|
|
||||||
"application/octet-stream"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Public"
|
|
||||||
],
|
|
||||||
"summary": "下载单个文件",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "integer",
|
|
||||||
"description": "文件 ID",
|
|
||||||
"name": "file_id",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"type": "file"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"description": "Not Found",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"410": {
|
|
||||||
"description": "Gone",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/api/pickup/{pickup_code}": {
|
|
||||||
"get": {
|
|
||||||
"description": "根据取件码获取文件批次详详情和文件列表",
|
|
||||||
"produces": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Public"
|
|
||||||
],
|
|
||||||
"summary": "获取批次信息",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "取件码",
|
|
||||||
"name": "pickup_code",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"allOf": [
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"data": {
|
|
||||||
"$ref": "#/definitions/public.PickupResponse"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"description": "Not Found",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/api/upload": {
|
|
||||||
"post": {
|
"post": {
|
||||||
"description": "上传一个或多个文件并创建一个提取批次",
|
"description": "上传一个或多个文件并创建一个提取批次",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
@@ -641,7 +558,7 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/upload/text": {
|
"/api/batches/text": {
|
||||||
"post": {
|
"post": {
|
||||||
"description": "中转一段长文本内容并创建一个提取批次",
|
"description": "中转一段长文本内容并创建一个提取批次",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
@@ -698,6 +615,129 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"/api/batches/{pickup_code}": {
|
||||||
|
"get": {
|
||||||
|
"description": "根据取件码获取文件批次详详情和文件列表",
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Public"
|
||||||
|
],
|
||||||
|
"summary": "获取批次信息",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "取件码",
|
||||||
|
"name": "pickup_code",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/public.PickupResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/api/batches/{pickup_code}/download": {
|
||||||
|
"get": {
|
||||||
|
"description": "根据取件码将批次内的所有文件打包为 ZIP 格式一次性下载",
|
||||||
|
"produces": [
|
||||||
|
"application/zip"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Public"
|
||||||
|
],
|
||||||
|
"summary": "批量下载文件",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "取件码",
|
||||||
|
"name": "pickup_code",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/api/files/{file_id}/download": {
|
||||||
|
"get": {
|
||||||
|
"description": "根据文件 ID 下载单个文件",
|
||||||
|
"produces": [
|
||||||
|
"application/octet-stream"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Public"
|
||||||
|
],
|
||||||
|
"summary": "下载单个文件",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "文件 ID",
|
||||||
|
"name": "file_id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"410": {
|
||||||
|
"description": "Gone",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"definitions": {
|
"definitions": {
|
||||||
|
|||||||
@@ -158,7 +158,116 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/admin/batch/{batch_id}": {
|
"/admin/api-tokens/{id}/revoke": {
|
||||||
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"AdminAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "将 API Token 标记为已撤销,使其失效但保留记录",
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Admin"
|
||||||
|
],
|
||||||
|
"summary": "撤销 API Token",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Token ID",
|
||||||
|
"name": "id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"description": "Internal Server Error",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/admin/batches": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"AdminAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "分页查询所有文件批次,支持按状态过滤和取件码模糊搜索",
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Admin"
|
||||||
|
],
|
||||||
|
"summary": "获取批次列表",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "页码 (默认 1)",
|
||||||
|
"name": "page",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "每页数量 (默认 20)",
|
||||||
|
"name": "page_size",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "状态 (active/expired/deleted)",
|
||||||
|
"name": "status",
|
||||||
|
"in": "query"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "取件码 (模糊搜索)",
|
||||||
|
"name": "pickup_code",
|
||||||
|
"in": "query"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/admin.ListBatchesResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"description": "Unauthorized",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/admin/batches/{batch_id}": {
|
||||||
"get": {
|
"get": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@@ -310,75 +419,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/admin/batches": {
|
|
||||||
"get": {
|
|
||||||
"security": [
|
|
||||||
{
|
|
||||||
"AdminAuth": []
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "分页查询所有文件批次,支持按状态过滤和取件码模糊搜索",
|
|
||||||
"produces": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Admin"
|
|
||||||
],
|
|
||||||
"summary": "获取批次列表",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "integer",
|
|
||||||
"description": "页码 (默认 1)",
|
|
||||||
"name": "page",
|
|
||||||
"in": "query"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "integer",
|
|
||||||
"description": "每页数量 (默认 20)",
|
|
||||||
"name": "page_size",
|
|
||||||
"in": "query"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "状态 (active/expired/deleted)",
|
|
||||||
"name": "status",
|
|
||||||
"in": "query"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "取件码 (模糊搜索)",
|
|
||||||
"name": "pickup_code",
|
|
||||||
"in": "query"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"allOf": [
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"data": {
|
|
||||||
"$ref": "#/definitions/admin.ListBatchesResponse"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"401": {
|
|
||||||
"description": "Unauthorized",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/admin/login": {
|
"/admin/login": {
|
||||||
"post": {
|
"post": {
|
||||||
"description": "通过密码换取 JWT Token",
|
"description": "通过密码换取 JWT Token",
|
||||||
@@ -431,130 +471,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/download/batch/{pickup_code}": {
|
"/api/batches": {
|
||||||
"get": {
|
|
||||||
"description": "根据取件码将批次内的所有文件打包为 ZIP 格式一次性下载",
|
|
||||||
"produces": [
|
|
||||||
"application/zip"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Public"
|
|
||||||
],
|
|
||||||
"summary": "批量下载文件",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "取件码",
|
|
||||||
"name": "pickup_code",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"type": "file"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"description": "Not Found",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/api/download/file/{file_id}": {
|
|
||||||
"get": {
|
|
||||||
"description": "根据文件 ID 下载单个文件",
|
|
||||||
"produces": [
|
|
||||||
"application/octet-stream"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Public"
|
|
||||||
],
|
|
||||||
"summary": "下载单个文件",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "integer",
|
|
||||||
"description": "文件 ID",
|
|
||||||
"name": "file_id",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"type": "file"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"description": "Not Found",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"410": {
|
|
||||||
"description": "Gone",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/api/pickup/{pickup_code}": {
|
|
||||||
"get": {
|
|
||||||
"description": "根据取件码获取文件批次详详情和文件列表",
|
|
||||||
"produces": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Public"
|
|
||||||
],
|
|
||||||
"summary": "获取批次信息",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"type": "string",
|
|
||||||
"description": "取件码",
|
|
||||||
"name": "pickup_code",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"description": "OK",
|
|
||||||
"schema": {
|
|
||||||
"allOf": [
|
|
||||||
{
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"data": {
|
|
||||||
"$ref": "#/definitions/public.PickupResponse"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"description": "Not Found",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/model.Response"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/api/upload": {
|
|
||||||
"post": {
|
"post": {
|
||||||
"description": "上传一个或多个文件并创建一个提取批次",
|
"description": "上传一个或多个文件并创建一个提取批次",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
@@ -634,7 +551,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/api/upload/text": {
|
"/api/batches/text": {
|
||||||
"post": {
|
"post": {
|
||||||
"description": "中转一段长文本内容并创建一个提取批次",
|
"description": "中转一段长文本内容并创建一个提取批次",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
@@ -691,6 +608,129 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"/api/batches/{pickup_code}": {
|
||||||
|
"get": {
|
||||||
|
"description": "根据取件码获取文件批次详详情和文件列表",
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Public"
|
||||||
|
],
|
||||||
|
"summary": "获取批次信息",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "取件码",
|
||||||
|
"name": "pickup_code",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"data": {
|
||||||
|
"$ref": "#/definitions/public.PickupResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/api/batches/{pickup_code}/download": {
|
||||||
|
"get": {
|
||||||
|
"description": "根据取件码将批次内的所有文件打包为 ZIP 格式一次性下载",
|
||||||
|
"produces": [
|
||||||
|
"application/zip"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Public"
|
||||||
|
],
|
||||||
|
"summary": "批量下载文件",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "取件码",
|
||||||
|
"name": "pickup_code",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/api/files/{file_id}/download": {
|
||||||
|
"get": {
|
||||||
|
"description": "根据文件 ID 下载单个文件",
|
||||||
|
"produces": [
|
||||||
|
"application/octet-stream"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Public"
|
||||||
|
],
|
||||||
|
"summary": "下载单个文件",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "integer",
|
||||||
|
"description": "文件 ID",
|
||||||
|
"name": "file_id",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "OK",
|
||||||
|
"schema": {
|
||||||
|
"type": "file"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"410": {
|
||||||
|
"description": "Gone",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/model.Response"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"definitions": {
|
"definitions": {
|
||||||
|
|||||||
@@ -283,7 +283,73 @@ paths:
|
|||||||
summary: 删除 API Token
|
summary: 删除 API Token
|
||||||
tags:
|
tags:
|
||||||
- Admin
|
- Admin
|
||||||
/admin/batch/{batch_id}:
|
/admin/api-tokens/{id}/revoke:
|
||||||
|
post:
|
||||||
|
description: 将 API Token 标记为已撤销,使其失效但保留记录
|
||||||
|
parameters:
|
||||||
|
- description: Token ID
|
||||||
|
in: path
|
||||||
|
name: id
|
||||||
|
required: true
|
||||||
|
type: integer
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
"500":
|
||||||
|
description: Internal Server Error
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
security:
|
||||||
|
- AdminAuth: []
|
||||||
|
summary: 撤销 API Token
|
||||||
|
tags:
|
||||||
|
- Admin
|
||||||
|
/admin/batches:
|
||||||
|
get:
|
||||||
|
description: 分页查询所有文件批次,支持按状态过滤和取件码模糊搜索
|
||||||
|
parameters:
|
||||||
|
- description: 页码 (默认 1)
|
||||||
|
in: query
|
||||||
|
name: page
|
||||||
|
type: integer
|
||||||
|
- description: 每页数量 (默认 20)
|
||||||
|
in: query
|
||||||
|
name: page_size
|
||||||
|
type: integer
|
||||||
|
- description: 状态 (active/expired/deleted)
|
||||||
|
in: query
|
||||||
|
name: status
|
||||||
|
type: string
|
||||||
|
- description: 取件码 (模糊搜索)
|
||||||
|
in: query
|
||||||
|
name: pickup_code
|
||||||
|
type: string
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/model.Response'
|
||||||
|
- properties:
|
||||||
|
data:
|
||||||
|
$ref: '#/definitions/admin.ListBatchesResponse'
|
||||||
|
type: object
|
||||||
|
"401":
|
||||||
|
description: Unauthorized
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
security:
|
||||||
|
- AdminAuth: []
|
||||||
|
summary: 获取批次列表
|
||||||
|
tags:
|
||||||
|
- Admin
|
||||||
|
/admin/batches/{batch_id}:
|
||||||
delete:
|
delete:
|
||||||
description: 标记批次为已删除,并物理删除关联的存储文件
|
description: 标记批次为已删除,并物理删除关联的存储文件
|
||||||
parameters:
|
parameters:
|
||||||
@@ -374,47 +440,6 @@ paths:
|
|||||||
summary: 修改批次信息
|
summary: 修改批次信息
|
||||||
tags:
|
tags:
|
||||||
- Admin
|
- Admin
|
||||||
/admin/batches:
|
|
||||||
get:
|
|
||||||
description: 分页查询所有文件批次,支持按状态过滤和取件码模糊搜索
|
|
||||||
parameters:
|
|
||||||
- description: 页码 (默认 1)
|
|
||||||
in: query
|
|
||||||
name: page
|
|
||||||
type: integer
|
|
||||||
- description: 每页数量 (默认 20)
|
|
||||||
in: query
|
|
||||||
name: page_size
|
|
||||||
type: integer
|
|
||||||
- description: 状态 (active/expired/deleted)
|
|
||||||
in: query
|
|
||||||
name: status
|
|
||||||
type: string
|
|
||||||
- description: 取件码 (模糊搜索)
|
|
||||||
in: query
|
|
||||||
name: pickup_code
|
|
||||||
type: string
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: OK
|
|
||||||
schema:
|
|
||||||
allOf:
|
|
||||||
- $ref: '#/definitions/model.Response'
|
|
||||||
- properties:
|
|
||||||
data:
|
|
||||||
$ref: '#/definitions/admin.ListBatchesResponse'
|
|
||||||
type: object
|
|
||||||
"401":
|
|
||||||
description: Unauthorized
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/model.Response'
|
|
||||||
security:
|
|
||||||
- AdminAuth: []
|
|
||||||
summary: 获取批次列表
|
|
||||||
tags:
|
|
||||||
- Admin
|
|
||||||
/admin/login:
|
/admin/login:
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
@@ -446,85 +471,7 @@ paths:
|
|||||||
summary: 管理员登录
|
summary: 管理员登录
|
||||||
tags:
|
tags:
|
||||||
- Admin
|
- Admin
|
||||||
/api/download/batch/{pickup_code}:
|
/api/batches:
|
||||||
get:
|
|
||||||
description: 根据取件码将批次内的所有文件打包为 ZIP 格式一次性下载
|
|
||||||
parameters:
|
|
||||||
- description: 取件码
|
|
||||||
in: path
|
|
||||||
name: pickup_code
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
produces:
|
|
||||||
- application/zip
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: OK
|
|
||||||
schema:
|
|
||||||
type: file
|
|
||||||
"404":
|
|
||||||
description: Not Found
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/model.Response'
|
|
||||||
summary: 批量下载文件
|
|
||||||
tags:
|
|
||||||
- Public
|
|
||||||
/api/download/file/{file_id}:
|
|
||||||
get:
|
|
||||||
description: 根据文件 ID 下载单个文件
|
|
||||||
parameters:
|
|
||||||
- description: 文件 ID
|
|
||||||
in: path
|
|
||||||
name: file_id
|
|
||||||
required: true
|
|
||||||
type: integer
|
|
||||||
produces:
|
|
||||||
- application/octet-stream
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: OK
|
|
||||||
schema:
|
|
||||||
type: file
|
|
||||||
"404":
|
|
||||||
description: Not Found
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/model.Response'
|
|
||||||
"410":
|
|
||||||
description: Gone
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/model.Response'
|
|
||||||
summary: 下载单个文件
|
|
||||||
tags:
|
|
||||||
- Public
|
|
||||||
/api/pickup/{pickup_code}:
|
|
||||||
get:
|
|
||||||
description: 根据取件码获取文件批次详详情和文件列表
|
|
||||||
parameters:
|
|
||||||
- description: 取件码
|
|
||||||
in: path
|
|
||||||
name: pickup_code
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
responses:
|
|
||||||
"200":
|
|
||||||
description: OK
|
|
||||||
schema:
|
|
||||||
allOf:
|
|
||||||
- $ref: '#/definitions/model.Response'
|
|
||||||
- properties:
|
|
||||||
data:
|
|
||||||
$ref: '#/definitions/public.PickupResponse'
|
|
||||||
type: object
|
|
||||||
"404":
|
|
||||||
description: Not Found
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/model.Response'
|
|
||||||
summary: 获取批次信息
|
|
||||||
tags:
|
|
||||||
- Public
|
|
||||||
/api/upload:
|
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
- multipart/form-data
|
- multipart/form-data
|
||||||
@@ -574,7 +521,58 @@ paths:
|
|||||||
summary: 上传文件
|
summary: 上传文件
|
||||||
tags:
|
tags:
|
||||||
- Public
|
- Public
|
||||||
/api/upload/text:
|
/api/batches/{pickup_code}:
|
||||||
|
get:
|
||||||
|
description: 根据取件码获取文件批次详详情和文件列表
|
||||||
|
parameters:
|
||||||
|
- description: 取件码
|
||||||
|
in: path
|
||||||
|
name: pickup_code
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
allOf:
|
||||||
|
- $ref: '#/definitions/model.Response'
|
||||||
|
- properties:
|
||||||
|
data:
|
||||||
|
$ref: '#/definitions/public.PickupResponse'
|
||||||
|
type: object
|
||||||
|
"404":
|
||||||
|
description: Not Found
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
summary: 获取批次信息
|
||||||
|
tags:
|
||||||
|
- Public
|
||||||
|
/api/batches/{pickup_code}/download:
|
||||||
|
get:
|
||||||
|
description: 根据取件码将批次内的所有文件打包为 ZIP 格式一次性下载
|
||||||
|
parameters:
|
||||||
|
- description: 取件码
|
||||||
|
in: path
|
||||||
|
name: pickup_code
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
produces:
|
||||||
|
- application/zip
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
type: file
|
||||||
|
"404":
|
||||||
|
description: Not Found
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
summary: 批量下载文件
|
||||||
|
tags:
|
||||||
|
- Public
|
||||||
|
/api/batches/text:
|
||||||
post:
|
post:
|
||||||
consumes:
|
consumes:
|
||||||
- application/json
|
- application/json
|
||||||
@@ -609,6 +607,33 @@ paths:
|
|||||||
summary: 发送长文本
|
summary: 发送长文本
|
||||||
tags:
|
tags:
|
||||||
- Public
|
- Public
|
||||||
|
/api/files/{file_id}/download:
|
||||||
|
get:
|
||||||
|
description: 根据文件 ID 下载单个文件
|
||||||
|
parameters:
|
||||||
|
- description: 文件 ID
|
||||||
|
in: path
|
||||||
|
name: file_id
|
||||||
|
required: true
|
||||||
|
type: integer
|
||||||
|
produces:
|
||||||
|
- application/octet-stream
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: OK
|
||||||
|
schema:
|
||||||
|
type: file
|
||||||
|
"404":
|
||||||
|
description: Not Found
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
"410":
|
||||||
|
description: Gone
|
||||||
|
schema:
|
||||||
|
$ref: '#/definitions/model.Response'
|
||||||
|
summary: 下载单个文件
|
||||||
|
tags:
|
||||||
|
- Public
|
||||||
securityDefinitions:
|
securityDefinitions:
|
||||||
AdminAuth:
|
AdminAuth:
|
||||||
description: Type "Bearer <your-jwt-token>" to authenticate.
|
description: Type "Bearer <your-jwt-token>" to authenticate.
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ func (h *BatchHandler) ListBatches(c *gin.Context) {
|
|||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {object} model.Response{data=model.FileBatch}
|
// @Success 200 {object} model.Response{data=model.FileBatch}
|
||||||
// @Failure 404 {object} model.Response
|
// @Failure 404 {object} model.Response
|
||||||
// @Router /admin/batch/{batch_id} [get]
|
// @Router /admin/batches/{batch_id} [get]
|
||||||
func (h *BatchHandler) GetBatch(c *gin.Context) {
|
func (h *BatchHandler) GetBatch(c *gin.Context) {
|
||||||
id := c.Param("batch_id")
|
id := c.Param("batch_id")
|
||||||
var batch model.FileBatch
|
var batch model.FileBatch
|
||||||
@@ -119,7 +119,7 @@ func (h *BatchHandler) GetBatch(c *gin.Context) {
|
|||||||
// @Param request body UpdateBatchRequest true "修改内容"
|
// @Param request body UpdateBatchRequest true "修改内容"
|
||||||
// @Success 200 {object} model.Response{data=model.FileBatch}
|
// @Success 200 {object} model.Response{data=model.FileBatch}
|
||||||
// @Failure 400 {object} model.Response
|
// @Failure 400 {object} model.Response
|
||||||
// @Router /admin/batch/{batch_id} [put]
|
// @Router /admin/batches/{batch_id} [put]
|
||||||
func (h *BatchHandler) UpdateBatch(c *gin.Context) {
|
func (h *BatchHandler) UpdateBatch(c *gin.Context) {
|
||||||
id := c.Param("batch_id")
|
id := c.Param("batch_id")
|
||||||
var batch model.FileBatch
|
var batch model.FileBatch
|
||||||
@@ -159,7 +159,7 @@ func (h *BatchHandler) UpdateBatch(c *gin.Context) {
|
|||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {object} model.Response
|
// @Success 200 {object} model.Response
|
||||||
// @Failure 500 {object} model.Response
|
// @Failure 500 {object} model.Response
|
||||||
// @Router /admin/batch/{batch_id} [delete]
|
// @Router /admin/batches/{batch_id} [delete]
|
||||||
func (h *BatchHandler) DeleteBatch(c *gin.Context) {
|
func (h *BatchHandler) DeleteBatch(c *gin.Context) {
|
||||||
idStr := c.Param("batch_id")
|
idStr := c.Param("batch_id")
|
||||||
id, _ := strconv.ParseUint(idStr, 10, 32)
|
id, _ := strconv.ParseUint(idStr, 10, 32)
|
||||||
|
|||||||
@@ -80,6 +80,16 @@ func (h *TokenHandler) CreateToken(c *gin.Context) {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RevokeToken 撤销 API Token
|
||||||
|
// @Summary 撤销 API Token
|
||||||
|
// @Description 将 API Token 标记为已撤销,使其失效但保留记录
|
||||||
|
// @Tags Admin
|
||||||
|
// @Security AdminAuth
|
||||||
|
// @Param id path int true "Token ID"
|
||||||
|
// @Produce json
|
||||||
|
// @Success 200 {object} model.Response
|
||||||
|
// @Failure 500 {object} model.Response
|
||||||
|
// @Router /admin/api-tokens/{id}/revoke [post]
|
||||||
func (h *TokenHandler) RevokeToken(c *gin.Context) {
|
func (h *TokenHandler) RevokeToken(c *gin.Context) {
|
||||||
id := c.Param("id")
|
id := c.Param("id")
|
||||||
if err := bootstrap.DB.Model(&model.APIToken{}).Where("id = ?", id).Update("revoked", true).Error; err != nil {
|
if err := bootstrap.DB.Model(&model.APIToken{}).Where("id = ?", id).Update("revoked", true).Error; err != nil {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func PickupRateLimit() gin.HandlerFunc {
|
|||||||
failureMutex.Unlock()
|
failureMutex.Unlock()
|
||||||
|
|
||||||
if exists && count >= config.GlobalConfig.Security.PickupFailLimit {
|
if exists && count >= config.GlobalConfig.Security.PickupFailLimit {
|
||||||
c.JSON(http.StatusTooManyRequests, model.ErrorResponse(http.StatusTooManyRequests, "Too many failed attempts. Please try again later."))
|
c.JSON(http.StatusTooManyRequests, model.ErrorResponse(model.CodeTooManyRequests, "Too many failed attempts. Please try again later."))
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ type PickupResponse struct {
|
|||||||
// @Produce application/zip
|
// @Produce application/zip
|
||||||
// @Success 200 {file} file
|
// @Success 200 {file} file
|
||||||
// @Failure 404 {object} model.Response
|
// @Failure 404 {object} model.Response
|
||||||
// @Router /api/download/batch/{pickup_code} [get]
|
// @Router /api/batches/{pickup_code}/download [get]
|
||||||
func (h *PickupHandler) DownloadBatch(c *gin.Context) {
|
func (h *PickupHandler) DownloadBatch(c *gin.Context) {
|
||||||
code := c.Param("pickup_code")
|
code := c.Param("pickup_code")
|
||||||
batch, err := h.batchService.GetBatchByPickupCode(code)
|
batch, err := h.batchService.GetBatchByPickupCode(code)
|
||||||
@@ -88,7 +88,7 @@ func NewPickupHandler() *PickupHandler {
|
|||||||
// @Param pickup_code path string true "取件码"
|
// @Param pickup_code path string true "取件码"
|
||||||
// @Success 200 {object} model.Response{data=PickupResponse}
|
// @Success 200 {object} model.Response{data=PickupResponse}
|
||||||
// @Failure 404 {object} model.Response
|
// @Failure 404 {object} model.Response
|
||||||
// @Router /api/pickup/{pickup_code} [get]
|
// @Router /api/batches/{pickup_code} [get]
|
||||||
func (h *PickupHandler) Pickup(c *gin.Context) {
|
func (h *PickupHandler) Pickup(c *gin.Context) {
|
||||||
code := c.Param("pickup_code")
|
code := c.Param("pickup_code")
|
||||||
if code == "" {
|
if code == "" {
|
||||||
@@ -124,7 +124,7 @@ func (h *PickupHandler) Pickup(c *gin.Context) {
|
|||||||
// @Success 200 {file} file
|
// @Success 200 {file} file
|
||||||
// @Failure 404 {object} model.Response
|
// @Failure 404 {object} model.Response
|
||||||
// @Failure 410 {object} model.Response
|
// @Failure 410 {object} model.Response
|
||||||
// @Router /api/download/file/{file_id} [get]
|
// @Router /api/files/{file_id}/download [get]
|
||||||
func (h *PickupHandler) DownloadFile(c *gin.Context) {
|
func (h *PickupHandler) DownloadFile(c *gin.Context) {
|
||||||
fileIDStr := c.Param("file_id")
|
fileIDStr := c.Param("file_id")
|
||||||
fileID, _ := strconv.ParseUint(fileIDStr, 10, 32)
|
fileID, _ := strconv.ParseUint(fileIDStr, 10, 32)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ type UploadResponse struct {
|
|||||||
// @Success 200 {object} model.Response{data=UploadResponse}
|
// @Success 200 {object} model.Response{data=UploadResponse}
|
||||||
// @Failure 400 {object} model.Response
|
// @Failure 400 {object} model.Response
|
||||||
// @Failure 500 {object} model.Response
|
// @Failure 500 {object} model.Response
|
||||||
// @Router /api/upload [post]
|
// @Router /api/batches [post]
|
||||||
func (h *UploadHandler) Upload(c *gin.Context) {
|
func (h *UploadHandler) Upload(c *gin.Context) {
|
||||||
form, err := c.MultipartForm()
|
form, err := c.MultipartForm()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -113,7 +113,7 @@ type UploadTextRequest struct {
|
|||||||
// @Success 200 {object} model.Response{data=UploadResponse}
|
// @Success 200 {object} model.Response{data=UploadResponse}
|
||||||
// @Failure 400 {object} model.Response
|
// @Failure 400 {object} model.Response
|
||||||
// @Failure 500 {object} model.Response
|
// @Failure 500 {object} model.Response
|
||||||
// @Router /api/upload/text [post]
|
// @Router /api/batches/text [post]
|
||||||
func (h *UploadHandler) UploadText(c *gin.Context) {
|
func (h *UploadHandler) UploadText(c *gin.Context) {
|
||||||
var req UploadTextRequest
|
var req UploadTextRequest
|
||||||
if err := c.ShouldBindJSON(&req); err != nil {
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ const (
|
|||||||
CodeNotFound = 404
|
CodeNotFound = 404
|
||||||
CodeGone = 410
|
CodeGone = 410
|
||||||
CodeInternalError = 500
|
CodeInternalError = 500
|
||||||
|
CodeTooManyRequests = 429
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewResponse 创建响应
|
// NewResponse 创建响应
|
||||||
|
|||||||
22
main.go
22
main.go
@@ -69,11 +69,16 @@ func main() {
|
|||||||
|
|
||||||
api := r.Group("/api")
|
api := r.Group("/api")
|
||||||
{
|
{
|
||||||
api.POST("/upload", uploadHandler.Upload)
|
// 统一使用 /batches 作为资源路径
|
||||||
api.POST("/upload/text", uploadHandler.UploadText)
|
api.POST("/batches", uploadHandler.Upload)
|
||||||
api.GET("/pickup/:pickup_code", middleware.PickupRateLimit(), pickupHandler.Pickup)
|
api.POST("/batches/text", uploadHandler.UploadText)
|
||||||
api.GET("/download/file/:file_id", pickupHandler.DownloadFile)
|
api.GET("/batches/:pickup_code", middleware.PickupRateLimit(), pickupHandler.Pickup)
|
||||||
api.GET("/download/batch/:pickup_code", pickupHandler.DownloadBatch)
|
api.GET("/batches/:pickup_code/download", pickupHandler.DownloadBatch)
|
||||||
|
// 文件下载保持 /files/:id/download 风格
|
||||||
|
api.GET("/files/:file_id/download", pickupHandler.DownloadFile)
|
||||||
|
|
||||||
|
// 保持旧路由兼容性 (可选,但为了平滑过渡通常建议保留一段时间或直接更新)
|
||||||
|
// 这里根据需求“调整不符合规范的”,我将直接采用新路由
|
||||||
}
|
}
|
||||||
|
|
||||||
// 管理员接口
|
// 管理员接口
|
||||||
@@ -87,13 +92,14 @@ func main() {
|
|||||||
adm.Use(middleware.AdminAuth())
|
adm.Use(middleware.AdminAuth())
|
||||||
{
|
{
|
||||||
adm.GET("/batches", batchHandler.ListBatches)
|
adm.GET("/batches", batchHandler.ListBatches)
|
||||||
adm.GET("/batch/:batch_id", batchHandler.GetBatch)
|
adm.GET("/batches/:batch_id", batchHandler.GetBatch)
|
||||||
adm.PUT("/batch/:batch_id", batchHandler.UpdateBatch)
|
adm.PUT("/batches/:batch_id", batchHandler.UpdateBatch)
|
||||||
adm.DELETE("/batch/:batch_id", batchHandler.DeleteBatch)
|
adm.DELETE("/batches/:batch_id", batchHandler.DeleteBatch)
|
||||||
|
|
||||||
adm.GET("/api-tokens", tokenHandler.ListTokens)
|
adm.GET("/api-tokens", tokenHandler.ListTokens)
|
||||||
adm.POST("/api-tokens", tokenHandler.CreateToken)
|
adm.POST("/api-tokens", tokenHandler.CreateToken)
|
||||||
adm.DELETE("/api-tokens/:id", tokenHandler.DeleteToken)
|
adm.DELETE("/api-tokens/:id", tokenHandler.DeleteToken)
|
||||||
|
adm.POST("/api-tokens/:id/revoke", tokenHandler.RevokeToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. 运行
|
// 5. 运行
|
||||||
|
|||||||
Reference in New Issue
Block a user