@dofe/infra-prisma 0.1.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.
- package/dist/db-metrics/index.d.ts +2 -0
- package/dist/db-metrics/index.d.ts.map +1 -0
- package/dist/db-metrics/index.js +18 -0
- package/dist/db-metrics/index.js.map +1 -0
- package/dist/db-metrics/src/db-metrics.module.d.ts +22 -0
- package/dist/db-metrics/src/db-metrics.module.d.ts.map +1 -0
- package/dist/db-metrics/src/db-metrics.module.js +140 -0
- package/dist/db-metrics/src/db-metrics.module.js.map +1 -0
- package/dist/db-metrics/src/db-metrics.service.d.ts +183 -0
- package/dist/db-metrics/src/db-metrics.service.d.ts.map +1 -0
- package/dist/db-metrics/src/db-metrics.service.js +334 -0
- package/dist/db-metrics/src/db-metrics.service.js.map +1 -0
- package/dist/db-metrics/src/index.d.ts +6 -0
- package/dist/db-metrics/src/index.d.ts.map +1 -0
- package/dist/db-metrics/src/index.js +24 -0
- package/dist/db-metrics/src/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/soft-delete.middleware.d.ts +51 -0
- package/dist/middleware/soft-delete.middleware.d.ts.map +1 -0
- package/dist/middleware/soft-delete.middleware.js +289 -0
- package/dist/middleware/soft-delete.middleware.js.map +1 -0
- package/dist/middleware/tenant-isolation-extension.d.ts +18 -0
- package/dist/middleware/tenant-isolation-extension.d.ts.map +1 -0
- package/dist/middleware/tenant-isolation-extension.js +124 -0
- package/dist/middleware/tenant-isolation-extension.js.map +1 -0
- package/dist/prisma/index.d.ts +7 -0
- package/dist/prisma/index.d.ts.map +1 -0
- package/dist/prisma/index.js +25 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma/prisma.module.d.ts +3 -0
- package/dist/prisma/prisma.module.d.ts.map +1 -0
- package/dist/prisma/prisma.module.js +26 -0
- package/dist/prisma/prisma.module.js.map +1 -0
- package/dist/prisma/prisma.service.d.ts +10 -0
- package/dist/prisma/prisma.service.d.ts.map +1 -0
- package/dist/prisma/prisma.service.js +36 -0
- package/dist/prisma/prisma.service.js.map +1 -0
- package/dist/prisma/types.d.ts +4 -0
- package/dist/prisma/types.d.ts.map +1 -0
- package/dist/prisma/types.js +22 -0
- package/dist/prisma/types.js.map +1 -0
- package/dist/prisma-read/prisma-read.module.d.ts +3 -0
- package/dist/prisma-read/prisma-read.module.d.ts.map +1 -0
- package/dist/prisma-read/prisma-read.module.js +24 -0
- package/dist/prisma-read/prisma-read.module.js.map +1 -0
- package/dist/prisma-read/prisma-read.service.d.ts +47 -0
- package/dist/prisma-read/prisma-read.service.d.ts.map +1 -0
- package/dist/prisma-read/prisma-read.service.js +222 -0
- package/dist/prisma-read/prisma-read.service.js.map +1 -0
- package/dist/prisma-write/prisma-write.module.d.ts +3 -0
- package/dist/prisma-write/prisma-write.module.d.ts.map +1 -0
- package/dist/prisma-write/prisma-write.module.js +24 -0
- package/dist/prisma-write/prisma-write.module.js.map +1 -0
- package/dist/prisma-write/prisma-write.service.d.ts +47 -0
- package/dist/prisma-write/prisma-write.service.d.ts.map +1 -0
- package/dist/prisma-write/prisma-write.service.js +222 -0
- package/dist/prisma-write/prisma-write.service.js.map +1 -0
- package/dist/prometheus/index.d.ts +5 -0
- package/dist/prometheus/index.d.ts.map +1 -0
- package/dist/prometheus/index.js +9 -0
- package/dist/prometheus/index.js.map +1 -0
- package/dist/prometheus/prometheus.module.d.ts +3 -0
- package/dist/prometheus/prometheus.module.d.ts.map +1 -0
- package/dist/prometheus/prometheus.module.js +230 -0
- package/dist/prometheus/prometheus.module.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Soft Delete Middleware
|
|
4
|
+
* 软删除中间件
|
|
5
|
+
*
|
|
6
|
+
* 自动处理软删除逻辑:
|
|
7
|
+
* 1. 查询操作自动添加 isDeleted: false 条件
|
|
8
|
+
* 2. 删除操作自动转换为软删除(update isDeleted = true)
|
|
9
|
+
*
|
|
10
|
+
* Prisma 7.x 更新:
|
|
11
|
+
* - 使用 $extends 替代已移除的 $use 方法
|
|
12
|
+
* - 返回扩展后的 PrismaClient 实例
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const prisma = new PrismaClient();
|
|
17
|
+
* const extendedPrisma = setupSoftDeleteMiddleware(prisma);
|
|
18
|
+
* // 使用 extendedPrisma 而不是原始的 prisma
|
|
19
|
+
* await extendedPrisma.userInfo.findMany(); // 自动添加 isDeleted: false
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.isSoftDeleteModel = isSoftDeleteModel;
|
|
24
|
+
exports.setupSoftDeleteMiddleware = setupSoftDeleteMiddleware;
|
|
25
|
+
exports.hardDelete = hardDelete;
|
|
26
|
+
/**
|
|
27
|
+
* 查询操作列表
|
|
28
|
+
*/
|
|
29
|
+
const QUERY_ACTIONS = [
|
|
30
|
+
'findFirst',
|
|
31
|
+
'findMany',
|
|
32
|
+
'findUnique',
|
|
33
|
+
'findFirstOrThrow',
|
|
34
|
+
'findUniqueOrThrow',
|
|
35
|
+
'count',
|
|
36
|
+
'aggregate',
|
|
37
|
+
'groupBy',
|
|
38
|
+
];
|
|
39
|
+
/**
|
|
40
|
+
* 不支持软删除的模型列表(这些模型没有 isDeleted 字段)
|
|
41
|
+
*
|
|
42
|
+
* 分类说明:
|
|
43
|
+
* - 系统/配置表:SystemTaskQueue
|
|
44
|
+
* - 关联表:BotPlugin, BotSkill, BotModel
|
|
45
|
+
* - 日志表:BotUsageLog, OperateLog
|
|
46
|
+
* - 安全令牌表:ProxyToken
|
|
47
|
+
*/
|
|
48
|
+
const NON_SOFT_DELETE_MODELS = [
|
|
49
|
+
// 系统/配置表(无 isDeleted 字段)
|
|
50
|
+
'SystemTaskQueue',
|
|
51
|
+
'SystemConfig',
|
|
52
|
+
'TenantConfig',
|
|
53
|
+
'SystemSyncTask',
|
|
54
|
+
// 关联表(多对多关系,通过 onDelete: Cascade 级联删除,无 isDeleted 字段)
|
|
55
|
+
'BotSkill',
|
|
56
|
+
'BotModel',
|
|
57
|
+
'BotPlugin',
|
|
58
|
+
'BotMcpServer',
|
|
59
|
+
'GatewaySkill',
|
|
60
|
+
'TenantPlugin',
|
|
61
|
+
'ModelCapabilityTag',
|
|
62
|
+
'ModelAvailabilityCapabilityTag',
|
|
63
|
+
'FallbackChainModel',
|
|
64
|
+
'ComplexityRoutingModelMapping',
|
|
65
|
+
'BotSkillSourceSnapshot',
|
|
66
|
+
'BotKnowledgeBaseSourceSnapshot',
|
|
67
|
+
'BotKnowledgeLink',
|
|
68
|
+
// 路由/策略配置表(无 isDeleted 字段)
|
|
69
|
+
'BotModelRouting',
|
|
70
|
+
'BotRoutingConfig',
|
|
71
|
+
'ComplexityRoutingConfig',
|
|
72
|
+
'FallbackChain',
|
|
73
|
+
'CostStrategy',
|
|
74
|
+
'AgentModel',
|
|
75
|
+
'GatewayConfigVersion',
|
|
76
|
+
'GatewayConfigChangeLog',
|
|
77
|
+
// 技能版本表(只追加,不软删除,无 isDeleted 字段)
|
|
78
|
+
'SkillVersion',
|
|
79
|
+
// 技能表(通过 onDelete: Cascade 级联删除,无 isDeleted 字段)
|
|
80
|
+
'Skill',
|
|
81
|
+
// 模型可用性缓存表(无需软删除,无 isDeleted 字段)
|
|
82
|
+
'ModelAvailability',
|
|
83
|
+
'ModelCatalog',
|
|
84
|
+
// 日志表(只追加,不删除,无 isDeleted 字段)
|
|
85
|
+
'BotUsageLog',
|
|
86
|
+
'OperateLog',
|
|
87
|
+
'OpenClawAuditEvent',
|
|
88
|
+
// 安全令牌表(通过 revokedAt 字段标记失效,不使用软删除,无 isDeleted 字段)
|
|
89
|
+
'ProxyToken',
|
|
90
|
+
// MCP Server(无 isDeleted 字段)
|
|
91
|
+
'McpServer',
|
|
92
|
+
// Pairing 记录(无 isDeleted 字段)
|
|
93
|
+
'FeishuPairingRecord',
|
|
94
|
+
'PlatformPairingRecord',
|
|
95
|
+
// 计费相关表(当前 schema 未包含 isDeleted 字段)
|
|
96
|
+
'Invoice',
|
|
97
|
+
'InvoiceItem',
|
|
98
|
+
'Payment',
|
|
99
|
+
'Topup',
|
|
100
|
+
// === bot autonomy / trigger / notification ===
|
|
101
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
102
|
+
'ApprovalRequest',
|
|
103
|
+
'BotTokenUsage',
|
|
104
|
+
'BotTrigger',
|
|
105
|
+
'BotTriggerHistory',
|
|
106
|
+
'Notification',
|
|
107
|
+
// === workspace / session ===
|
|
108
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
109
|
+
'Workspace',
|
|
110
|
+
'WorkspaceSession',
|
|
111
|
+
// === feedback / optimization ===
|
|
112
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
113
|
+
'BotExecutionFeedback',
|
|
114
|
+
'BotOptimizationSuggestion',
|
|
115
|
+
// === knowledge ===
|
|
116
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
117
|
+
'KnowledgeBaseBot',
|
|
118
|
+
'KnowledgeUsage',
|
|
119
|
+
// === bot session / chain ===
|
|
120
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
121
|
+
'BotSessionChain',
|
|
122
|
+
'BotCrossSessionMessage',
|
|
123
|
+
'SubAgentMessage',
|
|
124
|
+
'SubAgentHeartbeatConfig',
|
|
125
|
+
'SubAgentHeartbeatLog',
|
|
126
|
+
'SubAgentRelation',
|
|
127
|
+
'AutonomyPolicy',
|
|
128
|
+
// === bot extensions ===
|
|
129
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
130
|
+
'BotFocusExtension',
|
|
131
|
+
'BotCronJobMeta',
|
|
132
|
+
'BotMdFileVersion',
|
|
133
|
+
'MemoryItem',
|
|
134
|
+
// === organization ===
|
|
135
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
136
|
+
'OrganizationMember',
|
|
137
|
+
'UserTenantPreference',
|
|
138
|
+
// === template ===
|
|
139
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
140
|
+
'PositionSkill',
|
|
141
|
+
'PositionKnowledgeBase',
|
|
142
|
+
'TemplateSkill',
|
|
143
|
+
'TemplateKnowledgeBase',
|
|
144
|
+
// === general preset ===
|
|
145
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
146
|
+
'GeneralPreset',
|
|
147
|
+
'GeneralPresetSkill',
|
|
148
|
+
'GeneralPresetKnowledgeBase',
|
|
149
|
+
// === marketing ===
|
|
150
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
151
|
+
'MarketingLead',
|
|
152
|
+
// === compliance / data lifecycle ===
|
|
153
|
+
// DeletionRequest 模型无 isDeleted 字段,通过 status 字段管理状态
|
|
154
|
+
'DeletionRequest',
|
|
155
|
+
// === plaza ===
|
|
156
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
157
|
+
'PlazaLike',
|
|
158
|
+
'PlazaSubscription',
|
|
159
|
+
// === workflow ===
|
|
160
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
161
|
+
'BotWorkflow',
|
|
162
|
+
'WorkflowTemplate',
|
|
163
|
+
'WorkflowExecution',
|
|
164
|
+
'WorkflowNodeExecution',
|
|
165
|
+
'WorkflowVersion',
|
|
166
|
+
// === cost intelligence ===
|
|
167
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
168
|
+
'CostAnomaly',
|
|
169
|
+
'AnomalyRule',
|
|
170
|
+
'OptimizationSuggestion',
|
|
171
|
+
'CostPrediction',
|
|
172
|
+
'BotOptimizationSuggestion',
|
|
173
|
+
// === compliance (Q1 2027 治理合规 1.0) ===
|
|
174
|
+
// 这些模型当前 schema 未包含 isDeleted 字段
|
|
175
|
+
'CertificationStatus',
|
|
176
|
+
'RetentionPolicy',
|
|
177
|
+
'DeletionRequest',
|
|
178
|
+
'ComplianceReport',
|
|
179
|
+
];
|
|
180
|
+
/**
|
|
181
|
+
* 检查模型是否支持软删除
|
|
182
|
+
*/
|
|
183
|
+
function isSoftDeleteModel(modelName) {
|
|
184
|
+
if (!modelName)
|
|
185
|
+
return false;
|
|
186
|
+
// 如果模型在不支持软删除的列表中,返回 false
|
|
187
|
+
return !NON_SOFT_DELETE_MODELS.includes(modelName);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 检查 where 条件是否已显式指定 isDeleted
|
|
191
|
+
* 支持嵌套的 OR/AND/NOT 条件
|
|
192
|
+
*/
|
|
193
|
+
function hasExplicitIsDeleted(where) {
|
|
194
|
+
if (!where)
|
|
195
|
+
return false;
|
|
196
|
+
// 直接检查 isDeleted 字段
|
|
197
|
+
if ('isDeleted' in where)
|
|
198
|
+
return true;
|
|
199
|
+
// 检查 OR 条件
|
|
200
|
+
if (Array.isArray(where.OR)) {
|
|
201
|
+
for (const condition of where.OR) {
|
|
202
|
+
if (hasExplicitIsDeleted(condition)) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// 检查 AND 条件
|
|
208
|
+
if (Array.isArray(where.AND)) {
|
|
209
|
+
for (const condition of where.AND) {
|
|
210
|
+
if (hasExplicitIsDeleted(condition)) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// 检查 NOT 条件
|
|
216
|
+
if (where.NOT) {
|
|
217
|
+
if (Array.isArray(where.NOT)) {
|
|
218
|
+
for (const condition of where.NOT) {
|
|
219
|
+
if (hasExplicitIsDeleted(condition)) {
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
if (hasExplicitIsDeleted(where.NOT)) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* 设置软删除中间件
|
|
234
|
+
* Prisma 7.x: 使用 $extends 创建扩展客户端
|
|
235
|
+
*
|
|
236
|
+
* 注意:由于 Prisma 7.x 的 $extends API 限制,delete 操作的转换需要使用模型特定的扩展
|
|
237
|
+
* 当前实现仅处理查询操作的软删除过滤
|
|
238
|
+
*
|
|
239
|
+
* @param prisma - Prisma 客户端实例
|
|
240
|
+
* @returns 扩展后的 PrismaClient 实例
|
|
241
|
+
*/
|
|
242
|
+
function setupSoftDeleteMiddleware(prisma) {
|
|
243
|
+
return prisma.$extends({
|
|
244
|
+
query: {
|
|
245
|
+
$allOperations({ operation, model, args, query }) {
|
|
246
|
+
// 检查是否为软删除模型
|
|
247
|
+
if (!isSoftDeleteModel(model)) {
|
|
248
|
+
return query(args);
|
|
249
|
+
}
|
|
250
|
+
// 处理查询操作:自动添加 isDeleted: false
|
|
251
|
+
if (QUERY_ACTIONS.includes(operation)) {
|
|
252
|
+
const newArgs = { ...args };
|
|
253
|
+
if (!newArgs.where) {
|
|
254
|
+
newArgs.where = {};
|
|
255
|
+
}
|
|
256
|
+
// 只有在未显式指定 isDeleted 时才自动添加
|
|
257
|
+
if (!hasExplicitIsDeleted(newArgs.where)) {
|
|
258
|
+
newArgs.where = {
|
|
259
|
+
...newArgs.where,
|
|
260
|
+
isDeleted: false,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return query(newArgs);
|
|
264
|
+
}
|
|
265
|
+
// 对于 delete 和 deleteMany 操作,我们需要使用不同的方法
|
|
266
|
+
// 在 Prisma 7.x 中,我们不能在 $extends 中直接将一个操作转换为另一个操作
|
|
267
|
+
// 这些操作需要在使用时手动处理,或者使用模型特定的扩展
|
|
268
|
+
// 暂时让这些操作通过,后续可以通过其他方式处理
|
|
269
|
+
return query(args);
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* 硬删除工具函数
|
|
276
|
+
* 当确实需要物理删除时使用
|
|
277
|
+
*
|
|
278
|
+
* @example
|
|
279
|
+
* ```typescript
|
|
280
|
+
* await hardDelete(prisma.userInfo, { id: 'xxx' });
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
async function hardDelete(model, where) {
|
|
284
|
+
// 直接调用原始 delete,绕过中间件的软删除转换
|
|
285
|
+
// 注意:由于中间件会拦截 delete,这个函数实际上需要使用 $executeRaw
|
|
286
|
+
// 这里只是一个概念示例,实际使用时需要使用原始 SQL
|
|
287
|
+
return model.delete({ where });
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=soft-delete.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soft-delete.middleware.js","sourceRoot":"","sources":["../../src/middleware/soft-delete.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
2
|
+
export declare const tenantContext: AsyncLocalStorage<{
|
|
3
|
+
tenantId: string;
|
|
4
|
+
}>;
|
|
5
|
+
/**
|
|
6
|
+
* 获取当前租户 ID
|
|
7
|
+
*/
|
|
8
|
+
export declare function getTenantId(): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* 设置租户上下文
|
|
11
|
+
*/
|
|
12
|
+
export declare function setTenantContext(tenantId: string, callback: () => void): void;
|
|
13
|
+
/**
|
|
14
|
+
* 创建租户隔离扩展(Prisma 7.x)
|
|
15
|
+
* 自动注入 tenantId 过滤,防止跨租户数据访问
|
|
16
|
+
*/
|
|
17
|
+
export declare function setupTenantIsolationExtension(prisma: any): any;
|
|
18
|
+
//# sourceMappingURL=tenant-isolation-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-isolation-extension.d.ts","sourceRoot":"","sources":["../../src/middleware/tenant-isolation-extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,eAAO,MAAM,aAAa;cAAqC,MAAM;EAAK,CAAC;AAE3E;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAG3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAEtE;AAyBD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,OA2ExD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tenantContext = void 0;
|
|
4
|
+
exports.getTenantId = getTenantId;
|
|
5
|
+
exports.setTenantContext = setTenantContext;
|
|
6
|
+
exports.setupTenantIsolationExtension = setupTenantIsolationExtension;
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
const async_hooks_1 = require("async_hooks");
|
|
9
|
+
// 全局上下文存储
|
|
10
|
+
exports.tenantContext = new async_hooks_1.AsyncLocalStorage();
|
|
11
|
+
/**
|
|
12
|
+
* 获取当前租户 ID
|
|
13
|
+
*/
|
|
14
|
+
function getTenantId() {
|
|
15
|
+
const context = exports.tenantContext.getStore();
|
|
16
|
+
return context?.tenantId || null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 设置租户上下文
|
|
20
|
+
*/
|
|
21
|
+
function setTenantContext(tenantId, callback) {
|
|
22
|
+
exports.tenantContext.run({ tenantId }, callback);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 多租户表列表
|
|
26
|
+
*/
|
|
27
|
+
const MULTI_TENANT_MODELS = [
|
|
28
|
+
'Bot',
|
|
29
|
+
'BotCronJobMeta',
|
|
30
|
+
'BotModelRouting',
|
|
31
|
+
'BotSkill',
|
|
32
|
+
'BotUsageLog',
|
|
33
|
+
'Conversation',
|
|
34
|
+
'Message',
|
|
35
|
+
'PluginInstall',
|
|
36
|
+
'ProviderKey',
|
|
37
|
+
'ModelAvailability',
|
|
38
|
+
'AuditLog',
|
|
39
|
+
'File',
|
|
40
|
+
'Skill',
|
|
41
|
+
'SkillVersion',
|
|
42
|
+
'TenantMember',
|
|
43
|
+
'FallbackChain',
|
|
44
|
+
'GatewayConfigVersion',
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* 创建租户隔离扩展(Prisma 7.x)
|
|
48
|
+
* 自动注入 tenantId 过滤,防止跨租户数据访问
|
|
49
|
+
*/
|
|
50
|
+
function setupTenantIsolationExtension(prisma) {
|
|
51
|
+
return prisma.$extends({
|
|
52
|
+
query: {
|
|
53
|
+
$allModels: {
|
|
54
|
+
async $allOperations({ model, operation, args, query }) {
|
|
55
|
+
// 只处理多租户表
|
|
56
|
+
if (!MULTI_TENANT_MODELS.includes(model)) {
|
|
57
|
+
return query(args);
|
|
58
|
+
}
|
|
59
|
+
// 获取当前租户 ID
|
|
60
|
+
const tenantId = getTenantId();
|
|
61
|
+
// 如果没有租户上下文,跳过(例如系统级操作)
|
|
62
|
+
if (!tenantId) {
|
|
63
|
+
return query(args);
|
|
64
|
+
}
|
|
65
|
+
// 读操作:自动注入 tenantId 过滤
|
|
66
|
+
if ([
|
|
67
|
+
'findMany',
|
|
68
|
+
'findFirst',
|
|
69
|
+
'findUnique',
|
|
70
|
+
'count',
|
|
71
|
+
'aggregate',
|
|
72
|
+
].includes(operation)) {
|
|
73
|
+
args.where = {
|
|
74
|
+
...args.where,
|
|
75
|
+
tenantId,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// 写操作:自动注入 tenantId
|
|
79
|
+
if (operation === 'create') {
|
|
80
|
+
args.data = {
|
|
81
|
+
...args.data,
|
|
82
|
+
tenantId,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (operation === 'createMany') {
|
|
86
|
+
if (Array.isArray(args.data)) {
|
|
87
|
+
args.data = args.data.map((item) => ({
|
|
88
|
+
...item,
|
|
89
|
+
tenantId,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 更新/删除操作:验证 tenantId
|
|
94
|
+
if (['update', 'updateMany', 'delete', 'deleteMany', 'upsert'].includes(operation)) {
|
|
95
|
+
args.where = {
|
|
96
|
+
...args.where,
|
|
97
|
+
tenantId,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const result = await query(args);
|
|
101
|
+
// 验证返回结果不包含其他租户数据
|
|
102
|
+
if (result && typeof result === 'object') {
|
|
103
|
+
validateResultTenantId(result, tenantId);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 验证结果中的 tenantId
|
|
113
|
+
*/
|
|
114
|
+
function validateResultTenantId(result, expectedTenantId) {
|
|
115
|
+
if (Array.isArray(result)) {
|
|
116
|
+
result.forEach((item) => validateResultTenantId(item, expectedTenantId));
|
|
117
|
+
}
|
|
118
|
+
else if (result && typeof result === 'object') {
|
|
119
|
+
if (result.tenantId && result.tenantId !== expectedTenantId) {
|
|
120
|
+
throw new common_1.ForbiddenException(`Data leak detected: result contains data from tenant ${result.tenantId}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=tenant-isolation-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-isolation-extension.js","sourceRoot":"","sources":["../../src/middleware/tenant-isolation-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.PrismaModule = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* Prisma 模块导出
|
|
20
|
+
*/
|
|
21
|
+
var prisma_module_1 = require("./prisma.module");
|
|
22
|
+
Object.defineProperty(exports, "PrismaModule", { enumerable: true, get: function () { return prisma_module_1.PrismaModule; } });
|
|
23
|
+
__exportStar(require("./prisma.service"), exports);
|
|
24
|
+
__exportStar(require("./types"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,mDAAiC;AACjC,0CAAwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.module.d.ts","sourceRoot":"","sources":["../../src/prisma/prisma.module.ts"],"names":[],"mappings":"AAMA,qBAKa,YAAY;CAAG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PrismaModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const prisma_service_1 = require("@/prisma/prisma.service");
|
|
12
|
+
const prisma_write_module_1 = require("@/prisma-write/prisma-write.module");
|
|
13
|
+
const prisma_read_module_1 = require("@/prisma-read/prisma-read.module");
|
|
14
|
+
const infra_redis_1 = require("@dofe/infra-redis");
|
|
15
|
+
const config_1 = require("@nestjs/config");
|
|
16
|
+
let PrismaModule = class PrismaModule {
|
|
17
|
+
};
|
|
18
|
+
exports.PrismaModule = PrismaModule;
|
|
19
|
+
exports.PrismaModule = PrismaModule = __decorate([
|
|
20
|
+
(0, common_1.Module)({
|
|
21
|
+
imports: [prisma_write_module_1.PrismaWriteModule, prisma_read_module_1.PrismaReadModule, infra_redis_1.RedisModule, config_1.ConfigModule],
|
|
22
|
+
providers: [prisma_service_1.PrismaService],
|
|
23
|
+
exports: [prisma_service_1.PrismaService],
|
|
24
|
+
})
|
|
25
|
+
], PrismaModule);
|
|
26
|
+
//# sourceMappingURL=prisma.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.module.js","sourceRoot":"","sources":["../../src/prisma/prisma.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,4DAAwD;AACxD,4EAAuE;AACvE,yEAAoE;AACpE,mDAAgD;AAChD,2CAA8C;AAMvC,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IALxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,uCAAiB,EAAE,qCAAgB,EAAE,yBAAW,EAAE,qBAAY,CAAC;QACzE,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PrismaReadService } from '@/prisma-read/prisma-read.service';
|
|
2
|
+
import { PrismaWriteService } from '@/prisma-write/prisma-write.service';
|
|
3
|
+
export declare class PrismaService {
|
|
4
|
+
private readonly prismaRead;
|
|
5
|
+
private readonly prismaWrite;
|
|
6
|
+
constructor(prismaRead: PrismaReadService, prismaWrite: PrismaWriteService);
|
|
7
|
+
get read(): import("@prisma/client").PrismaClient<import("@prisma/client").Prisma.PrismaClientOptions, import("@prisma/client").Prisma.LogLevel, import("../../../../../models.dofe.ai/apps/api/generated/prisma-client/runtime/client").DefaultArgs>;
|
|
8
|
+
get write(): import("@prisma/client").PrismaClient<import("@prisma/client").Prisma.PrismaClientOptions, import("@prisma/client").Prisma.LogLevel, import("../../../../../models.dofe.ai/apps/api/generated/prisma-client/runtime/client").DefaultArgs>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=prisma.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.service.d.ts","sourceRoot":"","sources":["../../src/prisma/prisma.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,qBACa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,kBAAkB;IAElD,IAAI,IAAI,8OAEP;IAED,IAAI,KAAK,8OAER;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PrismaService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const prisma_read_service_1 = require("@/prisma-read/prisma-read.service");
|
|
15
|
+
const prisma_write_service_1 = require("@/prisma-write/prisma-write.service");
|
|
16
|
+
let PrismaService = class PrismaService {
|
|
17
|
+
prismaRead;
|
|
18
|
+
prismaWrite;
|
|
19
|
+
constructor(prismaRead, prismaWrite) {
|
|
20
|
+
this.prismaRead = prismaRead;
|
|
21
|
+
this.prismaWrite = prismaWrite;
|
|
22
|
+
}
|
|
23
|
+
get read() {
|
|
24
|
+
return this.prismaRead.client;
|
|
25
|
+
}
|
|
26
|
+
get write() {
|
|
27
|
+
return this.prismaWrite.client;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.PrismaService = PrismaService;
|
|
31
|
+
exports.PrismaService = PrismaService = __decorate([
|
|
32
|
+
(0, common_1.Injectable)(),
|
|
33
|
+
__metadata("design:paramtypes", [prisma_read_service_1.PrismaReadService,
|
|
34
|
+
prisma_write_service_1.PrismaWriteService])
|
|
35
|
+
], PrismaService);
|
|
36
|
+
//# sourceMappingURL=prisma.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.service.js","sourceRoot":"","sources":["../../src/prisma/prisma.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2EAAsE;AACtE,8EAAyE;AAGlE,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEL;IACA;IAFnB,YACmB,UAA6B,EAC7B,WAA+B;QAD/B,eAAU,GAAV,UAAU,CAAmB;QAC7B,gBAAW,GAAX,WAAW,CAAoB;IAC/C,CAAC;IACJ,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;CACF,CAAA;AAZY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAGoB,uCAAiB;QAChB,yCAAkB;GAHvC,aAAa,CAYzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prisma/types.ts"],"names":[],"mappings":"AAEA,qBAAa,WAAW;IAEtB,GAAG,EAAE,MAAM,CAAC;CACb"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AppDbConfig = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
class AppDbConfig {
|
|
15
|
+
url;
|
|
16
|
+
}
|
|
17
|
+
exports.AppDbConfig = AppDbConfig;
|
|
18
|
+
__decorate([
|
|
19
|
+
(0, class_validator_1.IsNotEmpty)(),
|
|
20
|
+
__metadata("design:type", String)
|
|
21
|
+
], AppDbConfig.prototype, "url", void 0);
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prisma/types.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAA6C;AAE7C,MAAa,WAAW;IAEtB,GAAG,CAAS;CACb;AAHD,kCAGC;AADC;IADC,IAAA,4BAAU,GAAE;;wCACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-read.module.d.ts","sourceRoot":"","sources":["../../src/prisma-read/prisma-read.module.ts"],"names":[],"mappings":"AAKA,qBAKa,gBAAgB;CAAG"}
|