@aneuhold/be-ts-db-lib 2.0.84 → 3.0.0
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/CHANGELOG.md +19 -0
- package/lib/repositories/BaseRepository.d.ts +12 -12
- package/lib/repositories/BaseRepository.d.ts.map +1 -1
- package/lib/repositories/BaseRepository.js +8 -6
- package/lib/repositories/BaseRepository.js.map +1 -1
- package/lib/repositories/BaseRepository.ts +16 -18
- package/lib/repositories/common/ApiKeyRepository.d.ts +1 -1
- package/lib/repositories/common/ApiKeyRepository.d.ts.map +1 -1
- package/lib/repositories/common/ApiKeyRepository.js +1 -1
- package/lib/repositories/common/ApiKeyRepository.js.map +1 -1
- package/lib/repositories/common/ApiKeyRepository.ts +1 -1
- package/lib/repositories/common/UserRepository.d.ts +4 -3
- package/lib/repositories/common/UserRepository.d.ts.map +1 -1
- package/lib/repositories/common/UserRepository.js +1 -0
- package/lib/repositories/common/UserRepository.js.map +1 -1
- package/lib/repositories/common/UserRepository.ts +4 -3
- package/lib/repositories/dashboard/DashboardBaseRepository.js +2 -0
- package/lib/repositories/dashboard/DashboardBaseRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.d.ts +3 -3
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.ts +3 -3
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.d.ts +3 -3
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.ts +3 -3
- package/lib/repositories/dashboard/DashboardTaskRepository.d.ts +6 -6
- package/lib/repositories/dashboard/DashboardTaskRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.js +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.ts +7 -7
- package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts +4 -4
- package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardUserConfigRepository.js +2 -2
- package/lib/repositories/dashboard/DashboardUserConfigRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardUserConfigRepository.ts +6 -6
- package/lib/services/DemoAccountsService/DashboardDemoAccountsService.d.ts +2 -2
- package/lib/services/DemoAccountsService/DashboardDemoAccountsService.d.ts.map +1 -1
- package/lib/services/DemoAccountsService/DashboardDemoAccountsService.js +2 -2
- package/lib/services/DemoAccountsService/DashboardDemoAccountsService.js.map +1 -1
- package/lib/services/DemoAccountsService/DashboardDemoAccountsService.ts +13 -13
- package/lib/services/DemoAccountsService/DemoAccountsService.d.ts +2 -2
- package/lib/services/DemoAccountsService/DemoAccountsService.d.ts.map +1 -1
- package/lib/services/DemoAccountsService/DemoAccountsService.js.map +1 -1
- package/lib/services/DemoAccountsService/DemoAccountsService.ts +2 -5
- package/lib/services/MigrationService.d.ts.map +1 -1
- package/lib/services/MigrationService.js +151 -19
- package/lib/services/MigrationService.js.map +1 -1
- package/lib/services/MigrationService.ts +178 -21
- package/lib/services/RepoSubscriptionService.d.ts +3 -3
- package/lib/services/RepoSubscriptionService.d.ts.map +1 -1
- package/lib/services/RepoSubscriptionService.js +1 -0
- package/lib/services/RepoSubscriptionService.js.map +1 -1
- package/lib/services/RepoSubscriptionService.ts +3 -3
- package/lib/tests/testsUtil.js +2 -0
- package/lib/tests/testsUtil.js.map +1 -1
- package/lib/util/DocumentCleaner.js +1 -0
- package/lib/util/DocumentCleaner.js.map +1 -1
- package/lib/util/DocumentDb.d.ts +1 -1
- package/lib/util/DocumentDb.d.ts.map +1 -1
- package/lib/util/DocumentDb.js +1 -1
- package/lib/util/DocumentDb.js.map +1 -1
- package/lib/util/DocumentDb.ts +1 -1
- package/lib/validators/BaseValidator.d.ts +4 -3
- package/lib/validators/BaseValidator.d.ts.map +1 -1
- package/lib/validators/BaseValidator.js +2 -1
- package/lib/validators/BaseValidator.js.map +1 -1
- package/lib/validators/BaseValidator.ts +6 -5
- package/lib/validators/common/ApiKeyValidator.d.ts.map +1 -1
- package/lib/validators/common/ApiKeyValidator.js +7 -7
- package/lib/validators/common/ApiKeyValidator.js.map +1 -1
- package/lib/validators/common/ApiKeyValidator.ts +8 -15
- package/lib/validators/common/UserValidator.d.ts +1 -1
- package/lib/validators/common/UserValidator.d.ts.map +1 -1
- package/lib/validators/common/UserValidator.js +3 -3
- package/lib/validators/common/UserValidator.js.map +1 -1
- package/lib/validators/common/UserValidator.ts +5 -7
- package/lib/validators/dashboard/NonogramKatanaItemValidator.js +5 -5
- package/lib/validators/dashboard/NonogramKatanaItemValidator.js.map +1 -1
- package/lib/validators/dashboard/NonogramKatanaItemValidator.ts +6 -6
- package/lib/validators/dashboard/NonogramKatanaUpgradeValidator.js +5 -5
- package/lib/validators/dashboard/NonogramKatanaUpgradeValidator.js.map +1 -1
- package/lib/validators/dashboard/NonogramKatanaUpgradeValidator.ts +6 -6
- package/lib/validators/dashboard/TaskValidator.js +9 -9
- package/lib/validators/dashboard/TaskValidator.js.map +1 -1
- package/lib/validators/dashboard/TaskValidator.ts +10 -10
- package/lib/validators/dashboard/UserConfigValidator.d.ts.map +1 -1
- package/lib/validators/dashboard/UserConfigValidator.js +10 -10
- package/lib/validators/dashboard/UserConfigValidator.js.map +1 -1
- package/lib/validators/dashboard/UserConfigValidator.ts +11 -16
- package/package.json +10 -7
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
2
|
// @ts-nocheck
|
|
3
3
|
import { DR } from '@aneuhold/core-ts-lib';
|
|
4
|
+
import { ObjectId } from 'bson';
|
|
5
|
+
import { v7 as uuidv7 } from 'uuid';
|
|
4
6
|
import UserRepository from '../repositories/common/UserRepository.js';
|
|
7
|
+
import DashboardTaskRepository from '../repositories/dashboard/DashboardTaskRepository.js';
|
|
8
|
+
import DashboardUserConfigRepository from '../repositories/dashboard/DashboardUserConfigRepository.js';
|
|
5
9
|
|
|
6
10
|
/**
|
|
7
11
|
* A service for migrating the DB to a new state after an existing document
|
|
@@ -21,32 +25,185 @@ export default class MigrationService {
|
|
|
21
25
|
* @param dryRun Whether or not to actually make the changes or just log them.
|
|
22
26
|
*/
|
|
23
27
|
static async migrateDb(dryRun = false): Promise<void> {
|
|
28
|
+
return;
|
|
29
|
+
DR.logger.info('Starting migration from ObjectId to UUID v7...');
|
|
30
|
+
|
|
31
|
+
// 1. Load all documents
|
|
24
32
|
const userRepo = UserRepository.getRepo();
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const taskRepo = DashboardTaskRepository.getRepo();
|
|
34
|
+
const configRepo = DashboardUserConfigRepository.getRepo();
|
|
35
|
+
|
|
36
|
+
const users = await userRepo.getAll();
|
|
37
|
+
const tasks = await taskRepo.getAll();
|
|
38
|
+
const configs = await configRepo.getAll();
|
|
39
|
+
|
|
40
|
+
DR.logger.info(`Loaded ${users.length} users, ${tasks.length} tasks, ${configs.length} configs.`);
|
|
41
|
+
|
|
42
|
+
// 2. Create ID Map (Old ObjectId string -> New UUID)
|
|
43
|
+
const idMap = new Map<string, string>();
|
|
44
|
+
let newIdCount = 0;
|
|
45
|
+
|
|
46
|
+
const addToMap = (docs: any[]) => {
|
|
47
|
+
docs.forEach((doc) => {
|
|
48
|
+
if (doc._id instanceof ObjectId) {
|
|
49
|
+
idMap.set(doc._id.toHexString(), uuidv7());
|
|
50
|
+
newIdCount++;
|
|
51
|
+
} else if (typeof doc._id === 'string' && !idMap.has(doc._id)) {
|
|
52
|
+
// Already a string? Maybe already migrated or just a string ID.
|
|
53
|
+
// If it looks like an ObjectId, map it.
|
|
54
|
+
if (ObjectId.isValid(doc._id) && doc._id.length === 24) {
|
|
55
|
+
idMap.set(doc._id, uuidv7());
|
|
56
|
+
newIdCount++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
addToMap(users);
|
|
63
|
+
addToMap(tasks);
|
|
64
|
+
addToMap(configs);
|
|
65
|
+
|
|
66
|
+
DR.logger.info(`Generated ${newIdCount} new UUIDs.`);
|
|
67
|
+
|
|
68
|
+
// 3. Helper to get new ID
|
|
69
|
+
const getNewId = (oldId: any): string | undefined => {
|
|
70
|
+
if (!oldId) return undefined;
|
|
71
|
+
const oldIdStr = oldId.toString();
|
|
72
|
+
return idMap.get(oldIdStr) || (typeof oldId === 'string' ? oldId : undefined);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// 4. Prepare New Documents
|
|
76
|
+
const newUsers: any[] = [];
|
|
77
|
+
const oldUserIds: ObjectId[] = [];
|
|
78
|
+
|
|
79
|
+
const newTasks: any[] = [];
|
|
80
|
+
const oldTaskIds: ObjectId[] = [];
|
|
81
|
+
|
|
82
|
+
const newConfigs: any[] = [];
|
|
83
|
+
const oldConfigIds: ObjectId[] = [];
|
|
84
|
+
|
|
85
|
+
// --- Process Users ---
|
|
86
|
+
for (const user of users) {
|
|
87
|
+
if (user._id instanceof ObjectId) {
|
|
88
|
+
const newId = getNewId(user._id);
|
|
89
|
+
if (!newId) continue;
|
|
90
|
+
|
|
91
|
+
const newUser = { ...user, _id: newId };
|
|
92
|
+
// Users don't have many internal refs usually, but check if needed
|
|
93
|
+
newUsers.push(newUser);
|
|
94
|
+
oldUserIds.push(user._id);
|
|
35
95
|
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// --- Process Tasks ---
|
|
99
|
+
for (const task of tasks) {
|
|
100
|
+
if (task._id instanceof ObjectId) {
|
|
101
|
+
const newId = getNewId(task._id);
|
|
102
|
+
if (!newId) continue;
|
|
103
|
+
|
|
104
|
+
const newTask = { ...task, _id: newId };
|
|
105
|
+
|
|
106
|
+
// Fix userId
|
|
107
|
+
if (newTask.userId) newTask.userId = getNewId(newTask.userId) || newTask.userId;
|
|
108
|
+
|
|
109
|
+
// Fix assignedTo
|
|
110
|
+
if (newTask.assignedTo) newTask.assignedTo = getNewId(newTask.assignedTo) || newTask.assignedTo;
|
|
111
|
+
|
|
112
|
+
// Fix parentTaskId
|
|
113
|
+
if (newTask.parentTaskId) newTask.parentTaskId = getNewId(newTask.parentTaskId) || newTask.parentTaskId;
|
|
114
|
+
|
|
115
|
+
// Fix sharedWith array
|
|
116
|
+
if (Array.isArray(newTask.sharedWith)) {
|
|
117
|
+
newTask.sharedWith = newTask.sharedWith.map((id: any) => getNewId(id) || id);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Fix tags keys (userIds are keys)
|
|
121
|
+
if (newTask.tags) {
|
|
122
|
+
const newTags: any = {};
|
|
123
|
+
for (const [key, val] of Object.entries(newTask.tags)) {
|
|
124
|
+
const newKey = getNewId(key) || key;
|
|
125
|
+
newTags[newKey] = val;
|
|
126
|
+
}
|
|
127
|
+
newTask.tags = newTags;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Fix filterSettings keys (userIds are keys)
|
|
131
|
+
if (newTask.filterSettings) {
|
|
132
|
+
const newSettings: any = {};
|
|
133
|
+
for (const [key, val] of Object.entries(newTask.filterSettings)) {
|
|
134
|
+
const newKey = getNewId(key) || key;
|
|
135
|
+
newSettings[newKey] = val;
|
|
136
|
+
}
|
|
137
|
+
newTask.filterSettings = newSettings;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Fix sortSettings keys (userIds are keys)
|
|
141
|
+
if (newTask.sortSettings) {
|
|
142
|
+
const newSettings: any = {};
|
|
143
|
+
for (const [key, val] of Object.entries(newTask.sortSettings)) {
|
|
144
|
+
const newKey = getNewId(key) || key;
|
|
145
|
+
newSettings[newKey] = val;
|
|
146
|
+
}
|
|
147
|
+
newTask.sortSettings = newSettings;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
newTasks.push(newTask);
|
|
151
|
+
oldTaskIds.push(task._id);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// --- Process UserConfigs ---
|
|
156
|
+
for (const config of configs) {
|
|
157
|
+
if (config._id instanceof ObjectId) {
|
|
158
|
+
const newId = getNewId(config._id);
|
|
159
|
+
if (!newId) continue;
|
|
160
|
+
|
|
161
|
+
const newConfig = { ...config, _id: newId };
|
|
162
|
+
|
|
163
|
+
// Fix userId
|
|
164
|
+
if (newConfig.userId) newConfig.userId = getNewId(newConfig.userId) || newConfig.userId;
|
|
165
|
+
|
|
166
|
+
// Fix collaborators
|
|
167
|
+
if (Array.isArray(newConfig.collaborators)) {
|
|
168
|
+
newConfig.collaborators = newConfig.collaborators.map((id: any) => getNewId(id) || id);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
newConfigs.push(newConfig);
|
|
172
|
+
oldConfigIds.push(config._id);
|
|
42
173
|
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 5. Execute
|
|
177
|
+
if (dryRun) {
|
|
178
|
+
DR.logger.info(`[DRY RUN] Would insert ${newUsers.length} users and delete ${oldUserIds.length} old ones.`);
|
|
179
|
+
DR.logger.info(`[DRY RUN] Would insert ${newTasks.length} tasks and delete ${oldTaskIds.length} old ones.`);
|
|
180
|
+
DR.logger.info(`[DRY RUN] Would insert ${newConfigs.length} configs and delete ${oldConfigIds.length} old ones.`);
|
|
43
181
|
return;
|
|
44
182
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
183
|
+
|
|
184
|
+
DR.logger.info('Executing migration...');
|
|
185
|
+
|
|
186
|
+
// Users
|
|
187
|
+
if (newUsers.length > 0) {
|
|
188
|
+
await userRepo.insertMany(newUsers);
|
|
189
|
+
await userRepo.deleteList(oldUserIds);
|
|
190
|
+
DR.logger.success(`Migrated ${newUsers.length} users.`);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Tasks
|
|
194
|
+
if (newTasks.length > 0) {
|
|
195
|
+
await taskRepo.insertMany(newTasks);
|
|
196
|
+
await taskRepo.deleteList(oldTaskIds);
|
|
197
|
+
DR.logger.success(`Migrated ${newTasks.length} tasks.`);
|
|
50
198
|
}
|
|
199
|
+
|
|
200
|
+
// Configs
|
|
201
|
+
if (newConfigs.length > 0) {
|
|
202
|
+
await configRepo.insertMany(newConfigs);
|
|
203
|
+
await configRepo.deleteList(oldConfigIds);
|
|
204
|
+
DR.logger.success(`Migrated ${newConfigs.length} configs.`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
DR.logger.success('Migration complete!');
|
|
51
208
|
}
|
|
52
209
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseDocument } from '@aneuhold/core-ts-db-lib';
|
|
2
|
-
import {
|
|
2
|
+
import type { UUID } from 'crypto';
|
|
3
3
|
export type RepoSubscribers<TDocType extends BaseDocument> = {
|
|
4
4
|
insertNew: InsertNewSubscriber<TDocType>[];
|
|
5
5
|
insertMany: InsertManySubscriber<TDocType>[];
|
|
@@ -20,8 +20,8 @@ export type InsertNewSubscriber<TDocType extends BaseDocument> = (doc: TDocType)
|
|
|
20
20
|
export type InsertManySubscriber<TDocType extends BaseDocument> = (docs: TDocType[]) => Promise<void>;
|
|
21
21
|
export type UpdateOneSubscriber<TDocType extends BaseDocument> = (doc: Partial<TDocType>) => Promise<void>;
|
|
22
22
|
export type UpdateManySubscriber<TDocType extends BaseDocument> = (docs: Partial<TDocType>[]) => Promise<void>;
|
|
23
|
-
export type DeleteOneSubscriber = (docId:
|
|
24
|
-
export type DeleteListSubscriber = (docIds:
|
|
23
|
+
export type DeleteOneSubscriber = (docId: UUID) => Promise<void>;
|
|
24
|
+
export type DeleteListSubscriber = (docIds: UUID[]) => Promise<void>;
|
|
25
25
|
/**
|
|
26
26
|
* A subscription service that allows repositories to subscribe to events
|
|
27
27
|
* that happen in other repositories.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RepoSubscriptionService.d.ts","sourceRoot":"","sources":["../../src/services/RepoSubscriptionService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"RepoSubscriptionService.d.ts","sourceRoot":"","sources":["../../src/services/RepoSubscriptionService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,MAAM,eAAe,CAAC,QAAQ,SAAS,YAAY,IAAI;IAC3D,SAAS,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC3C,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7C,SAAS,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC3C,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7C,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,UAAU,EAAE,oBAAoB,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,QAAQ,SAAS,YAAY,IAAI;IACzD,SAAS,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,QAAQ,SAAS,YAAY,IAAI,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG,MAAM,MAAM,oBAAoB,CAAC,QAAQ,SAAS,YAAY,IAAI,CAChE,IAAI,EAAE,QAAQ,EAAE,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,mBAAmB,CAAC,QAAQ,SAAS,YAAY,IAAI,CAC/D,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,oBAAoB,CAAC,QAAQ,SAAS,YAAY,IAAI,CAChE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjE,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,SAAS,YAAY,KAAK,eAAe,CAAC,QAAQ,CAAC;CAUzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RepoSubscriptionService.js","sourceRoot":"","sources":["../../src/services/RepoSubscriptionService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RepoSubscriptionService.js","sourceRoot":"","sources":["../../src/services/RepoSubscriptionService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAuCxD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C;;;OAGG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO;YACL,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseDocument } from '@aneuhold/core-ts-db-lib';
|
|
2
|
-
import {
|
|
2
|
+
import type { UUID } from 'crypto';
|
|
3
3
|
|
|
4
4
|
export type RepoSubscribers<TDocType extends BaseDocument> = {
|
|
5
5
|
insertNew: InsertNewSubscriber<TDocType>[];
|
|
@@ -33,9 +33,9 @@ export type UpdateManySubscriber<TDocType extends BaseDocument> = (
|
|
|
33
33
|
docs: Partial<TDocType>[]
|
|
34
34
|
) => Promise<void>;
|
|
35
35
|
|
|
36
|
-
export type DeleteOneSubscriber = (docId:
|
|
36
|
+
export type DeleteOneSubscriber = (docId: UUID) => Promise<void>;
|
|
37
37
|
|
|
38
|
-
export type DeleteListSubscriber = (docIds:
|
|
38
|
+
export type DeleteListSubscriber = (docIds: UUID[]) => Promise<void>;
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* A subscription service that allows repositories to subscribe to events
|
package/lib/tests/testsUtil.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { BaseDocument } from '@aneuhold/core-ts-db-lib';
|
|
1
2
|
import crypto from 'crypto';
|
|
2
3
|
import { expect } from 'vitest';
|
|
4
|
+
import BaseRepository from '../repositories/BaseRepository.js';
|
|
3
5
|
import { TEST_USER_NAME_PREFIX } from './globalTestVariables.js';
|
|
4
6
|
/**
|
|
5
7
|
* Asserts that the provided asynchronous function throws an error.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testsUtil.js","sourceRoot":"","sources":["../../src/tests/testsUtil.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testsUtil.js","sourceRoot":"","sources":["../../src/tests/testsUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAyB;IAC3D,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,qBAAqB,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IACxE,OAAO,GAAG,qBAAqB,IAAI,QAAQ,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAA8B,EAC9B,GAAa;IAEb,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAuB,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAA8B,EAC9B,IAAgB;IAEhB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentCleaner.js","sourceRoot":"","sources":["../../src/util/DocumentCleaner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DocumentCleaner.js","sourceRoot":"","sources":["../../src/util/DocumentCleaner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9F;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,MAAM,CAAC,EAAE,CAAgC,SAA4B;QACnE,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,MAAM,CAAkC,SAA4B;QACzE,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,OAAO,CAAwC,SAA4B;QAChF,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
package/lib/util/DocumentDb.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentDb.d.ts","sourceRoot":"","sources":["../../src/util/DocumentDb.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DocumentDb.d.ts","sourceRoot":"","sources":["../../src/util/DocumentDb.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAmB,MAAM,SAAS,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAa;IAEnC,OAAO,CAAC,MAAM,CAAC,WAAW,CAA0B;IAEpD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAiB;IAElC;;;;OAIG;mBACkB,SAAS;IAiB9B;;;;;OAKG;WACU,aAAa,CAAC,QAAQ,SAAS,QAAQ,EAClD,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAQhC;;;;OAIG;WACU,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhD"}
|
package/lib/util/DocumentDb.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentDb.js","sourceRoot":"","sources":["../../src/util/DocumentDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,
|
|
1
|
+
{"version":3,"file":"DocumentDb.js","sourceRoot":"","sources":["../../src/util/DocumentDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IACrB,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IAE3B,MAAM,CAAC,WAAW,CAA0B;IAE5C,MAAM,CAAC,EAAE,CAAiB;IAElC;;;;OAIG;IACK,MAAM,CAAC,KAAK,CAAC,SAAS;QAC5B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;YACjC,sDAAsD;YACtD,MAAM,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,uBAAuB,GAAG,iBAAiB,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,QAAQ,+BAA+B,CAAC;YACxJ,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,uBAAuB,CAAC,CAAC;QAC9D,CAAC;QACD,uEAAuE;QACvE,mEAAmE;QACnE,aAAa;QACb,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,cAAsB;QAEtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,UAAU,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,UAAU,CAAC,EAAE,CAAC,UAAU,CAAW,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,iBAAiB;QAC5B,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACvC,CAAC;IACH,CAAC"}
|
package/lib/util/DocumentDb.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { DocumentValidator } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import { BaseDocument } from '@aneuhold/core-ts-db-lib';
|
|
3
|
+
import type { UUID } from 'crypto';
|
|
3
4
|
export declare enum ObjectSchemaState {
|
|
4
5
|
Valid = 0,
|
|
5
6
|
InvalidAndCorrectable = 1,
|
|
@@ -51,7 +52,7 @@ export default abstract class IValidator<TBaseType extends BaseDocument> {
|
|
|
51
52
|
allDocs: Array<TBaseType>;
|
|
52
53
|
shouldDelete: (doc: TBaseType) => boolean;
|
|
53
54
|
documentValidator: DocumentValidator<TBaseType>;
|
|
54
|
-
deletionFunction: (docIdsToDelete:
|
|
55
|
+
deletionFunction: (docIdsToDelete: UUID[]) => Promise<void>;
|
|
55
56
|
updateFunction: (docsToUpdate: TBaseType[]) => Promise<void>;
|
|
56
57
|
}): Promise<void>;
|
|
57
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseValidator.d.ts","sourceRoot":"","sources":["../../src/validators/BaseValidator.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BaseValidator.d.ts","sourceRoot":"","sources":["../../src/validators/BaseValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,oBAAY,iBAAiB;IAC3B,KAAK,IAAA;IACL,qBAAqB,IAAA;IACrB,uBAAuB,IAAA;CACxB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,UAAU,CAAC,SAAS,SAAS,YAAY;IACrE;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAE5D;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/E;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;;;;;;;;;;;;;OAcG;cACa,kCAAkC,CAAC,KAAK,EAAE;QACxD,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1B,YAAY,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC;QAC1C,iBAAiB,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAChD,gBAAgB,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,cAAc,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9D;IAgED;;;;;OAKG;IACH,SAAS,CAAC,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO;CAG9F"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BaseDocument } from '@aneuhold/core-ts-db-lib';
|
|
1
2
|
import { DR } from '@aneuhold/core-ts-lib';
|
|
2
3
|
export var ObjectSchemaState;
|
|
3
4
|
(function (ObjectSchemaState) {
|
|
@@ -40,7 +41,7 @@ export default class IValidator {
|
|
|
40
41
|
docsToValidate.forEach((doc) => {
|
|
41
42
|
const { updatedDoc, errors } = documentValidator(doc);
|
|
42
43
|
if (errors.length !== 0) {
|
|
43
|
-
DR.logger.error(`${docName} with ID: ${doc._id
|
|
44
|
+
DR.logger.error(`${docName} with ID: ${doc._id} is invalid. Errors:`);
|
|
44
45
|
numInvalidDocs += 1;
|
|
45
46
|
errors.forEach((error) => {
|
|
46
47
|
DR.logger.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseValidator.js","sourceRoot":"","sources":["../../src/validators/BaseValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAG3C,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,2DAAK,CAAA;IACL,2FAAqB,CAAA;IACrB,+FAAuB,CAAA;AACzB,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AAED,MAAM,CAAC,OAAO,OAAgB,UAAU;IA4BtC;;;;;;;;;;;;;;OAcG;IACO,KAAK,CAAC,kCAAkC,CAAC,KAQlD;QACC,MAAM,EACJ,MAAM,EACN,OAAO,EACP,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACf,GAAG,KAAK,CAAC;QACV,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"BaseValidator.js","sourceRoot":"","sources":["../../src/validators/BaseValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { DocumentValidator } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import { BaseDocument } from '@aneuhold/core-ts-db-lib';
|
|
2
3
|
import { DR } from '@aneuhold/core-ts-lib';
|
|
3
|
-
import {
|
|
4
|
+
import type { UUID } from 'crypto';
|
|
4
5
|
|
|
5
6
|
export enum ObjectSchemaState {
|
|
6
7
|
Valid,
|
|
@@ -57,7 +58,7 @@ export default abstract class IValidator<TBaseType extends BaseDocument> {
|
|
|
57
58
|
allDocs: Array<TBaseType>;
|
|
58
59
|
shouldDelete: (doc: TBaseType) => boolean;
|
|
59
60
|
documentValidator: DocumentValidator<TBaseType>;
|
|
60
|
-
deletionFunction: (docIdsToDelete:
|
|
61
|
+
deletionFunction: (docIdsToDelete: UUID[]) => Promise<void>;
|
|
61
62
|
updateFunction: (docsToUpdate: TBaseType[]) => Promise<void>;
|
|
62
63
|
}) {
|
|
63
64
|
const {
|
|
@@ -69,7 +70,7 @@ export default abstract class IValidator<TBaseType extends BaseDocument> {
|
|
|
69
70
|
deletionFunction,
|
|
70
71
|
updateFunction
|
|
71
72
|
} = input;
|
|
72
|
-
const docIdsToDelete: Array<
|
|
73
|
+
const docIdsToDelete: Array<UUID> = [];
|
|
73
74
|
const docsToValidate: Array<TBaseType> = [];
|
|
74
75
|
const docsToUpdate: Array<TBaseType> = [];
|
|
75
76
|
let numInvalidDocs = 0;
|
|
@@ -86,7 +87,7 @@ export default abstract class IValidator<TBaseType extends BaseDocument> {
|
|
|
86
87
|
docsToValidate.forEach((doc) => {
|
|
87
88
|
const { updatedDoc, errors } = documentValidator(doc);
|
|
88
89
|
if (errors.length !== 0) {
|
|
89
|
-
DR.logger.error(`${docName} with ID: ${doc._id
|
|
90
|
+
DR.logger.error(`${docName} with ID: ${doc._id} is invalid. Errors:`);
|
|
90
91
|
numInvalidDocs += 1;
|
|
91
92
|
errors.forEach((error) => {
|
|
92
93
|
DR.logger.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeyValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/common/ApiKeyValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,0BAA0B,CAAC;AAKlE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU,CAAC,MAAM,CAAC;IACvD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiKeyValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/common/ApiKeyValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,0BAA0B,CAAC;AAKlE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU,CAAC,MAAM,CAAC;IACvD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBnD,oBAAoB,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASnE,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAyB7D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { validateApiKey } from '@aneuhold/core-ts-db-lib';
|
|
1
|
+
import { ApiKey, validateApiKey } from '@aneuhold/core-ts-db-lib';
|
|
2
2
|
import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
|
|
3
3
|
import ApiKeyRepository from '../../repositories/common/ApiKeyRepository.js';
|
|
4
4
|
import UserRepository from '../../repositories/common/UserRepository.js';
|
|
@@ -9,16 +9,16 @@ export default class ApiKeyValidator extends IValidator {
|
|
|
9
9
|
const userRepo = UserRepository.getRepo();
|
|
10
10
|
const userInDb = await userRepo.get({ _id: newApiKey.userId });
|
|
11
11
|
if (!userInDb) {
|
|
12
|
-
DR.logger.error(`User with ID: ${newApiKey.userId
|
|
13
|
-
ErrorUtils.throwError(`User with ID: ${newApiKey.userId
|
|
12
|
+
DR.logger.error(`User with ID: ${newApiKey.userId} does not exist in the database.`);
|
|
13
|
+
ErrorUtils.throwError(`User with ID: ${newApiKey.userId} does not exist in the database.`, newApiKey);
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
16
|
// Check if the user already has an API key
|
|
17
17
|
const apiKeyRepo = ApiKeyRepository.getRepo();
|
|
18
18
|
const apiKeyInDb = await apiKeyRepo.get({ userId: newApiKey.userId });
|
|
19
19
|
if (apiKeyInDb) {
|
|
20
|
-
DR.logger.error(`User with ID: ${newApiKey.userId
|
|
21
|
-
ErrorUtils.throwError(`User with ID: ${newApiKey.userId
|
|
20
|
+
DR.logger.error(`User with ID: ${newApiKey.userId} already has an API key.`);
|
|
21
|
+
ErrorUtils.throwError(`User with ID: ${newApiKey.userId} already has an API key.`, newApiKey);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
@@ -36,8 +36,8 @@ export default class ApiKeyValidator extends IValidator {
|
|
|
36
36
|
docName: 'API Key',
|
|
37
37
|
allDocs: allApiKeys,
|
|
38
38
|
shouldDelete: (apiKey) => {
|
|
39
|
-
if (!allUserIds[apiKey.userId
|
|
40
|
-
DR.logger.error(`API Key with ID: ${apiKey._id
|
|
39
|
+
if (!allUserIds[apiKey.userId]) {
|
|
40
|
+
DR.logger.error(`API Key with ID: ${apiKey._id} has no valid associated user.`);
|
|
41
41
|
return true;
|
|
42
42
|
}
|
|
43
43
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeyValidator.js","sourceRoot":"","sources":["../../../src/validators/common/ApiKeyValidator.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ApiKeyValidator.js","sourceRoot":"","sources":["../../../src/validators/common/ApiKeyValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,gBAAgB,MAAM,+CAA+C,CAAC;AAC7E,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAkB;IAC7D,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,SAAS,CAAC,MAAM,kCAAkC,CAAC,CAAC;YACrF,UAAU,CAAC,UAAU,CACnB,iBAAiB,SAAS,CAAC,MAAM,kCAAkC,EACnE,SAAS,CACV,CAAC;YACF,OAAO;QACT,CAAC;QACD,2CAA2C;QAC3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,IAAI,UAAU,EAAE,CAAC;YACf,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,SAAS,CAAC,MAAM,0BAA0B,CAAC,CAAC;YAC7E,UAAU,CAAC,UAAU,CAAC,iBAAiB,SAAS,CAAC,MAAM,0BAA0B,EAAE,SAAS,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,oBAAoB,CAAC,aAA8B;QACvD,2EAA2E;QAC3E,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC1F,UAAU,CAAC,UAAU,CACnB,wEAAwE,EACxE,aAAa,CACd,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QAEpE,MAAM,IAAI,CAAC,kCAAkC,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,UAAU;YACnB,YAAY,EAAE,CAAC,MAAc,EAAE,EAAE;gBAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,GAAG,gCAAgC,CAAC,CAAC;oBAChF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,iBAAiB,EAAE,cAAc;YACjC,gBAAgB,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;gBACjD,MAAM,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,YAAsB,EAAE,EAAE;gBAC/C,MAAM,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAC5C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ApiKey, validateApiKey } from '@aneuhold/core-ts-db-lib';
|
|
2
2
|
import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
|
|
3
|
-
import {
|
|
3
|
+
import type { UUID } from 'crypto';
|
|
4
4
|
import ApiKeyRepository from '../../repositories/common/ApiKeyRepository.js';
|
|
5
5
|
import UserRepository from '../../repositories/common/UserRepository.js';
|
|
6
6
|
import IValidator from '../BaseValidator.js';
|
|
@@ -11,11 +11,9 @@ export default class ApiKeyValidator extends IValidator<ApiKey> {
|
|
|
11
11
|
const userRepo = UserRepository.getRepo();
|
|
12
12
|
const userInDb = await userRepo.get({ _id: newApiKey.userId });
|
|
13
13
|
if (!userInDb) {
|
|
14
|
-
DR.logger.error(
|
|
15
|
-
`User with ID: ${newApiKey.userId.toString()} does not exist in the database.`
|
|
16
|
-
);
|
|
14
|
+
DR.logger.error(`User with ID: ${newApiKey.userId} does not exist in the database.`);
|
|
17
15
|
ErrorUtils.throwError(
|
|
18
|
-
`User with ID: ${newApiKey.userId
|
|
16
|
+
`User with ID: ${newApiKey.userId} does not exist in the database.`,
|
|
19
17
|
newApiKey
|
|
20
18
|
);
|
|
21
19
|
return;
|
|
@@ -24,11 +22,8 @@ export default class ApiKeyValidator extends IValidator<ApiKey> {
|
|
|
24
22
|
const apiKeyRepo = ApiKeyRepository.getRepo();
|
|
25
23
|
const apiKeyInDb = await apiKeyRepo.get({ userId: newApiKey.userId });
|
|
26
24
|
if (apiKeyInDb) {
|
|
27
|
-
DR.logger.error(`User with ID: ${newApiKey.userId
|
|
28
|
-
ErrorUtils.throwError(
|
|
29
|
-
`User with ID: ${newApiKey.userId.toString()} already has an API key.`,
|
|
30
|
-
newApiKey
|
|
31
|
-
);
|
|
25
|
+
DR.logger.error(`User with ID: ${newApiKey.userId} already has an API key.`);
|
|
26
|
+
ErrorUtils.throwError(`User with ID: ${newApiKey.userId} already has an API key.`, newApiKey);
|
|
32
27
|
}
|
|
33
28
|
}
|
|
34
29
|
|
|
@@ -52,16 +47,14 @@ export default class ApiKeyValidator extends IValidator<ApiKey> {
|
|
|
52
47
|
docName: 'API Key',
|
|
53
48
|
allDocs: allApiKeys,
|
|
54
49
|
shouldDelete: (apiKey: ApiKey) => {
|
|
55
|
-
if (!allUserIds[apiKey.userId
|
|
56
|
-
DR.logger.error(
|
|
57
|
-
`API Key with ID: ${apiKey._id.toString()} has no valid associated user.`
|
|
58
|
-
);
|
|
50
|
+
if (!allUserIds[apiKey.userId]) {
|
|
51
|
+
DR.logger.error(`API Key with ID: ${apiKey._id} has no valid associated user.`);
|
|
59
52
|
return true;
|
|
60
53
|
}
|
|
61
54
|
return false;
|
|
62
55
|
},
|
|
63
56
|
documentValidator: validateApiKey,
|
|
64
|
-
deletionFunction: async (docIdsToDelete:
|
|
57
|
+
deletionFunction: async (docIdsToDelete: UUID[]) => {
|
|
65
58
|
await apiKeyRepo.deleteList(docIdsToDelete);
|
|
66
59
|
},
|
|
67
60
|
updateFunction: async (docsToUpdate: ApiKey[]) => {
|
|
@@ -18,7 +18,7 @@ export default class UserValidator extends IValidator<User> {
|
|
|
18
18
|
*
|
|
19
19
|
* @param userRepo - The user repository
|
|
20
20
|
* @param userName - The username to check
|
|
21
|
-
* @throws An error if the username already exists
|
|
21
|
+
* @throws {Error} An error if the username already exists
|
|
22
22
|
*/
|
|
23
23
|
private checkIfUserNameExists;
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/common/UserValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,0BAA0B,CAAC;AAK9D,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU,CAAC,IAAI,CAAC;IACnD,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;OAKG;IACG,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhE,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"UserValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/common/UserValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,0BAA0B,CAAC;AAK9D,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU,CAAC,IAAI,CAAC;IACnD,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;OAKG;IACG,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhE,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5D;;;;;;OAMG;YACW,qBAAqB;CASpC"}
|
|
@@ -27,7 +27,7 @@ export default class UserValidator extends IValidator {
|
|
|
27
27
|
const userRepo = UserRepository.getRepo();
|
|
28
28
|
const userInDb = await userRepo.get({ _id: userToUpdate._id });
|
|
29
29
|
if (!userInDb) {
|
|
30
|
-
ErrorUtils.throwError(`${User.name} with ID: ${userToUpdate._id
|
|
30
|
+
ErrorUtils.throwError(`${User.name} with ID: ${userToUpdate._id} does not exist in the database.`, userToUpdate);
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
33
|
// Check if the username is being updated and, if it is, if it already
|
|
@@ -45,7 +45,7 @@ export default class UserValidator extends IValidator {
|
|
|
45
45
|
allDocs: allUsers,
|
|
46
46
|
shouldDelete: (user) => {
|
|
47
47
|
if (user.userName.startsWith(TEST_USER_NAME_PREFIX)) {
|
|
48
|
-
DR.logger.error(`User with ID: ${user._id
|
|
48
|
+
DR.logger.error(`User with ID: ${user._id} is a test user and should be deleted`);
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
51
51
|
return false;
|
|
@@ -64,7 +64,7 @@ export default class UserValidator extends IValidator {
|
|
|
64
64
|
*
|
|
65
65
|
* @param userRepo - The user repository
|
|
66
66
|
* @param userName - The username to check
|
|
67
|
-
* @throws An error if the username already exists
|
|
67
|
+
* @throws {Error} An error if the username already exists
|
|
68
68
|
*/
|
|
69
69
|
async checkIfUserNameExists(userRepo, userName) {
|
|
70
70
|
const userNameSearchResult = await userRepo.get({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserValidator.js","sourceRoot":"","sources":["../../../src/validators/common/UserValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAgB;IACzD,KAAK,CAAC,iBAAiB,CAAC,OAAa;QACnC,uCAAuC;QACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CAAC,YAA2B;QACpD,4BAA4B;QAC5B,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YACtB,UAAU,CAAC,UAAU,CAAC,sBAAsB,IAAI,CAAC,IAAI,aAAa,EAAE,YAAY,CAAC,CAAC;QACpF,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,UAAU,CACnB,GAAG,IAAI,CAAC,IAAI,aAAa,YAAY,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"UserValidator.js","sourceRoot":"","sources":["../../../src/validators/common/UserValidator.ts"],"names":[],"mappings":"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"}
|