77 */
88import { BaseRepository } from "./BaseRepository.js" ;
99import { DbTables } from "../constants/index.js" ;
10+ import { StorageFactory } from "../storage/factory/StorageFactory.js" ;
1011
1112export class StorageConfigRepository extends BaseRepository {
1213 /**
13- * 展开 S3 专用字段
14- * @private
15- * @param {object } cfg - config_json 解析后的对象
16- * @param {object } merged - 合并目标对象
17- * @param {object } options - 选项
18- */
19- _inflateS3Fields ( cfg , merged , { withSecrets = false } ) {
20- merged . provider_type = cfg ?. provider_type ;
21- merged . endpoint_url = cfg ?. endpoint_url ;
22- merged . bucket_name = cfg ?. bucket_name ;
23- merged . region = cfg ?. region ;
24- merged . path_style = cfg ?. path_style ;
25- if ( withSecrets ) {
26- merged . access_key_id = cfg ?. access_key_id ;
27- merged . secret_access_key = cfg ?. secret_access_key ;
28- }
29- }
30-
31- /**
32- * 展开 WebDAV 专用字段
33- * @private
34- * @param {object } cfg - config_json 解析后的对象
35- * @param {object } merged - 合并目标对象
36- * @param {object } options - 选项
37- */
38- _inflateWebDavFields ( cfg , merged , { withSecrets = false } ) {
39- merged . endpoint_url = cfg ?. endpoint_url ;
40- merged . username = cfg ?. username ;
41- merged . tls_insecure_skip_verify = cfg ?. tls_insecure_skip_verify ;
42- if ( withSecrets ) {
43- merged . password = cfg ?. password ;
44- }
45- }
46-
47- /**
48- * 展开 LOCAL 专用字段
49- * @private
50- * @param {object } cfg - config_json 解析后的对象
51- * @param {object } merged - 合并目标对象
52- */
53- _inflateLocalFields ( cfg , merged ) {
54- merged . root_path = cfg ?. root_path ;
55- merged . auto_create_root = cfg ?. auto_create_root ;
56- merged . readonly = cfg ?. readonly ;
57- merged . trash_path = cfg ?. trash_path ;
58- merged . dir_permission = cfg ?. dir_permission ;
59- }
60-
61- /**
62- * 通用展开方法(策略模式)
63- * 根据 storage_type 自动选择对应的字段展开策略
14+ * 通用展开方法
15+ * - 解析 config_json
16+ * - 委托 StorageFactory.projectConfig 完成类型特定的配置投影
17+ * - 将投影结果与行对象合并,并保留 __config_json__ 供上层复用
6418 * @param {object } row - 数据库原始行
6519 * @param {object } options - 选项
6620 * @returns {object|null } 展开后的配置对象
@@ -69,31 +23,19 @@ export class StorageConfigRepository extends BaseRepository {
6923 if ( ! row ) return null ;
7024 try {
7125 if ( row . config_json ) {
72- const cfg = JSON . parse ( row . config_json ) ;
26+ const raw = row . config_json ;
27+ const cfg = typeof raw === "string" ? JSON . parse ( raw ) : raw || { } ;
28+
29+ const projected = StorageFactory . projectConfig ( row . storage_type , cfg , {
30+ withSecrets,
31+ row,
32+ } ) ;
33+
7334 const merged = {
7435 ...row ,
75- // 通用字段(所有存储类型共享)
76- default_folder : cfg ?. default_folder ,
77- custom_host : cfg ?. custom_host ,
78- signature_expires_in : cfg ?. signature_expires_in ,
79- total_storage_bytes : cfg ?. total_storage_bytes ,
36+ ...( projected && typeof projected === "object" ? projected : { } ) ,
8037 } ;
8138
82- // 根据存储类型展开专用字段
83- switch ( row . storage_type ) {
84- case "S3" :
85- this . _inflateS3Fields ( cfg , merged , { withSecrets } ) ;
86- break ;
87- case "WEBDAV" :
88- this . _inflateWebDavFields ( cfg , merged , { withSecrets } ) ;
89- break ;
90- case "LOCAL" :
91- this . _inflateLocalFields ( cfg , merged ) ;
92- break ;
93- default :
94- console . warn ( `Unknown storage_type: ${ row . storage_type } ` ) ;
95- }
96-
9739 // 保留原始 config_json 对象(非枚举属性,避免对外暴露)
9840 Object . defineProperty ( merged , "__config_json__" , {
9941 value : cfg ,
0 commit comments