@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.
- package/CHANGELOG.md +19 -1
- package/lib/repositories/BaseRepository.d.ts +1 -1
- package/lib/repositories/BaseRepository.d.ts.map +1 -1
- package/lib/repositories/BaseRepository.js.map +1 -1
- package/lib/repositories/BaseRepository.ts +2 -2
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js +7 -3
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.ts +9 -3
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js +7 -3
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.ts +10 -4
- package/lib/repositories/dashboard/DashboardTaskRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.js +6 -5
- package/lib/repositories/dashboard/DashboardTaskRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.ts +7 -6
- package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardUserConfigRepository.js +9 -10
- package/lib/repositories/dashboard/DashboardUserConfigRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardUserConfigRepository.ts +16 -14
- package/lib/services/MigrationService.d.ts.map +1 -1
- package/lib/services/MigrationService.js +308 -129
- package/lib/services/MigrationService.js.map +1 -1
- package/lib/services/MigrationService.ts +379 -135
- 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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
107
|
-
|
|
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
|
-
|
|
110
|
-
const
|
|
111
|
-
newTags[
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|
238
|
+
verifyDoc(oldTask, newTask);
|
|
239
|
+
newTasksToCreate.push(newTask);
|
|
132
240
|
}
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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
|
-
|
|
163
|
-
|
|
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
|
-
|
|
170
|
-
|
|
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
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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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"}
|