sa2kit 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/dist/CollisionBalls-DgKtscU2.d.mts +41 -0
  2. package/dist/CollisionBalls-DgKtscU2.d.ts +41 -0
  3. package/dist/ConfigService-Oga_zFRS.d.mts +262 -0
  4. package/dist/ConfigService-Oga_zFRS.d.ts +262 -0
  5. package/dist/UniversalFileService-CC4d3wkc.d.ts +139 -0
  6. package/dist/UniversalFileService-CzAE_G4V.d.mts +139 -0
  7. package/dist/boothVaultService-lKcnyA-u.d.mts +83 -0
  8. package/dist/boothVaultService-lKcnyA-u.d.ts +83 -0
  9. package/dist/business/audioDetection/index.d.mts +2 -0
  10. package/dist/business/audioDetection/index.d.ts +2 -0
  11. package/dist/business/audioDetection/index.js +1244 -0
  12. package/dist/business/audioDetection/index.js.map +1 -0
  13. package/dist/business/audioDetection/index.mjs +1227 -0
  14. package/dist/business/audioDetection/index.mjs.map +1 -0
  15. package/dist/business/calendar/index.d.mts +6 -0
  16. package/dist/business/calendar/index.d.ts +6 -0
  17. package/dist/business/calendar/index.js +7433 -0
  18. package/dist/business/calendar/index.js.map +1 -0
  19. package/dist/business/calendar/index.mjs +7257 -0
  20. package/dist/business/calendar/index.mjs.map +1 -0
  21. package/dist/business/calendar/routes/index.d.mts +191 -0
  22. package/dist/business/calendar/routes/index.d.ts +191 -0
  23. package/dist/business/calendar/routes/index.js +844 -0
  24. package/dist/business/calendar/routes/index.js.map +1 -0
  25. package/dist/business/calendar/routes/index.mjs +826 -0
  26. package/dist/business/calendar/routes/index.mjs.map +1 -0
  27. package/dist/business/festivalCard/index.d.mts +4 -0
  28. package/dist/business/festivalCard/index.d.ts +4 -0
  29. package/dist/business/festivalCard/index.js +1492 -0
  30. package/dist/business/festivalCard/index.js.map +1 -0
  31. package/dist/business/festivalCard/index.mjs +1475 -0
  32. package/dist/business/festivalCard/index.mjs.map +1 -0
  33. package/dist/business/festivalCard/routes/index.d.mts +42 -0
  34. package/dist/business/festivalCard/routes/index.d.ts +42 -0
  35. package/dist/business/festivalCard/routes/index.js +361 -0
  36. package/dist/business/festivalCard/routes/index.js.map +1 -0
  37. package/dist/business/festivalCard/routes/index.mjs +356 -0
  38. package/dist/business/festivalCard/routes/index.mjs.map +1 -0
  39. package/dist/business/festivalCard/server/index.d.mts +120 -0
  40. package/dist/business/festivalCard/server/index.d.ts +120 -0
  41. package/dist/business/festivalCard/server/index.js +272 -0
  42. package/dist/business/festivalCard/server/index.js.map +1 -0
  43. package/dist/business/festivalCard/server/index.mjs +265 -0
  44. package/dist/business/festivalCard/server/index.mjs.map +1 -0
  45. package/dist/business/index.d.mts +34 -0
  46. package/dist/business/index.d.ts +34 -0
  47. package/dist/business/index.js +29282 -0
  48. package/dist/business/index.js.map +1 -0
  49. package/dist/business/index.mjs +29237 -0
  50. package/dist/business/index.mjs.map +1 -0
  51. package/dist/business/mikuContest/ui/web/index.d.mts +2 -0
  52. package/dist/business/mikuContest/ui/web/index.d.ts +2 -0
  53. package/dist/business/mikuContest/ui/web/index.js +353 -0
  54. package/dist/business/mikuContest/ui/web/index.js.map +1 -0
  55. package/dist/business/mikuContest/ui/web/index.mjs +343 -0
  56. package/dist/business/mikuContest/ui/web/index.mjs.map +1 -0
  57. package/dist/business/mikuFireworks3D/index.d.mts +2 -0
  58. package/dist/business/mikuFireworks3D/index.d.ts +2 -0
  59. package/dist/business/mikuFireworks3D/index.js +1267 -0
  60. package/dist/business/mikuFireworks3D/index.js.map +1 -0
  61. package/dist/business/mikuFireworks3D/index.mjs +1228 -0
  62. package/dist/business/mikuFireworks3D/index.mjs.map +1 -0
  63. package/dist/business/mikuFusionGame/index.d.mts +2 -0
  64. package/dist/business/mikuFusionGame/index.d.ts +2 -0
  65. package/dist/business/mikuFusionGame/index.js +1208 -0
  66. package/dist/business/mikuFusionGame/index.js.map +1 -0
  67. package/dist/business/mikuFusionGame/index.mjs +1195 -0
  68. package/dist/business/mikuFusionGame/index.mjs.map +1 -0
  69. package/dist/business/mmd/admin/index.d.mts +487 -0
  70. package/dist/business/mmd/admin/index.d.ts +487 -0
  71. package/dist/business/mmd/admin/index.js +1058 -0
  72. package/dist/business/mmd/admin/index.js.map +1 -0
  73. package/dist/business/mmd/admin/index.mjs +1027 -0
  74. package/dist/business/mmd/admin/index.mjs.map +1 -0
  75. package/dist/business/mmd/index.d.mts +5 -0
  76. package/dist/business/mmd/index.d.ts +5 -0
  77. package/dist/business/mmd/index.js +10119 -0
  78. package/dist/business/mmd/index.js.map +1 -0
  79. package/dist/business/mmd/index.mjs +10028 -0
  80. package/dist/business/mmd/index.mjs.map +1 -0
  81. package/dist/business/mmd/server/index.d.mts +139 -0
  82. package/dist/business/mmd/server/index.d.ts +139 -0
  83. package/dist/business/mmd/server/index.js +424 -0
  84. package/dist/business/mmd/server/index.js.map +1 -0
  85. package/dist/business/mmd/server/index.mjs +404 -0
  86. package/dist/business/mmd/server/index.mjs.map +1 -0
  87. package/dist/business/music/index.d.mts +3 -0
  88. package/dist/business/music/index.d.ts +3 -0
  89. package/dist/business/music/index.js +830 -0
  90. package/dist/business/music/index.js.map +1 -0
  91. package/dist/business/music/index.mjs +809 -0
  92. package/dist/business/music/index.mjs.map +1 -0
  93. package/dist/business/music/server/index.d.mts +1 -0
  94. package/dist/business/music/server/index.d.ts +1 -0
  95. package/dist/business/music/server/index.js +194 -0
  96. package/dist/business/music/server/index.js.map +1 -0
  97. package/dist/business/music/server/index.mjs +182 -0
  98. package/dist/business/music/server/index.mjs.map +1 -0
  99. package/dist/business/navigation/index.d.mts +2 -0
  100. package/dist/business/navigation/index.d.ts +2 -0
  101. package/dist/business/navigation/index.js +453 -0
  102. package/dist/business/navigation/index.js.map +1 -0
  103. package/dist/business/navigation/index.mjs +443 -0
  104. package/dist/business/navigation/index.mjs.map +1 -0
  105. package/dist/business/portfolio/index.d.mts +3 -0
  106. package/dist/business/portfolio/index.d.ts +3 -0
  107. package/dist/business/portfolio/index.js +736 -0
  108. package/dist/business/portfolio/index.js.map +1 -0
  109. package/dist/business/portfolio/index.mjs +724 -0
  110. package/dist/business/portfolio/index.mjs.map +1 -0
  111. package/dist/business/qqbot/server/index.d.mts +167 -0
  112. package/dist/business/qqbot/server/index.d.ts +167 -0
  113. package/dist/business/qqbot/server/index.js +394 -0
  114. package/dist/business/qqbot/server/index.js.map +1 -0
  115. package/dist/business/qqbot/server/index.mjs +385 -0
  116. package/dist/business/qqbot/server/index.mjs.map +1 -0
  117. package/dist/business/qqbot/ui/web/index.d.mts +10 -0
  118. package/dist/business/qqbot/ui/web/index.d.ts +10 -0
  119. package/dist/business/qqbot/ui/web/index.js +105 -0
  120. package/dist/business/qqbot/ui/web/index.js.map +1 -0
  121. package/dist/business/qqbot/ui/web/index.mjs +99 -0
  122. package/dist/business/qqbot/ui/web/index.mjs.map +1 -0
  123. package/dist/business/screenReceiver/index.d.mts +2 -0
  124. package/dist/business/screenReceiver/index.d.ts +2 -0
  125. package/dist/business/screenReceiver/index.js +281 -0
  126. package/dist/business/screenReceiver/index.js.map +1 -0
  127. package/dist/business/screenReceiver/index.mjs +273 -0
  128. package/dist/business/screenReceiver/index.mjs.map +1 -0
  129. package/dist/business/testYourself/admin/index.d.mts +58 -0
  130. package/dist/business/testYourself/admin/index.d.ts +58 -0
  131. package/dist/business/testYourself/admin/index.js +1009 -0
  132. package/dist/business/testYourself/admin/index.js.map +1 -0
  133. package/dist/business/testYourself/admin/index.mjs +1002 -0
  134. package/dist/business/testYourself/admin/index.mjs.map +1 -0
  135. package/dist/business/testYourself/index.d.mts +6 -0
  136. package/dist/business/testYourself/index.d.ts +6 -0
  137. package/dist/business/testYourself/index.js +2551 -0
  138. package/dist/business/testYourself/index.js.map +1 -0
  139. package/dist/business/testYourself/index.mjs +2531 -0
  140. package/dist/business/testYourself/index.mjs.map +1 -0
  141. package/dist/business/testYourself/server/index.d.mts +1029 -0
  142. package/dist/business/testYourself/server/index.d.ts +1029 -0
  143. package/dist/business/testYourself/server/index.js +825 -0
  144. package/dist/business/testYourself/server/index.js.map +1 -0
  145. package/dist/business/testYourself/server/index.mjs +816 -0
  146. package/dist/business/testYourself/server/index.mjs.map +1 -0
  147. package/dist/business/vocaloidBooth/index.d.mts +2 -0
  148. package/dist/business/vocaloidBooth/index.d.ts +2 -0
  149. package/dist/business/vocaloidBooth/index.js +172 -0
  150. package/dist/business/vocaloidBooth/index.js.map +1 -0
  151. package/dist/business/vocaloidBooth/index.mjs +166 -0
  152. package/dist/business/vocaloidBooth/index.mjs.map +1 -0
  153. package/dist/business/vocaloidBooth/server/index.d.mts +111 -0
  154. package/dist/business/vocaloidBooth/server/index.d.ts +111 -0
  155. package/dist/business/vocaloidBooth/server/index.js +247 -0
  156. package/dist/business/vocaloidBooth/server/index.js.map +1 -0
  157. package/dist/business/vocaloidBooth/server/index.mjs +237 -0
  158. package/dist/business/vocaloidBooth/server/index.mjs.map +1 -0
  159. package/dist/business/vocaloidBooth/web/index.d.mts +45 -0
  160. package/dist/business/vocaloidBooth/web/index.d.ts +45 -0
  161. package/dist/business/vocaloidBooth/web/index.js +376 -0
  162. package/dist/business/vocaloidBooth/web/index.js.map +1 -0
  163. package/dist/business/vocaloidBooth/web/index.mjs +362 -0
  164. package/dist/business/vocaloidBooth/web/index.mjs.map +1 -0
  165. package/dist/config-BQp3qLAL.d.mts +22 -0
  166. package/dist/config-BQp3qLAL.d.ts +22 -0
  167. package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
  168. package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
  169. package/dist/festivalCardService-D60G-sgr.d.mts +13 -0
  170. package/dist/festivalCardService-DnLyJpRh.d.ts +13 -0
  171. package/dist/index-BMgdH5dL.d.mts +1716 -0
  172. package/dist/index-BO9_Do5y.d.mts +93 -0
  173. package/dist/index-BO9_Do5y.d.ts +93 -0
  174. package/dist/index-BSmd4ikf.d.ts +76 -0
  175. package/dist/index-BSwvWYp2.d.mts +2632 -0
  176. package/dist/index-Bo_fW3Tl.d.mts +105 -0
  177. package/dist/index-Bo_fW3Tl.d.ts +105 -0
  178. package/dist/index-BrKazb8M.d.mts +148 -0
  179. package/dist/index-BrKazb8M.d.ts +148 -0
  180. package/dist/index-Bzh6QE4P.d.ts +25 -0
  181. package/dist/index-C5Ic6eSR.d.mts +25 -0
  182. package/dist/index-C8i9SIxk.d.ts +2632 -0
  183. package/dist/index-C_GhVhOT.d.mts +109 -0
  184. package/dist/index-C_GhVhOT.d.ts +109 -0
  185. package/dist/index-Cb3UEpG4.d.mts +101 -0
  186. package/dist/index-CjlkUj01.d.mts +103 -0
  187. package/dist/index-CucXCBNR.d.mts +302 -0
  188. package/dist/index-CucXCBNR.d.ts +302 -0
  189. package/dist/index-DLLPTprx.d.mts +1522 -0
  190. package/dist/index-DRiZy0dv.d.mts +525 -0
  191. package/dist/index-DRiZy0dv.d.ts +525 -0
  192. package/dist/index-Dc_I2t0P.d.mts +103 -0
  193. package/dist/index-DowAHRIP.d.mts +250 -0
  194. package/dist/index-DowAHRIP.d.ts +250 -0
  195. package/dist/index-Dpq_5H2n.d.ts +103 -0
  196. package/dist/index-Ds2M_9zb.d.ts +101 -0
  197. package/dist/index-IXMAeTtN.d.ts +1716 -0
  198. package/dist/index-VFDbZxVM.d.ts +1522 -0
  199. package/dist/index-jadkp96n.d.ts +103 -0
  200. package/dist/index-r2-zE3iC.d.mts +76 -0
  201. package/dist/index.d.mts +10682 -0
  202. package/dist/index.d.ts +10682 -0
  203. package/dist/index.js +38233 -0
  204. package/dist/index.js.map +1 -0
  205. package/dist/index.mjs +37959 -0
  206. package/dist/index.mjs.map +1 -0
  207. package/dist/types-B6B210gX.d.mts +270 -0
  208. package/dist/types-B6B210gX.d.ts +270 -0
  209. package/dist/types-B7voqjjA.d.mts +51 -0
  210. package/dist/types-B7voqjjA.d.ts +51 -0
  211. package/dist/types-Bdnte5EN.d.mts +292 -0
  212. package/dist/types-C2z_QQPI.d.mts +70 -0
  213. package/dist/types-C2z_QQPI.d.ts +70 -0
  214. package/dist/types-HorDyIRv.d.mts +303 -0
  215. package/dist/types-HorDyIRv.d.ts +303 -0
  216. package/dist/types-_rFX1atk.d.ts +292 -0
  217. package/package.json +3 -2
@@ -0,0 +1,816 @@
1
+ import { eq, sql, and, or, desc } from 'drizzle-orm';
2
+ import { pgTable, timestamp, varchar, json, uuid, integer, boolean, text, index } from 'drizzle-orm/pg-core';
3
+
4
+ // src/business/testYourself/server/ConfigService.ts
5
+ var LocalStorageAdapter = class {
6
+ constructor() {
7
+ this.STORAGE_KEY = "test-yourself-configs";
8
+ this.DEFAULT_KEY = "test-yourself-default-config";
9
+ }
10
+ async getAllConfigsData() {
11
+ if (typeof window === "undefined") return [];
12
+ try {
13
+ const data = localStorage.getItem(this.STORAGE_KEY);
14
+ return data ? JSON.parse(data) : [];
15
+ } catch (error) {
16
+ console.error("\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25:", error);
17
+ return [];
18
+ }
19
+ }
20
+ async saveAllConfigsData(configs) {
21
+ if (typeof window === "undefined") return;
22
+ try {
23
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(configs));
24
+ } catch (error) {
25
+ console.error("\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25:", error);
26
+ throw error;
27
+ }
28
+ }
29
+ async saveConfig(config) {
30
+ const configs = await this.getAllConfigsData();
31
+ const existingIndex = configs.findIndex((c) => c.id === config.id);
32
+ if (existingIndex >= 0) {
33
+ configs[existingIndex] = config;
34
+ } else {
35
+ configs.push(config);
36
+ }
37
+ await this.saveAllConfigsData(configs);
38
+ }
39
+ async getConfig(id) {
40
+ const configs = await this.getAllConfigsData();
41
+ return configs.find((c) => c.id === id) || null;
42
+ }
43
+ async getAllConfigs() {
44
+ return this.getAllConfigsData();
45
+ }
46
+ async deleteConfig(id) {
47
+ const configs = await this.getAllConfigsData();
48
+ const filtered = configs.filter((c) => c.id !== id);
49
+ await this.saveAllConfigsData(filtered);
50
+ }
51
+ async updateConfig(id, config) {
52
+ const configs = await this.getAllConfigsData();
53
+ const index2 = configs.findIndex((c) => c.id === id);
54
+ if (index2 >= 0) {
55
+ configs[index2] = { ...config, updatedAt: Date.now() };
56
+ await this.saveAllConfigsData(configs);
57
+ } else {
58
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
59
+ }
60
+ }
61
+ async setDefaultConfig(id) {
62
+ if (typeof window === "undefined") return;
63
+ const config = await this.getConfig(id);
64
+ if (!config) {
65
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
66
+ }
67
+ const configs = await this.getAllConfigsData();
68
+ configs.forEach((c) => c.isDefault = c.id === id);
69
+ await this.saveAllConfigsData(configs);
70
+ localStorage.setItem(this.DEFAULT_KEY, id);
71
+ }
72
+ async getDefaultConfig() {
73
+ if (typeof window === "undefined") return null;
74
+ try {
75
+ const defaultId = localStorage.getItem(this.DEFAULT_KEY);
76
+ if (defaultId) {
77
+ return await this.getConfig(defaultId);
78
+ }
79
+ const configs = await this.getAllConfigsData();
80
+ return configs.find((c) => c.isDefault) || null;
81
+ } catch (error) {
82
+ console.error("\u83B7\u53D6\u9ED8\u8BA4\u914D\u7F6E\u5931\u8D25:", error);
83
+ return null;
84
+ }
85
+ }
86
+ };
87
+ var MemoryStorageAdapter = class {
88
+ constructor() {
89
+ this.configs = /* @__PURE__ */ new Map();
90
+ this.defaultConfigId = null;
91
+ }
92
+ async saveConfig(config) {
93
+ this.configs.set(config.id, config);
94
+ }
95
+ async getConfig(id) {
96
+ return this.configs.get(id) || null;
97
+ }
98
+ async getAllConfigs() {
99
+ return Array.from(this.configs.values());
100
+ }
101
+ async deleteConfig(id) {
102
+ this.configs.delete(id);
103
+ if (this.defaultConfigId === id) {
104
+ this.defaultConfigId = null;
105
+ }
106
+ }
107
+ async updateConfig(id, config) {
108
+ if (!this.configs.has(id)) {
109
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
110
+ }
111
+ this.configs.set(id, { ...config, updatedAt: Date.now() });
112
+ }
113
+ async setDefaultConfig(id) {
114
+ if (!this.configs.has(id)) {
115
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
116
+ }
117
+ this.configs.forEach((c) => c.isDefault = c.id === id);
118
+ this.defaultConfigId = id;
119
+ }
120
+ async getDefaultConfig() {
121
+ if (this.defaultConfigId) {
122
+ return this.configs.get(this.defaultConfigId) || null;
123
+ }
124
+ for (const config of this.configs.values()) {
125
+ if (config.isDefault) {
126
+ return config;
127
+ }
128
+ }
129
+ return null;
130
+ }
131
+ };
132
+ var ConfigService = class {
133
+ constructor(options = {}) {
134
+ this.cache = /* @__PURE__ */ new Map();
135
+ const {
136
+ storageType = "localStorage",
137
+ customStorage,
138
+ enableCache = true
139
+ } = options;
140
+ this.enableCache = enableCache;
141
+ if (customStorage) {
142
+ this.storage = customStorage;
143
+ } else if (storageType === "memory") {
144
+ this.storage = new MemoryStorageAdapter();
145
+ } else {
146
+ this.storage = new LocalStorageAdapter();
147
+ }
148
+ }
149
+ /**
150
+ * 初始化服务(如果需要)
151
+ */
152
+ async init() {
153
+ }
154
+ /**
155
+ * 生成唯一ID
156
+ */
157
+ generateId() {
158
+ return "config_" + Date.now() + "_" + Math.random().toString(36).substring(2, 9);
159
+ }
160
+ /**
161
+ * 保存配置
162
+ */
163
+ async saveConfig(config) {
164
+ await this.storage.saveConfig(config);
165
+ if (config.isDefault) {
166
+ await this.storage.setDefaultConfig(config.id);
167
+ }
168
+ if (this.enableCache) {
169
+ this.cache.set(config.id, config);
170
+ }
171
+ }
172
+ /**
173
+ * 创建新配置
174
+ */
175
+ async createConfig(name, config, description, isDefault = false) {
176
+ const savedConfig = {
177
+ id: this.generateId(),
178
+ name,
179
+ description,
180
+ config,
181
+ createdAt: Date.now(),
182
+ updatedAt: Date.now(),
183
+ isDefault
184
+ };
185
+ await this.storage.saveConfig(savedConfig);
186
+ if (isDefault) {
187
+ await this.storage.setDefaultConfig(savedConfig.id);
188
+ }
189
+ if (this.enableCache) {
190
+ this.cache.set(savedConfig.id, savedConfig);
191
+ }
192
+ return savedConfig;
193
+ }
194
+ /**
195
+ * 获取配置
196
+ */
197
+ async getConfig(id) {
198
+ if (this.enableCache && this.cache.has(id)) {
199
+ return this.cache.get(id);
200
+ }
201
+ const config = await this.storage.getConfig(id);
202
+ if (config && this.enableCache) {
203
+ this.cache.set(id, config);
204
+ }
205
+ return config;
206
+ }
207
+ /**
208
+ * 获取所有配置列表
209
+ */
210
+ async getAllConfigs() {
211
+ return await this.storage.getAllConfigs();
212
+ }
213
+ /**
214
+ * 获取配置列表(精简版)
215
+ */
216
+ async getConfigList() {
217
+ const configs = await this.getAllConfigs();
218
+ return configs.map((c) => ({
219
+ id: c.id,
220
+ name: c.name,
221
+ description: c.description,
222
+ resultCount: c.config.results.length,
223
+ createdAt: c.createdAt,
224
+ updatedAt: c.updatedAt,
225
+ isDefault: c.isDefault
226
+ }));
227
+ }
228
+ /**
229
+ * 更新配置
230
+ */
231
+ async updateConfig(id, updates) {
232
+ const existing = await this.getConfig(id);
233
+ if (!existing) {
234
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
235
+ }
236
+ const updated = {
237
+ ...existing,
238
+ ...updates,
239
+ updatedAt: Date.now()
240
+ };
241
+ await this.storage.updateConfig(id, updated);
242
+ if (updates.isDefault) {
243
+ await this.storage.setDefaultConfig(id);
244
+ }
245
+ if (this.enableCache) {
246
+ this.cache.set(id, updated);
247
+ }
248
+ return updated;
249
+ }
250
+ /**
251
+ * 删除配置
252
+ */
253
+ async deleteConfig(id) {
254
+ await this.storage.deleteConfig(id);
255
+ if (this.enableCache) {
256
+ this.cache.delete(id);
257
+ }
258
+ }
259
+ /**
260
+ * 设置默认配置
261
+ */
262
+ async setDefaultConfig(id) {
263
+ await this.storage.setDefaultConfig(id);
264
+ if (this.enableCache) {
265
+ this.cache.clear();
266
+ }
267
+ }
268
+ /**
269
+ * 获取默认配置
270
+ */
271
+ async getDefaultConfig() {
272
+ return await this.storage.getDefaultConfig();
273
+ }
274
+ /**
275
+ * 清空缓存
276
+ */
277
+ clearCache() {
278
+ this.cache.clear();
279
+ }
280
+ /**
281
+ * 导出配置(JSON格式)
282
+ */
283
+ async exportConfig(id) {
284
+ const config = await this.getConfig(id);
285
+ if (!config) {
286
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
287
+ }
288
+ return JSON.stringify(config, null, 2);
289
+ }
290
+ /**
291
+ * 导入配置
292
+ */
293
+ async importConfig(jsonString) {
294
+ try {
295
+ const data = JSON.parse(jsonString);
296
+ const newConfig = {
297
+ ...data,
298
+ id: this.generateId(),
299
+ createdAt: Date.now(),
300
+ updatedAt: Date.now(),
301
+ isDefault: false
302
+ // 导入的配置不设为默认
303
+ };
304
+ await this.storage.saveConfig(newConfig);
305
+ if (this.enableCache) {
306
+ this.cache.set(newConfig.id, newConfig);
307
+ }
308
+ return newConfig;
309
+ } catch (error) {
310
+ throw new Error("\u5BFC\u5165\u914D\u7F6E\u5931\u8D25: " + error);
311
+ }
312
+ }
313
+ /**
314
+ * 复制配置
315
+ */
316
+ async duplicateConfig(id, newName) {
317
+ const original = await this.getConfig(id);
318
+ if (!original) {
319
+ throw new Error("\u914D\u7F6E\u4E0D\u5B58\u5728: " + id);
320
+ }
321
+ const duplicated = {
322
+ ...original,
323
+ id: this.generateId(),
324
+ name: newName || original.name + " (\u526F\u672C)",
325
+ createdAt: Date.now(),
326
+ updatedAt: Date.now(),
327
+ isDefault: false
328
+ };
329
+ await this.storage.saveConfig(duplicated);
330
+ if (this.enableCache) {
331
+ this.cache.set(duplicated.id, duplicated);
332
+ }
333
+ return duplicated;
334
+ }
335
+ /**
336
+ * 批量删除配置
337
+ */
338
+ async deleteConfigs(ids) {
339
+ for (const id of ids) {
340
+ await this.deleteConfig(id);
341
+ }
342
+ }
343
+ };
344
+ function createConfigService(options) {
345
+ return new ConfigService(options);
346
+ }
347
+ var defaultServiceInstance = null;
348
+ function getDefaultConfigService() {
349
+ if (!defaultServiceInstance) {
350
+ defaultServiceInstance = createConfigService();
351
+ }
352
+ return defaultServiceInstance;
353
+ }
354
+ var testYourselfConfigs = pgTable(
355
+ "test_yourself_configs",
356
+ {
357
+ // ========== 主键 ==========
358
+ /** 配置唯一ID */
359
+ id: uuid("id").primaryKey().defaultRandom(),
360
+ // ========== 基本信息 ==========
361
+ /** 配置名称 */
362
+ name: varchar("name", { length: 255 }).notNull(),
363
+ /** 配置描述 */
364
+ description: text("description"),
365
+ /** 配置标签(用于分类和搜索) */
366
+ tags: json("tags").$type().default([]),
367
+ // ========== 配置数据 ==========
368
+ /** 测试配置内容(JSON格式) */
369
+ config: json("config").$type().notNull(),
370
+ /** 结果数量(冗余字段,便于查询) */
371
+ resultCount: integer("result_count").notNull().default(0),
372
+ // ========== 状态字段 ==========
373
+ /** 是否为默认配置 */
374
+ isDefault: boolean("is_default").notNull().default(false),
375
+ /** 是否已发布(草稿/发布) */
376
+ isPublished: boolean("is_published").notNull().default(true),
377
+ /** 是否已归档 */
378
+ isArchived: boolean("is_archived").notNull().default(false),
379
+ /** 是否已删除(软删除) */
380
+ isDeleted: boolean("is_deleted").notNull().default(false),
381
+ // ========== 权限和所有权 ==========
382
+ /** 创建者ID */
383
+ createdBy: varchar("created_by", { length: 255 }).notNull(),
384
+ /** 最后更新者ID */
385
+ updatedBy: varchar("updated_by", { length: 255 }),
386
+ /** 所属组织/租户ID(多租户支持) */
387
+ organizationId: varchar("organization_id", { length: 255 }),
388
+ // ========== 统计信息 ==========
389
+ /** 使用次数 */
390
+ usageCount: integer("usage_count").notNull().default(0),
391
+ /** 最后使用时间 */
392
+ lastUsedAt: timestamp("last_used_at"),
393
+ /** 浏览次数 */
394
+ viewCount: integer("view_count").notNull().default(0),
395
+ // ========== 版本控制 ==========
396
+ /** 配置版本号 */
397
+ version: integer("version").notNull().default(1),
398
+ /** 父配置ID(用于版本追踪) */
399
+ parentId: uuid("parent_id"),
400
+ // ========== 自定义字段 ==========
401
+ /** 自定义元数据(扩展字段) */
402
+ metadata: json("metadata").$type(),
403
+ /** 配置来源(web/api/import) */
404
+ source: varchar("source", { length: 50 }),
405
+ // ========== 时间戳 ==========
406
+ /** 创建时间 */
407
+ createdAt: timestamp("created_at").defaultNow().notNull(),
408
+ /** 更新时间 */
409
+ updatedAt: timestamp("updated_at").defaultNow().notNull(),
410
+ /** 发布时间 */
411
+ publishedAt: timestamp("published_at"),
412
+ /** 归档时间 */
413
+ archivedAt: timestamp("archived_at"),
414
+ /** 删除时间 */
415
+ deletedAt: timestamp("deleted_at")
416
+ },
417
+ (table) => ({
418
+ // ========== 索引设计 ==========
419
+ /** 名称搜索索引 */
420
+ nameIndex: index("test_configs_name_idx").on(table.name),
421
+ /** 创建者索引 */
422
+ createdByIndex: index("test_configs_created_by_idx").on(table.createdBy),
423
+ /** 组织索引(多租户) */
424
+ organizationIndex: index("test_configs_organization_idx").on(table.organizationId),
425
+ /** 默认配置索引 */
426
+ isDefaultIndex: index("test_configs_is_default_idx").on(table.isDefault),
427
+ /** 发布状态索引 */
428
+ isPublishedIndex: index("test_configs_is_published_idx").on(table.isPublished),
429
+ /** 删除状态索引 */
430
+ isDeletedIndex: index("test_configs_is_deleted_idx").on(table.isDeleted),
431
+ /** 创建时间索引 */
432
+ createdAtIndex: index("test_configs_created_at_idx").on(table.createdAt),
433
+ /** 最后使用时间索引 */
434
+ lastUsedAtIndex: index("test_configs_last_used_at_idx").on(table.lastUsedAt),
435
+ /** 组合索引:组织+删除状态+发布状态 */
436
+ orgDeletedPublishedIndex: index("test_configs_org_deleted_published_idx").on(
437
+ table.organizationId,
438
+ table.isDeleted,
439
+ table.isPublished
440
+ ),
441
+ /** 组合索引:创建者+删除状态 */
442
+ createdByDeletedIndex: index("test_configs_created_by_deleted_idx").on(
443
+ table.createdBy,
444
+ table.isDeleted
445
+ )
446
+ })
447
+ );
448
+ var testYourselfConfigUsage = pgTable(
449
+ "test_yourself_config_usage",
450
+ {
451
+ /** 记录ID */
452
+ id: uuid("id").primaryKey().defaultRandom(),
453
+ /** 配置ID */
454
+ configId: uuid("config_id").references(() => testYourselfConfigs.id, { onDelete: "cascade" }).notNull(),
455
+ /** 用户ID */
456
+ userId: varchar("user_id", { length: 255 }),
457
+ /** 设备指纹 */
458
+ fingerprint: text("fingerprint"),
459
+ /** 测试结果ID */
460
+ resultId: varchar("result_id", { length: 255 }),
461
+ /** IP地址 */
462
+ ipAddress: varchar("ip_address", { length: 45 }),
463
+ /** User Agent */
464
+ userAgent: text("user_agent"),
465
+ /** 来源页面 */
466
+ referer: text("referer"),
467
+ /** 使用时间 */
468
+ usedAt: timestamp("used_at").defaultNow().notNull(),
469
+ /** 完成时间(毫秒) */
470
+ completionTime: integer("completion_time"),
471
+ /** 额外数据 */
472
+ metadata: json("metadata").$type()
473
+ },
474
+ (table) => ({
475
+ /** 配置ID索引 */
476
+ configIndex: index("test_usage_config_idx").on(table.configId),
477
+ /** 用户ID索引 */
478
+ userIndex: index("test_usage_user_idx").on(table.userId),
479
+ /** 使用时间索引 */
480
+ usedAtIndex: index("test_usage_used_at_idx").on(table.usedAt),
481
+ /** 指纹索引 */
482
+ fingerprintIndex: index("test_usage_fingerprint_idx").on(table.fingerprint)
483
+ })
484
+ );
485
+ var testYourselfConfigShares = pgTable(
486
+ "test_yourself_config_shares",
487
+ {
488
+ /** 分享ID */
489
+ id: uuid("id").primaryKey().defaultRandom(),
490
+ /** 分享代码(短链接标识) */
491
+ shareCode: varchar("share_code", { length: 20 }).notNull().unique(),
492
+ /** 配置ID */
493
+ configId: uuid("config_id").references(() => testYourselfConfigs.id, { onDelete: "cascade" }).notNull(),
494
+ /** 分享标题 */
495
+ title: varchar("title", { length: 255 }),
496
+ /** 分享描述 */
497
+ description: text("description"),
498
+ /** 访问密码 */
499
+ password: varchar("password", { length: 100 }),
500
+ /** 最大访问次数 */
501
+ maxAccess: integer("max_access"),
502
+ /** 当前访问次数 */
503
+ accessCount: integer("access_count").notNull().default(0),
504
+ /** 是否启用 */
505
+ isActive: boolean("is_active").notNull().default(true),
506
+ /** 过期时间 */
507
+ expiresAt: timestamp("expires_at"),
508
+ /** 创建者ID */
509
+ createdBy: varchar("created_by", { length: 255 }).notNull(),
510
+ /** 创建时间 */
511
+ createdAt: timestamp("created_at").defaultNow().notNull(),
512
+ /** 更新时间 */
513
+ updatedAt: timestamp("updated_at").defaultNow().notNull()
514
+ },
515
+ (table) => ({
516
+ /** 分享代码索引 */
517
+ shareCodeIndex: index("test_shares_share_code_idx").on(table.shareCode),
518
+ /** 配置ID索引 */
519
+ configIndex: index("test_shares_config_idx").on(table.configId),
520
+ /** 创建者索引 */
521
+ createdByIndex: index("test_shares_created_by_idx").on(table.createdBy),
522
+ /** 活跃状态索引 */
523
+ isActiveIndex: index("test_shares_is_active_idx").on(table.isActive)
524
+ })
525
+ );
526
+
527
+ // src/business/testYourself/server/DatabaseConfigAdapter.ts
528
+ var DatabaseConfigAdapter = class {
529
+ constructor(options) {
530
+ this.db = options.db;
531
+ this.userId = options.userId || "system";
532
+ this.organizationId = options.organizationId;
533
+ this.softDelete = options.softDelete !== false;
534
+ }
535
+ /**
536
+ * 设置当前用户ID
537
+ */
538
+ setUserId(userId) {
539
+ this.userId = userId;
540
+ }
541
+ /**
542
+ * 设置组织ID
543
+ */
544
+ setOrganizationId(organizationId) {
545
+ this.organizationId = organizationId;
546
+ }
547
+ /**
548
+ * 将数据库记录转换为 SavedConfig
549
+ */
550
+ toSavedConfig(dbConfig) {
551
+ return {
552
+ id: dbConfig.id,
553
+ name: dbConfig.name,
554
+ description: dbConfig.description || void 0,
555
+ config: dbConfig.config,
556
+ createdAt: dbConfig.createdAt.getTime(),
557
+ updatedAt: dbConfig.updatedAt.getTime(),
558
+ isDefault: dbConfig.isDefault
559
+ };
560
+ }
561
+ /**
562
+ * 保存配置
563
+ */
564
+ async saveConfig(config) {
565
+ try {
566
+ const existing = await this.db.select().from(testYourselfConfigs).where(eq(testYourselfConfigs.id, config.id)).limit(1);
567
+ const resultCount = config.config.results?.length || 0;
568
+ if (existing && existing.length > 0) {
569
+ await this.db.update(testYourselfConfigs).set({
570
+ name: config.name,
571
+ description: config.description || null,
572
+ config: config.config,
573
+ resultCount,
574
+ isDefault: config.isDefault || false,
575
+ updatedBy: this.userId,
576
+ updatedAt: /* @__PURE__ */ new Date(),
577
+ version: sql`${testYourselfConfigs.version} + 1`
578
+ // 版本号递增
579
+ }).where(eq(testYourselfConfigs.id, config.id));
580
+ console.log("\u2705 [DatabaseAdapter] \u914D\u7F6E\u5DF2\u66F4\u65B0:", config.id);
581
+ } else {
582
+ await this.db.insert(testYourselfConfigs).values({
583
+ id: config.id,
584
+ name: config.name,
585
+ description: config.description || null,
586
+ config: config.config,
587
+ resultCount,
588
+ isDefault: config.isDefault || false,
589
+ createdBy: this.userId,
590
+ organizationId: this.organizationId,
591
+ createdAt: new Date(config.createdAt),
592
+ updatedAt: new Date(config.updatedAt)
593
+ });
594
+ console.log("\u2705 [DatabaseAdapter] \u914D\u7F6E\u5DF2\u521B\u5EFA:", config.id);
595
+ }
596
+ } catch (error) {
597
+ console.error("\u274C [DatabaseAdapter] \u4FDD\u5B58\u914D\u7F6E\u5931\u8D25:", error);
598
+ throw error;
599
+ }
600
+ }
601
+ /**
602
+ * 获取配置
603
+ */
604
+ async getConfig(id) {
605
+ try {
606
+ const conditions = [eq(testYourselfConfigs.id, id)];
607
+ if (this.softDelete) {
608
+ conditions.push(eq(testYourselfConfigs.isDeleted, false));
609
+ }
610
+ const result = await this.db.select().from(testYourselfConfigs).where(and(...conditions)).limit(1);
611
+ if (!result || result.length === 0) {
612
+ return null;
613
+ }
614
+ return this.toSavedConfig(result[0]);
615
+ } catch (error) {
616
+ console.error("\u274C [DatabaseAdapter] \u83B7\u53D6\u914D\u7F6E\u5931\u8D25:", error);
617
+ throw error;
618
+ }
619
+ }
620
+ /**
621
+ * 获取所有配置列表
622
+ */
623
+ async getAllConfigs() {
624
+ try {
625
+ const conditions = [];
626
+ if (this.softDelete) {
627
+ conditions.push(eq(testYourselfConfigs.isDeleted, false));
628
+ }
629
+ if (this.organizationId) {
630
+ conditions.push(
631
+ or(
632
+ eq(testYourselfConfigs.organizationId, this.organizationId),
633
+ sql`${testYourselfConfigs.organizationId} IS NULL`
634
+ // 包含全局配置
635
+ )
636
+ );
637
+ }
638
+ const result = await this.db.select().from(testYourselfConfigs).where(conditions.length > 0 ? and(...conditions) : void 0).orderBy(desc(testYourselfConfigs.createdAt));
639
+ return result.map((config) => this.toSavedConfig(config));
640
+ } catch (error) {
641
+ console.error("\u274C [DatabaseAdapter] \u83B7\u53D6\u914D\u7F6E\u5217\u8868\u5931\u8D25:", error);
642
+ throw error;
643
+ }
644
+ }
645
+ /**
646
+ * 删除配置
647
+ */
648
+ async deleteConfig(id) {
649
+ try {
650
+ if (this.softDelete) {
651
+ await this.db.update(testYourselfConfigs).set({
652
+ isDeleted: true,
653
+ deletedAt: /* @__PURE__ */ new Date(),
654
+ updatedBy: this.userId,
655
+ updatedAt: /* @__PURE__ */ new Date()
656
+ }).where(eq(testYourselfConfigs.id, id));
657
+ console.log("\u{1F5D1}\uFE0F [DatabaseAdapter] \u914D\u7F6E\u5DF2\u8F6F\u5220\u9664:", id);
658
+ } else {
659
+ await this.db.delete(testYourselfConfigs).where(eq(testYourselfConfigs.id, id));
660
+ console.log("\u{1F5D1}\uFE0F [DatabaseAdapter] \u914D\u7F6E\u5DF2\u786C\u5220\u9664:", id);
661
+ }
662
+ } catch (error) {
663
+ console.error("\u274C [DatabaseAdapter] \u5220\u9664\u914D\u7F6E\u5931\u8D25:", error);
664
+ throw error;
665
+ }
666
+ }
667
+ /**
668
+ * 更新配置
669
+ */
670
+ async updateConfig(id, config) {
671
+ try {
672
+ const resultCount = config.config.results?.length || 0;
673
+ await this.db.update(testYourselfConfigs).set({
674
+ name: config.name,
675
+ description: config.description || null,
676
+ config: config.config,
677
+ resultCount,
678
+ isDefault: config.isDefault || false,
679
+ updatedBy: this.userId,
680
+ updatedAt: new Date(config.updatedAt),
681
+ version: sql`${testYourselfConfigs.version} + 1`
682
+ }).where(eq(testYourselfConfigs.id, id));
683
+ console.log("\u2705 [DatabaseAdapter] \u914D\u7F6E\u5DF2\u66F4\u65B0:", id);
684
+ } catch (error) {
685
+ console.error("\u274C [DatabaseAdapter] \u66F4\u65B0\u914D\u7F6E\u5931\u8D25:", error);
686
+ throw error;
687
+ }
688
+ }
689
+ /**
690
+ * 设置默认配置
691
+ */
692
+ async setDefaultConfig(id) {
693
+ try {
694
+ await this.db.transaction(async (tx) => {
695
+ const conditions = [eq(testYourselfConfigs.isDefault, true)];
696
+ if (this.organizationId) {
697
+ conditions.push(
698
+ eq(testYourselfConfigs.organizationId, this.organizationId)
699
+ );
700
+ }
701
+ await tx.update(testYourselfConfigs).set({
702
+ isDefault: false,
703
+ updatedBy: this.userId,
704
+ updatedAt: /* @__PURE__ */ new Date()
705
+ }).where(and(...conditions));
706
+ await tx.update(testYourselfConfigs).set({
707
+ isDefault: true,
708
+ updatedBy: this.userId,
709
+ updatedAt: /* @__PURE__ */ new Date()
710
+ }).where(eq(testYourselfConfigs.id, id));
711
+ });
712
+ console.log("\u2705 [DatabaseAdapter] \u9ED8\u8BA4\u914D\u7F6E\u5DF2\u8BBE\u7F6E:", id);
713
+ } catch (error) {
714
+ console.error("\u274C [DatabaseAdapter] \u8BBE\u7F6E\u9ED8\u8BA4\u914D\u7F6E\u5931\u8D25:", error);
715
+ throw error;
716
+ }
717
+ }
718
+ /**
719
+ * 获取默认配置
720
+ */
721
+ async getDefaultConfig() {
722
+ try {
723
+ const conditions = [eq(testYourselfConfigs.isDefault, true)];
724
+ if (this.softDelete) {
725
+ conditions.push(eq(testYourselfConfigs.isDeleted, false));
726
+ }
727
+ if (this.organizationId) {
728
+ conditions.push(
729
+ eq(testYourselfConfigs.organizationId, this.organizationId)
730
+ );
731
+ }
732
+ const result = await this.db.select().from(testYourselfConfigs).where(and(...conditions)).limit(1);
733
+ if (!result || result.length === 0) {
734
+ return null;
735
+ }
736
+ return this.toSavedConfig(result[0]);
737
+ } catch (error) {
738
+ console.error("\u274C [DatabaseAdapter] \u83B7\u53D6\u9ED8\u8BA4\u914D\u7F6E\u5931\u8D25:", error);
739
+ throw error;
740
+ }
741
+ }
742
+ /**
743
+ * 恢复已删除的配置(软删除时可用)
744
+ */
745
+ async restoreConfig(id) {
746
+ if (!this.softDelete) {
747
+ throw new Error("\u6062\u590D\u529F\u80FD\u4EC5\u5728\u542F\u7528\u8F6F\u5220\u9664\u65F6\u53EF\u7528");
748
+ }
749
+ try {
750
+ await this.db.update(testYourselfConfigs).set({
751
+ isDeleted: false,
752
+ deletedAt: null,
753
+ updatedBy: this.userId,
754
+ updatedAt: /* @__PURE__ */ new Date()
755
+ }).where(eq(testYourselfConfigs.id, id));
756
+ console.log("\u267B\uFE0F [DatabaseAdapter] \u914D\u7F6E\u5DF2\u6062\u590D:", id);
757
+ } catch (error) {
758
+ console.error("\u274C [DatabaseAdapter] \u6062\u590D\u914D\u7F6E\u5931\u8D25:", error);
759
+ throw error;
760
+ }
761
+ }
762
+ /**
763
+ * 归档配置
764
+ */
765
+ async archiveConfig(id) {
766
+ try {
767
+ await this.db.update(testYourselfConfigs).set({
768
+ isArchived: true,
769
+ archivedAt: /* @__PURE__ */ new Date(),
770
+ updatedBy: this.userId,
771
+ updatedAt: /* @__PURE__ */ new Date()
772
+ }).where(eq(testYourselfConfigs.id, id));
773
+ console.log("\u{1F4E6} [DatabaseAdapter] \u914D\u7F6E\u5DF2\u5F52\u6863:", id);
774
+ } catch (error) {
775
+ console.error("\u274C [DatabaseAdapter] \u5F52\u6863\u914D\u7F6E\u5931\u8D25:", error);
776
+ throw error;
777
+ }
778
+ }
779
+ /**
780
+ * 取消归档
781
+ */
782
+ async unarchiveConfig(id) {
783
+ try {
784
+ await this.db.update(testYourselfConfigs).set({
785
+ isArchived: false,
786
+ archivedAt: null,
787
+ updatedBy: this.userId,
788
+ updatedAt: /* @__PURE__ */ new Date()
789
+ }).where(eq(testYourselfConfigs.id, id));
790
+ console.log("\u{1F4C2} [DatabaseAdapter] \u914D\u7F6E\u5DF2\u53D6\u6D88\u5F52\u6863:", id);
791
+ } catch (error) {
792
+ console.error("\u274C [DatabaseAdapter] \u53D6\u6D88\u5F52\u6863\u5931\u8D25:", error);
793
+ throw error;
794
+ }
795
+ }
796
+ /**
797
+ * 记录使用次数
798
+ */
799
+ async incrementUsageCount(id) {
800
+ try {
801
+ await this.db.update(testYourselfConfigs).set({
802
+ usageCount: sql`${testYourselfConfigs.usageCount} + 1`,
803
+ lastUsedAt: /* @__PURE__ */ new Date()
804
+ }).where(eq(testYourselfConfigs.id, id));
805
+ } catch (error) {
806
+ console.error("\u274C [DatabaseAdapter] \u66F4\u65B0\u4F7F\u7528\u6B21\u6570\u5931\u8D25:", error);
807
+ }
808
+ }
809
+ };
810
+ function createDatabaseConfigAdapter(options) {
811
+ return new DatabaseConfigAdapter(options);
812
+ }
813
+
814
+ export { ConfigService, DatabaseConfigAdapter, createConfigService, createDatabaseConfigAdapter, getDefaultConfigService, testYourselfConfigShares, testYourselfConfigUsage, testYourselfConfigs };
815
+ //# sourceMappingURL=index.mjs.map
816
+ //# sourceMappingURL=index.mjs.map