@aneuhold/be-ts-db-lib 1.0.7 → 1.0.9

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 (67) hide show
  1. package/README.md +12 -0
  2. package/lib/index.d.ts +1 -1
  3. package/lib/index.d.ts.map +1 -1
  4. package/lib/index.js +2 -2
  5. package/lib/repositories/BaseRepository.d.ts +21 -1
  6. package/lib/repositories/BaseRepository.d.ts.map +1 -1
  7. package/lib/repositories/BaseRepository.js +57 -1
  8. package/lib/repositories/common/ApiKeyRepository.d.ts +5 -6
  9. package/lib/repositories/common/ApiKeyRepository.d.ts.map +1 -1
  10. package/lib/repositories/common/ApiKeyRepository.js +21 -9
  11. package/lib/repositories/common/UserRepository.d.ts +1 -32
  12. package/lib/repositories/common/UserRepository.d.ts.map +1 -1
  13. package/lib/repositories/common/UserRepository.js +7 -63
  14. package/lib/repositories/dashboard/DashboardTaskRepository.d.ts +17 -0
  15. package/lib/repositories/dashboard/DashboardTaskRepository.d.ts.map +1 -0
  16. package/lib/repositories/dashboard/DashboardTaskRepository.js +47 -0
  17. package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts +17 -0
  18. package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts.map +1 -0
  19. package/lib/repositories/dashboard/DashboardUserConfigRepository.js +48 -0
  20. package/lib/scripts/migrate.d.ts +2 -0
  21. package/lib/scripts/migrate.d.ts.map +1 -0
  22. package/lib/scripts/migrate.js +7 -0
  23. package/lib/scripts/migrateDry.d.ts +2 -0
  24. package/lib/scripts/migrateDry.d.ts.map +1 -0
  25. package/lib/scripts/migrateDry.js +7 -0
  26. package/lib/scripts/validateSchema.d.ts +2 -0
  27. package/lib/scripts/validateSchema.d.ts.map +1 -0
  28. package/lib/scripts/validateSchema.js +9 -0
  29. package/lib/scripts/validateSchemaDryRun.d.ts +2 -0
  30. package/lib/scripts/validateSchemaDryRun.d.ts.map +1 -0
  31. package/lib/scripts/validateSchemaDryRun.js +9 -0
  32. package/lib/services/MigrationService.d.ts +20 -0
  33. package/lib/services/MigrationService.d.ts.map +1 -0
  34. package/lib/services/MigrationService.js +57 -0
  35. package/lib/services/RepoSubscriptionService.d.ts +30 -0
  36. package/lib/services/RepoSubscriptionService.d.ts.map +1 -0
  37. package/lib/services/RepoSubscriptionService.js +21 -0
  38. package/lib/tests/repositories/BaseRepository.spec.js +16 -4
  39. package/lib/tests/repositories/common/UserRepository.spec.js +9 -10
  40. package/lib/tests/repositories/dashboard/TaskRepository.spec.d.ts +2 -0
  41. package/lib/tests/repositories/dashboard/TaskRepository.spec.d.ts.map +1 -0
  42. package/lib/tests/repositories/dashboard/TaskRepository.spec.js +40 -0
  43. package/lib/tests/repositories/dashboard/UserConfigRepository.spec.js +3 -3
  44. package/lib/tests/testsUtil.d.ts +9 -0
  45. package/lib/tests/testsUtil.d.ts.map +1 -1
  46. package/lib/tests/testsUtil.js +19 -1
  47. package/lib/util/DbSchemaUpdater.d.ts +7 -0
  48. package/lib/util/DbSchemaUpdater.d.ts.map +1 -0
  49. package/lib/util/DbSchemaUpdater.js +21 -0
  50. package/lib/util/DocumentCleaner.d.ts +2 -2
  51. package/lib/util/DocumentCleaner.d.ts.map +1 -1
  52. package/lib/validators/BaseValidator.d.ts +36 -1
  53. package/lib/validators/BaseValidator.d.ts.map +1 -1
  54. package/lib/validators/BaseValidator.js +74 -0
  55. package/lib/validators/common/ApiKeyValidator.d.ts +1 -0
  56. package/lib/validators/common/ApiKeyValidator.d.ts.map +1 -1
  57. package/lib/validators/common/ApiKeyValidator.js +25 -0
  58. package/lib/validators/common/UserValidator.d.ts +1 -0
  59. package/lib/validators/common/UserValidator.d.ts.map +1 -1
  60. package/lib/validators/common/UserValidator.js +24 -0
  61. package/lib/validators/dashboard/TaskValidator.d.ts +8 -0
  62. package/lib/validators/dashboard/TaskValidator.d.ts.map +1 -0
  63. package/lib/validators/dashboard/TaskValidator.js +63 -0
  64. package/lib/validators/dashboard/UserConfigValidator.d.ts +1 -0
  65. package/lib/validators/dashboard/UserConfigValidator.d.ts.map +1 -1
  66. package/lib/validators/dashboard/UserConfigValidator.js +27 -2
  67. package/package.json +9 -5
@@ -3,6 +3,7 @@ import IValidator from '../BaseValidator';
3
3
  export default class UserValidator extends IValidator<User> {
4
4
  validateNewObject(newUser: User): Promise<void>;
5
5
  validateUpdateObject(userToUpdate: Partial<User>): Promise<void>;
6
+ validateRepositoryInDb(dryRun: boolean): Promise<void>;
6
7
  /**
7
8
  * Checks if the username exists already and throws an error if it does.
8
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"UserValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/common/UserValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAG1C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU,CAAC,IAAI,CAAC;IACnD,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtE;;OAEG;YACW,qBAAqB;CAWpC"}
1
+ {"version":3,"file":"UserValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/common/UserValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,0BAA0B,CAAC;AAG9D,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU,CAAC,IAAI,CAAC;IACnD,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5D;;OAEG;YACW,qBAAqB;CAWpC"}
@@ -7,6 +7,7 @@ const core_ts_db_lib_1 = require("@aneuhold/core-ts-db-lib");
7
7
  const core_ts_lib_1 = require("@aneuhold/core-ts-lib");
8
8
  const BaseValidator_1 = __importDefault(require("../BaseValidator"));
9
9
  const UserRepository_1 = __importDefault(require("../../repositories/common/UserRepository"));
10
+ const testsUtil_1 = require("../../tests/testsUtil");
10
11
  class UserValidator extends BaseValidator_1.default {
11
12
  async validateNewObject(newUser) {
12
13
  // Check if the username already exists
@@ -31,6 +32,29 @@ class UserValidator extends BaseValidator_1.default {
31
32
  await this.checkIfUserNameExists(userRepo, userToUpdate.userName);
32
33
  }
33
34
  }
35
+ async validateRepositoryInDb(dryRun) {
36
+ const userRepo = UserRepository_1.default.getRepo();
37
+ const allUsers = await userRepo.getAll();
38
+ await this.runStandardValidationForRepository({
39
+ dryRun,
40
+ docName: 'User',
41
+ allDocs: allUsers,
42
+ shouldDelete: (user) => {
43
+ if (user.userName.startsWith(testsUtil_1.TEST_USER_NAME_PREFIX)) {
44
+ core_ts_lib_1.Logger.error(`User with ID: ${user._id} is a test user and should be deleted`);
45
+ return true;
46
+ }
47
+ return false;
48
+ },
49
+ documentValidator: core_ts_db_lib_1.validateUser,
50
+ deletionFunction: async (docIdsToDelete) => {
51
+ await userRepo.deleteList(docIdsToDelete);
52
+ },
53
+ updateFunction: async (docsToUpdate) => {
54
+ await userRepo.updateMany(docsToUpdate);
55
+ }
56
+ });
57
+ }
34
58
  /**
35
59
  * Checks if the username exists already and throws an error if it does.
36
60
  */
@@ -0,0 +1,8 @@
1
+ import { DashboardTask } from '@aneuhold/core-ts-db-lib';
2
+ import IValidator from '../BaseValidator';
3
+ export default class DashboardTaskValidator extends IValidator<DashboardTask> {
4
+ validateNewObject(newTask: DashboardTask): Promise<void>;
5
+ validateUpdateObject(updatedTask: Partial<DashboardTask>): Promise<void>;
6
+ validateRepositoryInDb(dryRun: boolean): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=TaskValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TaskValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/dashboard/TaskValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,0BAA0B,CAAC;AAGhF,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACrE,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxD,oBAAoB,CACxB,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC;IAUV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA0C7D"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_ts_db_lib_1 = require("@aneuhold/core-ts-db-lib");
7
+ const core_ts_lib_1 = require("@aneuhold/core-ts-lib");
8
+ const BaseValidator_1 = __importDefault(require("../BaseValidator"));
9
+ const UserRepository_1 = __importDefault(require("../../repositories/common/UserRepository"));
10
+ const DashboardTaskRepository_1 = __importDefault(require("../../repositories/dashboard/DashboardTaskRepository"));
11
+ class DashboardTaskValidator extends BaseValidator_1.default {
12
+ async validateNewObject(newTask) {
13
+ // Check if the user exists, and any shared users exist
14
+ const userRepo = UserRepository_1.default.getRepo();
15
+ const users = [newTask.userId, ...newTask.sharedWith];
16
+ const usersFound = await userRepo.getList(users);
17
+ if (usersFound.length !== users.length) {
18
+ core_ts_lib_1.ErrorUtils.throwError(`Not all users exist. Found: ${usersFound.length}, expected: ${users.length}`, newTask);
19
+ }
20
+ }
21
+ async validateUpdateObject(updatedTask) {
22
+ // Check if an id is defined
23
+ if (!updatedTask._id) {
24
+ core_ts_lib_1.ErrorUtils.throwError(`No _id defined for DashboardTask update.`, updatedTask);
25
+ }
26
+ }
27
+ async validateRepositoryInDb(dryRun) {
28
+ const taskRepo = DashboardTaskRepository_1.default.getRepo();
29
+ const allTasks = await taskRepo.getAll();
30
+ const allUserIds = await UserRepository_1.default.getRepo().getAllIdsAsHash();
31
+ await this.runStandardValidationForRepository({
32
+ dryRun,
33
+ docName: 'Dashboard Task',
34
+ allDocs: allTasks,
35
+ shouldDelete: (task) => {
36
+ if (!allUserIds[task.userId.toString()]) {
37
+ core_ts_lib_1.Logger.error(`Dashboard Task with ID: ${task._id} has no valid associated owner (user).`);
38
+ return true;
39
+ }
40
+ return false;
41
+ },
42
+ documentValidator: (task) => {
43
+ const { updatedDoc, errors } = (0, core_ts_db_lib_1.validateDashboardTask)(task);
44
+ const sharedWithUserIds = [...task.sharedWith];
45
+ sharedWithUserIds.forEach((userId) => {
46
+ if (!allUserIds[userId.toString()]) {
47
+ errors.push(`User with ID: ${userId} does not exist in sharedWith property of task with ID: ${task._id}.`);
48
+ // eslint-disable-next-line no-param-reassign
49
+ task.sharedWith = task.sharedWith.filter((id) => id.toString() !== userId.toString());
50
+ }
51
+ });
52
+ return { updatedDoc, errors };
53
+ },
54
+ deletionFunction: async (docIdsToDelete) => {
55
+ await taskRepo.deleteList(docIdsToDelete);
56
+ },
57
+ updateFunction: async (docsToUpdate) => {
58
+ await taskRepo.updateMany(docsToUpdate);
59
+ }
60
+ });
61
+ }
62
+ }
63
+ exports.default = DashboardTaskValidator;
@@ -3,5 +3,6 @@ import IValidator from '../BaseValidator';
3
3
  export default class DashboardUserConfigValidator extends IValidator<DashboardUserConfig> {
4
4
  validateNewObject(newUserConfig: DashboardUserConfig): Promise<void>;
5
5
  validateUpdateObject(updatedUserConfig: Partial<DashboardUserConfig>): Promise<void>;
6
+ validateRepositoryInDb(dryRun: boolean): Promise<void>;
6
7
  }
7
8
  //# sourceMappingURL=UserConfigValidator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserConfigValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/dashboard/UserConfigValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,UAAU,CAAC,mBAAmB,CAAC;IACjF,iBAAiB,CAAC,aAAa,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpE,oBAAoB,CACxB,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC;CASjB"}
1
+ {"version":3,"file":"UserConfigValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/dashboard/UserConfigValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAI1C,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,UAAU,CAAC,mBAAmB,CAAC;IACjF,iBAAiB,CAAC,aAAa,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpE,oBAAoB,CACxB,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC;IAUV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA2B7D"}
@@ -3,14 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_ts_db_lib_1 = require("@aneuhold/core-ts-db-lib");
6
7
  const core_ts_lib_1 = require("@aneuhold/core-ts-lib");
7
8
  const BaseValidator_1 = __importDefault(require("../BaseValidator"));
8
- const UserConfigRepository_1 = __importDefault(require("../../repositories/dashboard/UserConfigRepository"));
9
+ const DashboardUserConfigRepository_1 = __importDefault(require("../../repositories/dashboard/DashboardUserConfigRepository"));
9
10
  const UserRepository_1 = __importDefault(require("../../repositories/common/UserRepository"));
10
11
  class DashboardUserConfigValidator extends BaseValidator_1.default {
11
12
  async validateNewObject(newUserConfig) {
12
13
  // Check if the config already exists for the user
13
- const configRepo = UserConfigRepository_1.default.getRepo();
14
+ const configRepo = DashboardUserConfigRepository_1.default.getRepo();
14
15
  const existingConfig = await configRepo.get({
15
16
  userId: newUserConfig.userId
16
17
  });
@@ -29,5 +30,29 @@ class DashboardUserConfigValidator extends BaseValidator_1.default {
29
30
  core_ts_lib_1.ErrorUtils.throwError(`No _id defined for DashboardUserConfig update.`, updatedUserConfig);
30
31
  }
31
32
  }
33
+ async validateRepositoryInDb(dryRun) {
34
+ const userConfigRepo = DashboardUserConfigRepository_1.default.getRepo();
35
+ const allUserConfigs = await userConfigRepo.getAll();
36
+ const allUserIds = await UserRepository_1.default.getRepo().getAllIdsAsHash();
37
+ await this.runStandardValidationForRepository({
38
+ dryRun,
39
+ docName: 'Dashboard User Config',
40
+ allDocs: allUserConfigs,
41
+ shouldDelete: (userConfig) => {
42
+ if (!allUserIds[userConfig.userId.toString()]) {
43
+ core_ts_lib_1.Logger.error(`Dashboard User Config with ID: ${userConfig._id} has no valid associated user.`);
44
+ return true;
45
+ }
46
+ return false;
47
+ },
48
+ documentValidator: core_ts_db_lib_1.validateDashboardUserConfig,
49
+ deletionFunction: async (docIdsToDelete) => {
50
+ await userConfigRepo.deleteList(docIdsToDelete);
51
+ },
52
+ updateFunction: async (docsToUpdate) => {
53
+ await userConfigRepo.updateMany(docsToUpdate);
54
+ }
55
+ });
56
+ }
32
57
  }
33
58
  exports.default = DashboardUserConfigValidator;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aneuhold/be-ts-db-lib",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "A backend database library meant to actually interact with various databases in personal projects",
5
5
  "author": "Anton G Neuhold Jr <agneuhold@gmail.com>",
6
6
  "license": "MIT",
@@ -33,12 +33,16 @@
33
33
  "unlink:bets": "yarn unlink @aneuhold/be-ts-lib && yarn install --force",
34
34
  "upgrade:all": "yarn upgrade --latest",
35
35
  "upgrade:core": "yarn upgrade --latest --pattern @aneuhold",
36
- "test": "jest"
36
+ "test": "jest && yarn validate:dry",
37
+ "validate": "ts-node ./src/scripts/validateSchema.ts",
38
+ "validate:dry": "ts-node ./src/scripts/validateSchemaDryRun.ts",
39
+ "migrate": "ts-node ./src/scripts/migrate.ts",
40
+ "migrate:dry": "ts-node ./src/scripts/migrateDry.ts"
37
41
  },
38
42
  "dependencies": {
39
- "@aneuhold/be-ts-lib": "^1.0.5",
40
- "@aneuhold/core-ts-db-lib": "^1.0.8",
41
- "@aneuhold/core-ts-lib": "^1.1.8",
43
+ "@aneuhold/be-ts-lib": "^1.0.6",
44
+ "@aneuhold/core-ts-db-lib": "^1.0.16",
45
+ "@aneuhold/core-ts-lib": "^1.1.9",
42
46
  "bson": "^6.2.0",
43
47
  "mongodb": "^6.3.0"
44
48
  },