refactor(storage): drop per-upload storage_driver, use storage_config as single source

Remove w_uploads.storage_driver and route all read/write/delete paths through
storage.Active() backed by storage_config.driver. Block direct driver switches
when uploads exist; require migration task instead. Simplify migration to
cursor-based file_path iteration without per-row driver updates.
This commit is contained in:
ryan
2026-06-18 13:56:31 +08:00
parent 1f391e9ec2
commit 410ff14795
25 changed files with 512 additions and 604 deletions
+133 -137
View File
@@ -3367,7 +3367,7 @@ const docTemplate = `{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/upload.listFilesResponse"
"$ref": "#/definitions/handler.listFilesResponse"
}
}
}
@@ -3414,7 +3414,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/upload.batchDownloadRequest"
"$ref": "#/definitions/handler.batchDownloadRequest"
}
}
],
@@ -3525,7 +3525,7 @@ const docTemplate = `{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/upload.fileStatsResponse"
"$ref": "#/definitions/handler.fileStatsResponse"
}
}
}
@@ -4654,7 +4654,7 @@ const docTemplate = `{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/upload.listMyFilesResponse"
"$ref": "#/definitions/handler.listMyFilesResponse"
}
}
}
@@ -4702,7 +4702,7 @@ const docTemplate = `{
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/upload.updateMyFileRequest"
"$ref": "#/definitions/handler.updateMyFileRequest"
}
}
],
@@ -5688,6 +5688,134 @@ const docTemplate = `{
}
}
},
"handler.batchDownloadRequest": {
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"handler.distributionItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"name": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"handler.fileStatsResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/handler.distributionItem"
}
},
"total_count": {
"type": "integer"
},
"total_size": {
"type": "integer"
},
"trend": {
"type": "array",
"items": {
"$ref": "#/definitions/handler.trendItem"
}
},
"types": {
"type": "array",
"items": {
"$ref": "#/definitions/handler.distributionItem"
}
}
}
},
"handler.listFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"handler.listMyFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"handler.trendItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"date": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"handler.updateMyFileRequest": {
"type": "object",
"properties": {
"access_mode": {
"type": "integer",
"enum": [
0,
1
]
},
"file_name": {
"type": "string",
"maxLength": 255
}
}
},
"logger.LogEntry": {
"type": "object",
"properties": {
@@ -6280,10 +6408,6 @@ const docTemplate = `{
}
]
},
"storage_driver": {
"description": "存储引擎驱动 (如 local, s3, oss)",
"type": "string"
},
"type": {
"description": "业务标识类型 (如 avatar, doc, attachment)",
"type": "string"
@@ -7197,134 +7321,6 @@ const docTemplate = `{
}
}
},
"upload.batchDownloadRequest": {
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"upload.distributionItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"name": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"upload.fileStatsResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/upload.distributionItem"
}
},
"total_count": {
"type": "integer"
},
"total_size": {
"type": "integer"
},
"trend": {
"type": "array",
"items": {
"$ref": "#/definitions/upload.trendItem"
}
},
"types": {
"type": "array",
"items": {
"$ref": "#/definitions/upload.distributionItem"
}
}
}
},
"upload.listFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"upload.listMyFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"upload.trendItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"date": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"upload.updateMyFileRequest": {
"type": "object",
"properties": {
"access_mode": {
"type": "integer",
"enum": [
0,
1
]
},
"file_name": {
"type": "string",
"maxLength": 255
}
}
},
"user.changePasswordRequest": {
"type": "object",
"properties": {
+133 -137
View File
@@ -3360,7 +3360,7 @@
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/upload.listFilesResponse"
"$ref": "#/definitions/handler.listFilesResponse"
}
}
}
@@ -3407,7 +3407,7 @@
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/upload.batchDownloadRequest"
"$ref": "#/definitions/handler.batchDownloadRequest"
}
}
],
@@ -3518,7 +3518,7 @@
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/upload.fileStatsResponse"
"$ref": "#/definitions/handler.fileStatsResponse"
}
}
}
@@ -4647,7 +4647,7 @@
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/upload.listMyFilesResponse"
"$ref": "#/definitions/handler.listMyFilesResponse"
}
}
}
@@ -4695,7 +4695,7 @@
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/upload.updateMyFileRequest"
"$ref": "#/definitions/handler.updateMyFileRequest"
}
}
],
@@ -5681,6 +5681,134 @@
}
}
},
"handler.batchDownloadRequest": {
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"handler.distributionItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"name": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"handler.fileStatsResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/handler.distributionItem"
}
},
"total_count": {
"type": "integer"
},
"total_size": {
"type": "integer"
},
"trend": {
"type": "array",
"items": {
"$ref": "#/definitions/handler.trendItem"
}
},
"types": {
"type": "array",
"items": {
"$ref": "#/definitions/handler.distributionItem"
}
}
}
},
"handler.listFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"handler.listMyFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"handler.trendItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"date": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"handler.updateMyFileRequest": {
"type": "object",
"properties": {
"access_mode": {
"type": "integer",
"enum": [
0,
1
]
},
"file_name": {
"type": "string",
"maxLength": 255
}
}
},
"logger.LogEntry": {
"type": "object",
"properties": {
@@ -6273,10 +6401,6 @@
}
]
},
"storage_driver": {
"description": "存储引擎驱动 (如 local, s3, oss)",
"type": "string"
},
"type": {
"description": "业务标识类型 (如 avatar, doc, attachment)",
"type": "string"
@@ -7190,134 +7314,6 @@
}
}
},
"upload.batchDownloadRequest": {
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"upload.distributionItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"name": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"upload.fileStatsResponse": {
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"$ref": "#/definitions/upload.distributionItem"
}
},
"total_count": {
"type": "integer"
},
"total_size": {
"type": "integer"
},
"trend": {
"type": "array",
"items": {
"$ref": "#/definitions/upload.trendItem"
}
},
"types": {
"type": "array",
"items": {
"$ref": "#/definitions/upload.distributionItem"
}
}
}
},
"upload.listFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"upload.listMyFilesResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/model.Upload"
}
},
"page": {
"type": "integer"
},
"page_size": {
"type": "integer"
},
"total": {
"type": "integer"
}
}
},
"upload.trendItem": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"date": {
"type": "string"
},
"size": {
"type": "integer"
}
}
},
"upload.updateMyFileRequest": {
"type": "object",
"properties": {
"access_mode": {
"type": "integer",
"enum": [
0,
1
]
},
"file_name": {
"type": "string",
"maxLength": 255
}
}
},
"user.changePasswordRequest": {
"type": "object",
"properties": {
+89 -92
View File
@@ -143,6 +143,90 @@ definitions:
token:
type: string
type: object
handler.batchDownloadRequest:
properties:
ids:
items:
type: string
minItems: 1
type: array
required:
- ids
type: object
handler.distributionItem:
properties:
count:
type: integer
name:
type: string
size:
type: integer
type: object
handler.fileStatsResponse:
properties:
categories:
items:
$ref: '#/definitions/handler.distributionItem'
type: array
total_count:
type: integer
total_size:
type: integer
trend:
items:
$ref: '#/definitions/handler.trendItem'
type: array
types:
items:
$ref: '#/definitions/handler.distributionItem'
type: array
type: object
handler.listFilesResponse:
properties:
items:
items:
$ref: '#/definitions/model.Upload'
type: array
page:
type: integer
page_size:
type: integer
total:
type: integer
type: object
handler.listMyFilesResponse:
properties:
items:
items:
$ref: '#/definitions/model.Upload'
type: array
page:
type: integer
page_size:
type: integer
total:
type: integer
type: object
handler.trendItem:
properties:
count:
type: integer
date:
type: string
size:
type: integer
type: object
handler.updateMyFileRequest:
properties:
access_mode:
enum:
- 0
- 1
type: integer
file_name:
maxLength: 255
type: string
type: object
logger.LogEntry:
properties:
data:
@@ -541,9 +625,6 @@ definitions:
allOf:
- $ref: '#/definitions/model.UploadStatus'
description: 状态
storage_driver:
description: 存储引擎驱动 (如 local, s3, oss)
type: string
type:
description: 业务标识类型 (如 avatar, doc, attachment)
type: string
@@ -1169,90 +1250,6 @@ definitions:
upstream_repository:
type: string
type: object
upload.batchDownloadRequest:
properties:
ids:
items:
type: string
minItems: 1
type: array
required:
- ids
type: object
upload.distributionItem:
properties:
count:
type: integer
name:
type: string
size:
type: integer
type: object
upload.fileStatsResponse:
properties:
categories:
items:
$ref: '#/definitions/upload.distributionItem'
type: array
total_count:
type: integer
total_size:
type: integer
trend:
items:
$ref: '#/definitions/upload.trendItem'
type: array
types:
items:
$ref: '#/definitions/upload.distributionItem'
type: array
type: object
upload.listFilesResponse:
properties:
items:
items:
$ref: '#/definitions/model.Upload'
type: array
page:
type: integer
page_size:
type: integer
total:
type: integer
type: object
upload.listMyFilesResponse:
properties:
items:
items:
$ref: '#/definitions/model.Upload'
type: array
page:
type: integer
page_size:
type: integer
total:
type: integer
type: object
upload.trendItem:
properties:
count:
type: integer
date:
type: string
size:
type: integer
type: object
upload.updateMyFileRequest:
properties:
access_mode:
enum:
- 0
- 1
type: integer
file_name:
maxLength: 255
type: string
type: object
user.changePasswordRequest:
properties:
new_password:
@@ -3409,7 +3406,7 @@ paths:
- $ref: '#/definitions/response.Any'
- properties:
data:
$ref: '#/definitions/upload.listFilesResponse'
$ref: '#/definitions/handler.listFilesResponse'
type: object
"401":
description: 未登录
@@ -3501,7 +3498,7 @@ paths:
name: request
required: true
schema:
$ref: '#/definitions/upload.batchDownloadRequest'
$ref: '#/definitions/handler.batchDownloadRequest'
produces:
- application/octet-stream
responses:
@@ -3535,7 +3532,7 @@ paths:
- $ref: '#/definitions/response.Any'
- properties:
data:
$ref: '#/definitions/upload.fileStatsResponse'
$ref: '#/definitions/handler.fileStatsResponse'
type: object
"401":
description: 未登录
@@ -4193,7 +4190,7 @@ paths:
name: request
required: true
schema:
$ref: '#/definitions/upload.updateMyFileRequest'
$ref: '#/definitions/handler.updateMyFileRequest'
produces:
- application/json
responses:
@@ -4253,7 +4250,7 @@ paths:
- $ref: '#/definitions/response.Any'
- properties:
data:
$ref: '#/definitions/upload.listMyFilesResponse'
$ref: '#/definitions/handler.listMyFilesResponse'
type: object
"401":
description: 未登录