@aneuhold/be-ts-db-lib 3.0.0 → 3.0.2

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 (26) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/lib/repositories/BaseRepository.d.ts +1 -1
  3. package/lib/repositories/BaseRepository.d.ts.map +1 -1
  4. package/lib/repositories/BaseRepository.js.map +1 -1
  5. package/lib/repositories/BaseRepository.ts +2 -2
  6. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.d.ts.map +1 -1
  7. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js +7 -3
  8. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js.map +1 -1
  9. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.ts +9 -3
  10. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.d.ts.map +1 -1
  11. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js +7 -3
  12. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js.map +1 -1
  13. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.ts +10 -4
  14. package/lib/repositories/dashboard/DashboardTaskRepository.d.ts.map +1 -1
  15. package/lib/repositories/dashboard/DashboardTaskRepository.js +6 -5
  16. package/lib/repositories/dashboard/DashboardTaskRepository.js.map +1 -1
  17. package/lib/repositories/dashboard/DashboardTaskRepository.ts +7 -6
  18. package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts.map +1 -1
  19. package/lib/repositories/dashboard/DashboardUserConfigRepository.js +9 -10
  20. package/lib/repositories/dashboard/DashboardUserConfigRepository.js.map +1 -1
  21. package/lib/repositories/dashboard/DashboardUserConfigRepository.ts +16 -14
  22. package/lib/services/MigrationService.d.ts.map +1 -1
  23. package/lib/services/MigrationService.js +308 -129
  24. package/lib/services/MigrationService.js.map +1 -1
  25. package/lib/services/MigrationService.ts +379 -135
  26. package/package.json +6 -5
@@ -1,9 +1,12 @@
1
1
  /* eslint-disable */
2
2
  // @ts-nocheck
3
+ import { ApiKey, DashboardTask, DashboardUserConfig, DocumentService, NonogramKatanaItem, NonogramKatanaUpgrade, User } from '@aneuhold/core-ts-db-lib';
3
4
  import { DR } from '@aneuhold/core-ts-lib';
4
- import { ObjectId } from 'bson';
5
5
  import { v7 as uuidv7 } from 'uuid';
6
+ import ApiKeyRepository from '../repositories/common/ApiKeyRepository.js';
6
7
  import UserRepository from '../repositories/common/UserRepository.js';
8
+ import DashboardNonogramKatanaItemRepository from '../repositories/dashboard/DashboardNonogramKatanaItemRepository.js';
9
+ import DashboardNonogramKatanaUpgradeRepository from '../repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js';
7
10
  import DashboardTaskRepository from '../repositories/dashboard/DashboardTaskRepository.js';
8
11
  import DashboardUserConfigRepository from '../repositories/dashboard/DashboardUserConfigRepository.js';
9
12
  /**
@@ -24,161 +27,337 @@ export default class MigrationService {
24
27
  * @param dryRun Whether or not to actually make the changes or just log them.
25
28
  */
26
29
  static async migrateDb(dryRun = false) {
27
- return;
28
- DR.logger.info('Starting migration from ObjectId to UUID v7...');
30
+ DR.logger.info('Starting migration...');
29
31
  // 1. Load all documents
30
32
  const userRepo = UserRepository.getRepo();
33
+ const apiKeyRepo = ApiKeyRepository.getRepo();
31
34
  const taskRepo = DashboardTaskRepository.getRepo();
32
35
  const configRepo = DashboardUserConfigRepository.getRepo();
36
+ const nonogramItemRepo = DashboardNonogramKatanaItemRepository.getRepo();
37
+ const nonogramUpgradesRepo = DashboardNonogramKatanaUpgradeRepository.getRepo();
33
38
  const users = await userRepo.getAll();
39
+ const apiKeys = await apiKeyRepo.getAll();
34
40
  const tasks = await taskRepo.getAll();
35
41
  const configs = await configRepo.getAll();
36
- DR.logger.info(`Loaded ${users.length} users, ${tasks.length} tasks, ${configs.length} configs.`);
37
- // 2. Create ID Map (Old ObjectId string -> New UUID)
38
- const idMap = new Map();
39
- let newIdCount = 0;
40
- const addToMap = (docs) => {
42
+ const nonogramItems = await nonogramItemRepo.getAll();
43
+ const nonogramUpgrades = await nonogramUpgradesRepo.getAll();
44
+ DR.logger.info(`Loaded ${users.length} users, ${apiKeys.length} API keys, ${tasks.length} tasks, ${configs.length} configs, ${nonogramItems.length} nonogram items, and ${nonogramUpgrades.length} nonogram upgrades.`);
45
+ const countObjectIds = (docs) => {
41
46
  docs.forEach((doc) => {
42
- if (doc._id instanceof ObjectId) {
43
- idMap.set(doc._id.toHexString(), uuidv7());
44
- newIdCount++;
45
- }
46
- else if (typeof doc._id === 'string' && !idMap.has(doc._id)) {
47
- // Already a string? Maybe already migrated or just a string ID.
48
- // If it looks like an ObjectId, map it.
49
- if (ObjectId.isValid(doc._id) && doc._id.length === 24) {
50
- idMap.set(doc._id, uuidv7());
51
- newIdCount++;
52
- }
53
- }
47
+ // Get the type of the _id field
48
+ console.log(`Document ID type: ${typeof doc._id}, value: ${doc._id}`);
54
49
  });
55
50
  };
56
- addToMap(users);
57
- addToMap(tasks);
58
- addToMap(configs);
59
- DR.logger.info(`Generated ${newIdCount} new UUIDs.`);
60
- // 3. Helper to get new ID
61
- const getNewId = (oldId) => {
62
- if (!oldId)
63
- return undefined;
51
+ // Create a map of document IDs to new UUIDs
52
+ const allDocs = [
53
+ ...users,
54
+ ...apiKeys,
55
+ ...tasks,
56
+ ...configs,
57
+ ...nonogramItems,
58
+ ...nonogramUpgrades
59
+ ];
60
+ const legacyDocs = allDocs.filter((doc) => typeof doc._id === 'object');
61
+ const newDocs = allDocs.filter((doc) => typeof doc._id === 'string');
62
+ DR.logger.info(`Found ${legacyDocs.length} documents with legacy ObjectId IDs and ${newDocs.length} documents with string IDs.`);
63
+ // Delete all existing new docs (with string IDs) to ensure fresh creation
64
+ if (!dryRun && newDocs.length > 0) {
65
+ DR.logger.info(`Deleting ${newDocs.length} existing migrated documents...`);
66
+ const newDocIds = newDocs.map((doc) => doc._id);
67
+ const userIdsToDelete = users.filter((u) => typeof u._id === 'string').map((u) => u._id);
68
+ const apiKeyIdsToDelete = apiKeys.filter((k) => typeof k._id === 'string').map((k) => k._id);
69
+ const taskIdsToDelete = tasks.filter((t) => typeof t._id === 'string').map((t) => t._id);
70
+ const configIdsToDelete = configs.filter((c) => typeof c._id === 'string').map((c) => c._id);
71
+ const nonogramItemIdsToDelete = nonogramItems.filter((i) => typeof i._id === 'string').map((i) => i._id);
72
+ const nonogramUpgradeIdsToDelete = nonogramUpgrades.filter((u) => typeof u._id === 'string').map((u) => u._id);
73
+ if (userIdsToDelete.length > 0) {
74
+ const result = await (await userRepo.getCollection()).deleteMany({ _id: { $in: userIdsToDelete } });
75
+ DR.logger.info(`Deleted ${result.deletedCount} users.`);
76
+ }
77
+ if (apiKeyIdsToDelete.length > 0) {
78
+ const result = await (await apiKeyRepo.getCollection()).deleteMany({ _id: { $in: apiKeyIdsToDelete } });
79
+ DR.logger.info(`Deleted ${result.deletedCount} API keys.`);
80
+ }
81
+ if (taskIdsToDelete.length > 0) {
82
+ const result = await (await taskRepo.getCollection()).deleteMany({ _id: { $in: taskIdsToDelete } });
83
+ DR.logger.info(`Deleted ${result.deletedCount} tasks.`);
84
+ }
85
+ if (configIdsToDelete.length > 0) {
86
+ const result = await (await configRepo.getCollection()).deleteMany({ _id: { $in: configIdsToDelete } });
87
+ DR.logger.info(`Deleted ${result.deletedCount} configs.`);
88
+ }
89
+ if (nonogramItemIdsToDelete.length > 0) {
90
+ const result = await (await nonogramItemRepo.getCollection()).deleteMany({ _id: { $in: nonogramItemIdsToDelete } });
91
+ DR.logger.info(`Deleted ${result.deletedCount} nonogram items.`);
92
+ }
93
+ if (nonogramUpgradeIdsToDelete.length > 0) {
94
+ const result = await (await nonogramUpgradesRepo.getCollection()).deleteMany({ _id: { $in: nonogramUpgradeIdsToDelete } });
95
+ DR.logger.info(`Deleted ${result.deletedCount} nonogram upgrades.`);
96
+ }
97
+ DR.logger.info('Deletion complete. Starting fresh migration...');
98
+ }
99
+ else if (dryRun && newDocs.length > 0) {
100
+ DR.logger.info(`Dry run: Would delete ${newDocs.length} existing migrated documents.`);
101
+ }
102
+ // Now create the actual map
103
+ const mapFromObjectIdToUUID = new Map();
104
+ const newUsersToCreate = [];
105
+ const newApiKeysToCreate = [];
106
+ const newTasksToCreate = [];
107
+ const newConfigsToCreate = [];
108
+ const newNonogramItemsToCreate = [];
109
+ const newNonogramUpgradesToCreate = [];
110
+ /**
111
+ * Gets a UUID for a given legacy ObjectId. If one already exists in the map,
112
+ * it is returned. Otherwise, a new one is generated and added to the map.
113
+ */
114
+ const getUUID = (oldId) => {
64
115
  const oldIdStr = oldId.toString();
65
- return idMap.get(oldIdStr) || (typeof oldId === 'string' ? oldId : undefined);
116
+ if (mapFromObjectIdToUUID.has(oldIdStr)) {
117
+ return mapFromObjectIdToUUID.get(oldIdStr);
118
+ }
119
+ const newId = uuidv7();
120
+ mapFromObjectIdToUUID.set(oldIdStr, newId);
121
+ return newId;
66
122
  };
67
- // 4. Prepare New Documents
68
- const newUsers = [];
69
- const oldUserIds = [];
70
- const newTasks = [];
71
- const oldTaskIds = [];
72
- const newConfigs = [];
73
- const oldConfigIds = [];
74
- // --- Process Users ---
75
- for (const user of users) {
76
- if (user._id instanceof ObjectId) {
77
- const newId = getNewId(user._id);
78
- if (!newId)
79
- continue;
80
- const newUser = { ...user, _id: newId };
81
- // Users don't have many internal refs usually, but check if needed
82
- newUsers.push(newUser);
83
- oldUserIds.push(user._id);
123
+ // Create a map of UUID to documents
124
+ const mapFromUUIDToDocument = new Map();
125
+ const verifyDoc = (oldDoc, newDoc) => {
126
+ const oldJson = JSON.stringify(oldDoc, null, 2);
127
+ const newJson = JSON.stringify(newDoc, null, 2);
128
+ const oldLines = oldJson.split('\n').length;
129
+ const newLines = newJson.split('\n').length;
130
+ if (newLines !== oldLines + 1) {
131
+ DR.logger.warn(`Line count mismatch for ${oldDoc.docType || 'doc'} ${oldDoc._id}: Old=${oldLines}, New=${newLines}.`);
84
132
  }
133
+ };
134
+ function createNewDoc(oldDoc) {
135
+ if (mapFromObjectIdToUUID.has(oldDoc._id.toString()) && mapFromUUIDToDocument.has(mapFromObjectIdToUUID.get(oldDoc._id.toString()))) {
136
+ console.warn(`Skipping document ${oldDoc._id} as it was already migrated.` +
137
+ ` The created document is ${JSON.stringify(mapFromUUIDToDocument.get(mapFromObjectIdToUUID.get(oldDoc._id.toString())))}`);
138
+ return;
139
+ }
140
+ const newDocId = getUUID(oldDoc._id);
141
+ const newDoc = DocumentService.deepCopy(oldDoc);
142
+ newDoc._id = newDocId;
143
+ newDoc.oldOId = oldDoc._id.toString();
144
+ mapFromUUIDToDocument.set(newDocId, newDoc);
145
+ return newDoc;
85
146
  }
86
- // --- Process Tasks ---
87
- for (const task of tasks) {
88
- if (task._id instanceof ObjectId) {
89
- const newId = getNewId(task._id);
90
- if (!newId)
91
- continue;
92
- const newTask = { ...task, _id: newId };
93
- // Fix userId
94
- if (newTask.userId)
95
- newTask.userId = getNewId(newTask.userId) || newTask.userId;
96
- // Fix assignedTo
97
- if (newTask.assignedTo)
98
- newTask.assignedTo = getNewId(newTask.assignedTo) || newTask.assignedTo;
99
- // Fix parentTaskId
100
- if (newTask.parentTaskId)
101
- newTask.parentTaskId = getNewId(newTask.parentTaskId) || newTask.parentTaskId;
102
- // Fix sharedWith array
103
- if (Array.isArray(newTask.sharedWith)) {
104
- newTask.sharedWith = newTask.sharedWith.map((id) => getNewId(id) || id);
147
+ // Filter to only legacy users with the chosen usernames
148
+ const userNames = ['demoUser1', 'demoUser2', "testUser", "testUser2"];
149
+ // const userNames = ["testUser"];
150
+ const legacyUsers = users.filter((u) => userNames.includes(u.userName) && typeof u._id === 'object');
151
+ DR.logger.info(`Found ${legacyUsers.length} legacy users to migrate.`);
152
+ // First, create all user documents and generate their UUIDs that way relationships between
153
+ // users in the collaborators field can be mapped correctly.
154
+ legacyUsers.forEach((oldUserDoc) => {
155
+ const newUser = createNewDoc(oldUserDoc);
156
+ if (!newUser)
157
+ return;
158
+ verifyDoc(oldUserDoc, newUser);
159
+ newUsersToCreate.push(newUser);
160
+ });
161
+ // Create the function that will flesh out new documents for a given user document
162
+ function createNewDocsForUser(oldUserDoc) {
163
+ const oldUserIdStr = oldUserDoc._id.toString();
164
+ const newUserId = getUUID(oldUserDoc._id);
165
+ // 1. Create new API keys
166
+ const userApiKeys = apiKeys.filter((k) => k.userId.toString() === oldUserIdStr);
167
+ userApiKeys.forEach((oldKey) => {
168
+ const newKey = createNewDoc(oldKey);
169
+ if (!newKey)
170
+ return;
171
+ newKey.userId = newUserId;
172
+ verifyDoc(oldKey, newKey);
173
+ newApiKeysToCreate.push(newKey);
174
+ });
175
+ // 2. Create new Tasks
176
+ const userTasks = tasks.filter((t) => t.userId.toString() === oldUserIdStr);
177
+ const taskChildrenMap = new Map();
178
+ const rootTasks = [];
179
+ const userTaskIds = new Set(userTasks.map((t) => t._id.toString()));
180
+ userTasks.forEach((task) => {
181
+ const pId = task.parentTaskId?.toString();
182
+ if (pId && userTaskIds.has(pId)) {
183
+ if (!taskChildrenMap.has(pId)) {
184
+ taskChildrenMap.set(pId, []);
185
+ }
186
+ taskChildrenMap.get(pId).push(task);
187
+ }
188
+ else {
189
+ rootTasks.push(task);
105
190
  }
106
- // Fix tags keys (userIds are keys)
107
- if (newTask.tags) {
191
+ });
192
+ const queue = [...rootTasks];
193
+ while (queue.length > 0) {
194
+ const oldTask = queue.shift();
195
+ const newTask = createNewDoc(oldTask);
196
+ if (newTask) {
197
+ newTask.userId = newUserId;
198
+ // Map user IDs in tags keys
108
199
  const newTags = {};
109
- for (const [key, val] of Object.entries(newTask.tags)) {
110
- const newKey = getNewId(key) || key;
111
- newTags[newKey] = val;
112
- }
200
+ Object.keys(oldTask.tags).forEach((tagUserId) => {
201
+ const newTagUserId = getUUID(tagUserId);
202
+ newTags[newTagUserId] = oldTask.tags[tagUserId];
203
+ });
113
204
  newTask.tags = newTags;
114
- }
115
- // Fix filterSettings keys (userIds are keys)
116
- if (newTask.filterSettings) {
117
- const newSettings = {};
118
- for (const [key, val] of Object.entries(newTask.filterSettings)) {
119
- const newKey = getNewId(key) || key;
120
- newSettings[newKey] = val;
205
+ // Map user IDs in filterSettings keys
206
+ const newFilterSettings = {};
207
+ Object.keys(oldTask.filterSettings).forEach((fsUserId) => {
208
+ const newFsUserId = getUUID(fsUserId);
209
+ newFilterSettings[newFsUserId] = {
210
+ ...oldTask.filterSettings[fsUserId],
211
+ userId: newFsUserId
212
+ };
213
+ });
214
+ newTask.filterSettings = newFilterSettings;
215
+ // Map user IDs in sortSettings keys
216
+ const newSortSettings = {};
217
+ Object.keys(oldTask.sortSettings).forEach((ssUserId) => {
218
+ const newSsUserId = getUUID(ssUserId);
219
+ newSortSettings[newSsUserId] = {
220
+ ...oldTask.sortSettings[ssUserId],
221
+ userId: newSsUserId
222
+ };
223
+ });
224
+ newTask.sortSettings = newSortSettings;
225
+ newTask.sharedWith = oldTask.sharedWith.map((id) => getUUID(id));
226
+ if (oldTask.assignedTo) {
227
+ newTask.assignedTo = getUUID(oldTask.assignedTo);
121
228
  }
122
- newTask.filterSettings = newSettings;
123
- }
124
- // Fix sortSettings keys (userIds are keys)
125
- if (newTask.sortSettings) {
126
- const newSettings = {};
127
- for (const [key, val] of Object.entries(newTask.sortSettings)) {
128
- const newKey = getNewId(key) || key;
129
- newSettings[newKey] = val;
229
+ if (oldTask.parentTaskId) {
230
+ newTask.parentTaskId = getUUID(oldTask.parentTaskId);
231
+ }
232
+ if (oldTask.parentRecurringTaskInfo) {
233
+ newTask.parentRecurringTaskInfo = {
234
+ ...oldTask.parentRecurringTaskInfo,
235
+ taskId: getUUID(oldTask.parentRecurringTaskInfo.taskId)
236
+ };
130
237
  }
131
- newTask.sortSettings = newSettings;
238
+ verifyDoc(oldTask, newTask);
239
+ newTasksToCreate.push(newTask);
132
240
  }
133
- newTasks.push(newTask);
134
- oldTaskIds.push(task._id);
135
- }
136
- }
137
- // --- Process UserConfigs ---
138
- for (const config of configs) {
139
- if (config._id instanceof ObjectId) {
140
- const newId = getNewId(config._id);
141
- if (!newId)
142
- continue;
143
- const newConfig = { ...config, _id: newId };
144
- // Fix userId
145
- if (newConfig.userId)
146
- newConfig.userId = getNewId(newConfig.userId) || newConfig.userId;
147
- // Fix collaborators
148
- if (Array.isArray(newConfig.collaborators)) {
149
- newConfig.collaborators = newConfig.collaborators.map((id) => getNewId(id) || id);
241
+ const children = taskChildrenMap.get(oldTask._id.toString());
242
+ if (children) {
243
+ queue.push(...children);
150
244
  }
151
- newConfigs.push(newConfig);
152
- oldConfigIds.push(config._id);
153
245
  }
246
+ // 3. Create new Configs
247
+ const userConfigs = configs.filter((c) => c.userId.toString() === oldUserIdStr);
248
+ userConfigs.forEach((oldConfig) => {
249
+ const newConfig = createNewDoc(oldConfig);
250
+ if (!newConfig)
251
+ return;
252
+ newConfig.userId = newUserId;
253
+ newConfig.collaborators = (oldConfig.collaborators || []).map((id) => getUUID(id));
254
+ if (newConfig.taskListSortSettings) {
255
+ Object.entries(newConfig.taskListSortSettings).forEach(([category, settings]) => {
256
+ const newSettings = {
257
+ userId: getUUID(settings.userId),
258
+ sortList: settings.sortList
259
+ };
260
+ newConfig.taskListSortSettings[category] = newSettings;
261
+ });
262
+ }
263
+ if (newConfig.taskListFilterSettings) {
264
+ Object.entries(newConfig.taskListFilterSettings).forEach(([category, settings]) => {
265
+ const newSettings = {
266
+ ...settings,
267
+ userId: getUUID(settings.userId)
268
+ };
269
+ newConfig.taskListFilterSettings[category] = newSettings;
270
+ });
271
+ }
272
+ verifyDoc(oldConfig, newConfig);
273
+ newConfigsToCreate.push(newConfig);
274
+ });
275
+ // 4. Nonogram Items
276
+ const userNonogramItems = nonogramItems.filter((i) => i.userId.toString() === oldUserIdStr);
277
+ userNonogramItems.forEach((oldItem) => {
278
+ const newItem = createNewDoc(oldItem);
279
+ if (!newItem)
280
+ return;
281
+ newItem.userId = newUserId;
282
+ verifyDoc(oldItem, newItem);
283
+ newNonogramItemsToCreate.push(newItem);
284
+ });
285
+ // 5. Nonogram Upgrades
286
+ const userNonogramUpgrades = nonogramUpgrades.filter((u) => u.userId.toString() === oldUserIdStr);
287
+ userNonogramUpgrades.forEach((oldUpgrade) => {
288
+ const newUpgrade = createNewDoc(oldUpgrade);
289
+ if (!newUpgrade)
290
+ return;
291
+ newUpgrade.userId = newUserId;
292
+ verifyDoc(oldUpgrade, newUpgrade);
293
+ newNonogramUpgradesToCreate.push(newUpgrade);
294
+ });
295
+ }
296
+ // Now create related documents for each user
297
+ legacyUsers.forEach((u) => createNewDocsForUser(u));
298
+ const legacyUserIds = new Set(legacyUsers.map((u) => u._id.toString()));
299
+ const expectedUsers = legacyUsers.length;
300
+ const expectedApiKeys = apiKeys.filter((k) => legacyUserIds.has(k.userId.toString())).length;
301
+ const expectedTasks = tasks.filter((t) => legacyUserIds.has(t.userId.toString())).length;
302
+ const expectedConfigs = configs.filter((c) => legacyUserIds.has(c.userId.toString())).length;
303
+ const expectedNonogramItems = nonogramItems.filter((i) => legacyUserIds.has(i.userId.toString())).length;
304
+ const expectedNonogramUpgrades = nonogramUpgrades.filter((u) => legacyUserIds.has(u.userId.toString())).length;
305
+ if (newUsersToCreate.length !== expectedUsers) {
306
+ DR.logger.error(`Expected ${expectedUsers} users, but prepped ${newUsersToCreate.length}.`);
154
307
  }
155
- // 5. Execute
156
- if (dryRun) {
157
- DR.logger.info(`[DRY RUN] Would insert ${newUsers.length} users and delete ${oldUserIds.length} old ones.`);
158
- DR.logger.info(`[DRY RUN] Would insert ${newTasks.length} tasks and delete ${oldTaskIds.length} old ones.`);
159
- DR.logger.info(`[DRY RUN] Would insert ${newConfigs.length} configs and delete ${oldConfigIds.length} old ones.`);
160
- return;
308
+ if (newApiKeysToCreate.length !== expectedApiKeys) {
309
+ DR.logger.error(`Expected ${expectedApiKeys} API keys, but prepped ${newApiKeysToCreate.length}.`);
161
310
  }
162
- DR.logger.info('Executing migration...');
163
- // Users
164
- if (newUsers.length > 0) {
165
- await userRepo.insertMany(newUsers);
166
- await userRepo.deleteList(oldUserIds);
167
- DR.logger.success(`Migrated ${newUsers.length} users.`);
311
+ if (newTasksToCreate.length !== expectedTasks) {
312
+ DR.logger.error(`Expected ${expectedTasks} tasks, but prepped ${newTasksToCreate.length}.`);
168
313
  }
169
- // Tasks
170
- if (newTasks.length > 0) {
171
- await taskRepo.insertMany(newTasks);
172
- await taskRepo.deleteList(oldTaskIds);
173
- DR.logger.success(`Migrated ${newTasks.length} tasks.`);
314
+ if (newConfigsToCreate.length !== expectedConfigs) {
315
+ DR.logger.error(`Expected ${expectedConfigs} configs, but prepped ${newConfigsToCreate.length}.`);
174
316
  }
175
- // Configs
176
- if (newConfigs.length > 0) {
177
- await configRepo.insertMany(newConfigs);
178
- await configRepo.deleteList(oldConfigIds);
179
- DR.logger.success(`Migrated ${newConfigs.length} configs.`);
317
+ if (newNonogramItemsToCreate.length !== expectedNonogramItems) {
318
+ DR.logger.error(`Expected ${expectedNonogramItems} nonogram items, but prepped ${newNonogramItemsToCreate.length}.`);
180
319
  }
181
- DR.logger.success('Migration complete!');
320
+ if (newNonogramUpgradesToCreate.length !== expectedNonogramUpgrades) {
321
+ DR.logger.error(`Expected ${expectedNonogramUpgrades} nonogram upgrades, but prepped ${newNonogramUpgradesToCreate.length}.`);
322
+ }
323
+ DR.logger.info(`Prepped ${newUsersToCreate.length} new users.`);
324
+ DR.logger.info(`Prepped ${newApiKeysToCreate.length} new API keys.`);
325
+ DR.logger.info(`Prepped ${newTasksToCreate.length} new tasks.`);
326
+ DR.logger.info(`Prepped ${newConfigsToCreate.length} new configs.`);
327
+ DR.logger.info(`Prepped ${newNonogramItemsToCreate.length} new nonogram items.`);
328
+ DR.logger.info(`Prepped ${newNonogramUpgradesToCreate.length} new nonogram upgrades.`);
329
+ DR.logger.info(`In total, prepped ${newUsersToCreate.length +
330
+ newApiKeysToCreate.length +
331
+ newTasksToCreate.length +
332
+ newConfigsToCreate.length +
333
+ newNonogramItemsToCreate.length +
334
+ newNonogramUpgradesToCreate.length} documents for insertion.`);
335
+ if (!dryRun) {
336
+ DR.logger.info('Dry run is false. Inserting documents into DB...');
337
+ if (newUsersToCreate.length > 0) {
338
+ await (await userRepo.getCollection()).insertMany(newUsersToCreate);
339
+ }
340
+ if (newApiKeysToCreate.length > 0) {
341
+ await (await apiKeyRepo.getCollection()).insertMany(newApiKeysToCreate);
342
+ }
343
+ if (newTasksToCreate.length > 0) {
344
+ await (await taskRepo.getCollection()).insertMany(newTasksToCreate);
345
+ }
346
+ if (newConfigsToCreate.length > 0) {
347
+ await (await configRepo.getCollection()).insertMany(newConfigsToCreate);
348
+ }
349
+ if (newNonogramItemsToCreate.length > 0) {
350
+ await (await nonogramItemRepo.getCollection()).insertMany(newNonogramItemsToCreate);
351
+ }
352
+ if (newNonogramUpgradesToCreate.length > 0) {
353
+ await (await nonogramUpgradesRepo.getCollection()).insertMany(newNonogramUpgradesToCreate);
354
+ }
355
+ DR.logger.info('Insertion complete.');
356
+ }
357
+ else {
358
+ DR.logger.info('Dry run is true. Skipping DB insertion.');
359
+ }
360
+ return;
182
361
  }
183
362
  }
184
363
  //# sourceMappingURL=MigrationService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MigrationService.js","sourceRoot":"","sources":["../../src/services/MigrationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MigrationService.js","sourceRoot":"","sources":["../../src/services/MigrationService.ts"],"names":[],"mappings":"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"}