@aneuhold/be-ts-db-lib 4.1.2 → 4.2.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.
Files changed (161) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -0
  3. package/lib/repositories/BaseRepository.d.ts +8 -1
  4. package/lib/repositories/BaseRepository.d.ts.map +1 -1
  5. package/lib/repositories/BaseRepository.js +13 -1
  6. package/lib/repositories/BaseRepository.js.map +1 -1
  7. package/lib/repositories/BaseRepository.ts +14 -1
  8. package/lib/repositories/common/UserRepository.d.ts.map +1 -1
  9. package/lib/repositories/common/UserRepository.js +12 -0
  10. package/lib/repositories/common/UserRepository.js.map +1 -1
  11. package/lib/repositories/common/UserRepository.ts +12 -0
  12. package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.d.ts +20 -0
  13. package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.d.ts.map +1 -1
  14. package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.js +36 -4
  15. package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.js.map +1 -1
  16. package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.ts +39 -4
  17. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.d.ts.map +1 -1
  18. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js +2 -12
  19. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js.map +1 -1
  20. package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.ts +2 -16
  21. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.d.ts.map +1 -1
  22. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js +2 -12
  23. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js.map +1 -1
  24. package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.ts +2 -16
  25. package/lib/repositories/dashboard/DashboardTaskRepository.d.ts +14 -0
  26. package/lib/repositories/dashboard/DashboardTaskRepository.d.ts.map +1 -1
  27. package/lib/repositories/dashboard/DashboardTaskRepository.js +33 -35
  28. package/lib/repositories/dashboard/DashboardTaskRepository.js.map +1 -1
  29. package/lib/repositories/dashboard/DashboardTaskRepository.ts +41 -45
  30. package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts +14 -0
  31. package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts.map +1 -1
  32. package/lib/repositories/dashboard/DashboardUserConfigRepository.js +26 -15
  33. package/lib/repositories/dashboard/DashboardUserConfigRepository.js.map +1 -1
  34. package/lib/repositories/dashboard/DashboardUserConfigRepository.ts +38 -21
  35. package/lib/repositories/workout/WorkoutBaseRepository.d.ts +22 -0
  36. package/lib/repositories/workout/WorkoutBaseRepository.d.ts.map +1 -0
  37. package/lib/repositories/workout/WorkoutBaseRepository.js +53 -0
  38. package/lib/repositories/workout/WorkoutBaseRepository.js.map +1 -0
  39. package/lib/repositories/workout/WorkoutBaseRepository.ts +85 -0
  40. package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.d.ts +40 -0
  41. package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.d.ts.map +1 -0
  42. package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.js +96 -0
  43. package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.js.map +1 -0
  44. package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.ts +134 -0
  45. package/lib/repositories/workout/WorkoutEquipmentTypeRepository.d.ts +17 -0
  46. package/lib/repositories/workout/WorkoutEquipmentTypeRepository.d.ts.map +1 -0
  47. package/lib/repositories/workout/WorkoutEquipmentTypeRepository.js +34 -0
  48. package/lib/repositories/workout/WorkoutEquipmentTypeRepository.js.map +1 -0
  49. package/lib/repositories/workout/WorkoutEquipmentTypeRepository.ts +40 -0
  50. package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.d.ts +31 -0
  51. package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.d.ts.map +1 -0
  52. package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.js +70 -0
  53. package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.js.map +1 -0
  54. package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.ts +84 -0
  55. package/lib/repositories/workout/WorkoutExerciseRepository.d.ts +14 -0
  56. package/lib/repositories/workout/WorkoutExerciseRepository.d.ts.map +1 -0
  57. package/lib/repositories/workout/WorkoutExerciseRepository.js +34 -0
  58. package/lib/repositories/workout/WorkoutExerciseRepository.js.map +1 -0
  59. package/lib/repositories/workout/WorkoutExerciseRepository.ts +40 -0
  60. package/lib/repositories/workout/WorkoutMesocycleRepository.d.ts +14 -0
  61. package/lib/repositories/workout/WorkoutMesocycleRepository.d.ts.map +1 -0
  62. package/lib/repositories/workout/WorkoutMesocycleRepository.js +34 -0
  63. package/lib/repositories/workout/WorkoutMesocycleRepository.js.map +1 -0
  64. package/lib/repositories/workout/WorkoutMesocycleRepository.ts +40 -0
  65. package/lib/repositories/workout/WorkoutMicrocycleRepository.d.ts +31 -0
  66. package/lib/repositories/workout/WorkoutMicrocycleRepository.d.ts.map +1 -0
  67. package/lib/repositories/workout/WorkoutMicrocycleRepository.js +72 -0
  68. package/lib/repositories/workout/WorkoutMicrocycleRepository.js.map +1 -0
  69. package/lib/repositories/workout/WorkoutMicrocycleRepository.ts +86 -0
  70. package/lib/repositories/workout/WorkoutMuscleGroupRepository.d.ts +20 -0
  71. package/lib/repositories/workout/WorkoutMuscleGroupRepository.d.ts.map +1 -0
  72. package/lib/repositories/workout/WorkoutMuscleGroupRepository.js +37 -0
  73. package/lib/repositories/workout/WorkoutMuscleGroupRepository.js.map +1 -0
  74. package/lib/repositories/workout/WorkoutMuscleGroupRepository.ts +43 -0
  75. package/lib/repositories/workout/WorkoutSessionExerciseRepository.d.ts +31 -0
  76. package/lib/repositories/workout/WorkoutSessionExerciseRepository.d.ts.map +1 -0
  77. package/lib/repositories/workout/WorkoutSessionExerciseRepository.js +72 -0
  78. package/lib/repositories/workout/WorkoutSessionExerciseRepository.js.map +1 -0
  79. package/lib/repositories/workout/WorkoutSessionExerciseRepository.ts +86 -0
  80. package/lib/repositories/workout/WorkoutSessionRepository.d.ts +31 -0
  81. package/lib/repositories/workout/WorkoutSessionRepository.d.ts.map +1 -0
  82. package/lib/repositories/workout/WorkoutSessionRepository.js +72 -0
  83. package/lib/repositories/workout/WorkoutSessionRepository.js.map +1 -0
  84. package/lib/repositories/workout/WorkoutSessionRepository.ts +86 -0
  85. package/lib/repositories/workout/WorkoutSetRepository.d.ts +31 -0
  86. package/lib/repositories/workout/WorkoutSetRepository.d.ts.map +1 -0
  87. package/lib/repositories/workout/WorkoutSetRepository.js +69 -0
  88. package/lib/repositories/workout/WorkoutSetRepository.js.map +1 -0
  89. package/lib/repositories/workout/WorkoutSetRepository.ts +89 -0
  90. package/lib/util/DbSchemaUpdater.d.ts.map +1 -1
  91. package/lib/util/DbSchemaUpdater.js +25 -0
  92. package/lib/util/DbSchemaUpdater.js.map +1 -1
  93. package/lib/util/DbSchemaUpdater.ts +27 -0
  94. package/lib/util/DocumentCleaner.d.ts +2 -1
  95. package/lib/util/DocumentCleaner.d.ts.map +1 -1
  96. package/lib/util/DocumentCleaner.js +5 -0
  97. package/lib/util/DocumentCleaner.js.map +1 -1
  98. package/lib/util/DocumentCleaner.ts +14 -1
  99. package/lib/util/globalTestVariables.d.ts +8 -0
  100. package/lib/util/globalTestVariables.d.ts.map +1 -0
  101. package/lib/util/globalTestVariables.js +8 -0
  102. package/lib/util/globalTestVariables.js.map +1 -0
  103. package/lib/{tests → util}/globalTestVariables.ts +3 -0
  104. package/lib/validators/common/UserValidator.js +1 -1
  105. package/lib/validators/common/UserValidator.js.map +1 -1
  106. package/lib/validators/common/UserValidator.ts +1 -1
  107. package/lib/validators/workout/EquipmentTypeValidator.d.ts +9 -0
  108. package/lib/validators/workout/EquipmentTypeValidator.d.ts.map +1 -0
  109. package/lib/validators/workout/EquipmentTypeValidator.js +43 -0
  110. package/lib/validators/workout/EquipmentTypeValidator.js.map +1 -0
  111. package/lib/validators/workout/EquipmentTypeValidator.ts +56 -0
  112. package/lib/validators/workout/ExerciseCalibrationValidator.d.ts +9 -0
  113. package/lib/validators/workout/ExerciseCalibrationValidator.d.ts.map +1 -0
  114. package/lib/validators/workout/ExerciseCalibrationValidator.js +65 -0
  115. package/lib/validators/workout/ExerciseCalibrationValidator.js.map +1 -0
  116. package/lib/validators/workout/ExerciseCalibrationValidator.ts +85 -0
  117. package/lib/validators/workout/ExerciseValidator.d.ts +9 -0
  118. package/lib/validators/workout/ExerciseValidator.d.ts.map +1 -0
  119. package/lib/validators/workout/ExerciseValidator.js +117 -0
  120. package/lib/validators/workout/ExerciseValidator.js.map +1 -0
  121. package/lib/validators/workout/ExerciseValidator.ts +156 -0
  122. package/lib/validators/workout/MesocycleValidator.d.ts +9 -0
  123. package/lib/validators/workout/MesocycleValidator.d.ts.map +1 -0
  124. package/lib/validators/workout/MesocycleValidator.js +56 -0
  125. package/lib/validators/workout/MesocycleValidator.js.map +1 -0
  126. package/lib/validators/workout/MesocycleValidator.ts +73 -0
  127. package/lib/validators/workout/MicrocycleValidator.d.ts +9 -0
  128. package/lib/validators/workout/MicrocycleValidator.d.ts.map +1 -0
  129. package/lib/validators/workout/MicrocycleValidator.js +73 -0
  130. package/lib/validators/workout/MicrocycleValidator.js.map +1 -0
  131. package/lib/validators/workout/MicrocycleValidator.ts +91 -0
  132. package/lib/validators/workout/MuscleGroupValidator.d.ts +9 -0
  133. package/lib/validators/workout/MuscleGroupValidator.d.ts.map +1 -0
  134. package/lib/validators/workout/MuscleGroupValidator.js +43 -0
  135. package/lib/validators/workout/MuscleGroupValidator.js.map +1 -0
  136. package/lib/validators/workout/MuscleGroupValidator.ts +53 -0
  137. package/lib/validators/workout/SessionExerciseValidator.d.ts +9 -0
  138. package/lib/validators/workout/SessionExerciseValidator.d.ts.map +1 -0
  139. package/lib/validators/workout/SessionExerciseValidator.js +94 -0
  140. package/lib/validators/workout/SessionExerciseValidator.js.map +1 -0
  141. package/lib/validators/workout/SessionExerciseValidator.ts +117 -0
  142. package/lib/validators/workout/SessionValidator.d.ts +9 -0
  143. package/lib/validators/workout/SessionValidator.d.ts.map +1 -0
  144. package/lib/validators/workout/SessionValidator.js +73 -0
  145. package/lib/validators/workout/SessionValidator.js.map +1 -0
  146. package/lib/validators/workout/SessionValidator.ts +89 -0
  147. package/lib/validators/workout/SetValidator.d.ts +9 -0
  148. package/lib/validators/workout/SetValidator.d.ts.map +1 -0
  149. package/lib/validators/workout/SetValidator.js +69 -0
  150. package/lib/validators/workout/SetValidator.js.map +1 -0
  151. package/lib/validators/workout/SetValidator.ts +88 -0
  152. package/package.json +6 -5
  153. package/lib/tests/globalTestVariables.d.ts +0 -5
  154. package/lib/tests/globalTestVariables.d.ts.map +0 -1
  155. package/lib/tests/globalTestVariables.js +0 -5
  156. package/lib/tests/globalTestVariables.js.map +0 -1
  157. package/lib/tests/testsUtil.d.ts +0 -34
  158. package/lib/tests/testsUtil.d.ts.map +0 -1
  159. package/lib/tests/testsUtil.js +0 -60
  160. package/lib/tests/testsUtil.js.map +0 -1
  161. package/lib/tests/testsUtil.ts +0 -68
@@ -0,0 +1,43 @@
1
+ import { WorkoutEquipmentTypeSchema } from '@aneuhold/core-ts-db-lib';
2
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
3
+ import UserRepository from '../../repositories/common/UserRepository.js';
4
+ import WorkoutEquipmentTypeRepository from '../../repositories/workout/WorkoutEquipmentTypeRepository.js';
5
+ import IValidator from '../BaseValidator.js';
6
+ export default class WorkoutEquipmentTypeValidator extends IValidator {
7
+ constructor() {
8
+ super(WorkoutEquipmentTypeSchema, WorkoutEquipmentTypeSchema.partial());
9
+ }
10
+ validateNewObjectBusinessLogic() {
11
+ return Promise.resolve();
12
+ }
13
+ validateUpdateObjectBusinessLogic(updatedEquipmentType) {
14
+ if (!updatedEquipmentType._id) {
15
+ ErrorUtils.throwError('No _id defined for WorkoutEquipmentType update.', updatedEquipmentType);
16
+ }
17
+ return Promise.resolve();
18
+ }
19
+ async validateRepositoryInDb(dryRun) {
20
+ const equipmentTypeRepo = WorkoutEquipmentTypeRepository.getRepo();
21
+ const allEquipmentTypes = await equipmentTypeRepo.getAll();
22
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
23
+ await this.runStandardValidationForRepository({
24
+ dryRun,
25
+ docName: 'Workout Equipment Type',
26
+ allDocs: allEquipmentTypes,
27
+ shouldDelete: (equipmentType) => {
28
+ if (!allUserIds[equipmentType.userId]) {
29
+ DR.logger.error(`Workout Equipment Type with ID: ${equipmentType._id} has no valid associated user.`);
30
+ return true;
31
+ }
32
+ return false;
33
+ },
34
+ deletionFunction: async (docIdsToDelete) => {
35
+ await equipmentTypeRepo.deleteList(docIdsToDelete);
36
+ },
37
+ updateFunction: async (docsToUpdate) => {
38
+ await equipmentTypeRepo.updateMany(docsToUpdate);
39
+ }
40
+ });
41
+ }
42
+ }
43
+ //# sourceMappingURL=EquipmentTypeValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EquipmentTypeValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/EquipmentTypeValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,8BAA8B,MAAM,8DAA8D,CAAC;AAC1G,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,UAAgC;IACzF;QACE,KAAK,CAAC,0BAA0B,EAAE,0BAA0B,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IAES,8BAA8B;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,iCAAiC,CACzC,oBAAmD;QAEnD,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC;YAC9B,UAAU,CAAC,UAAU,CACnB,iDAAiD,EACjD,oBAAoB,CACrB,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAC1C,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,OAAO,EAAE,CAAC;QACnE,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QAEpE,MAAM,IAAI,CAAC,kCAAkC,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE,iBAAiB;YAC1B,YAAY,EAAE,CAAC,aAAmC,EAAE,EAAE;gBACpD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtC,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,mCAAmC,aAAa,CAAC,GAAG,gCAAgC,CACrF,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,gBAAgB,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;gBACjD,MAAM,iBAAiB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACrD,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,YAAoC,EAAE,EAAE;gBAC7D,MAAM,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACnD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,56 @@
1
+ import type { WorkoutEquipmentType } from '@aneuhold/core-ts-db-lib';
2
+ import { WorkoutEquipmentTypeSchema } from '@aneuhold/core-ts-db-lib';
3
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
4
+ import type { UUID } from 'crypto';
5
+ import UserRepository from '../../repositories/common/UserRepository.js';
6
+ import WorkoutEquipmentTypeRepository from '../../repositories/workout/WorkoutEquipmentTypeRepository.js';
7
+ import IValidator from '../BaseValidator.js';
8
+
9
+ export default class WorkoutEquipmentTypeValidator extends IValidator<WorkoutEquipmentType> {
10
+ constructor() {
11
+ super(WorkoutEquipmentTypeSchema, WorkoutEquipmentTypeSchema.partial());
12
+ }
13
+
14
+ protected validateNewObjectBusinessLogic(): Promise<void> {
15
+ return Promise.resolve();
16
+ }
17
+
18
+ protected validateUpdateObjectBusinessLogic(
19
+ updatedEquipmentType: Partial<WorkoutEquipmentType>
20
+ ): Promise<void> {
21
+ if (!updatedEquipmentType._id) {
22
+ ErrorUtils.throwError(
23
+ 'No _id defined for WorkoutEquipmentType update.',
24
+ updatedEquipmentType
25
+ );
26
+ }
27
+ return Promise.resolve();
28
+ }
29
+
30
+ async validateRepositoryInDb(dryRun: boolean): Promise<void> {
31
+ const equipmentTypeRepo = WorkoutEquipmentTypeRepository.getRepo();
32
+ const allEquipmentTypes = await equipmentTypeRepo.getAll();
33
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
34
+
35
+ await this.runStandardValidationForRepository({
36
+ dryRun,
37
+ docName: 'Workout Equipment Type',
38
+ allDocs: allEquipmentTypes,
39
+ shouldDelete: (equipmentType: WorkoutEquipmentType) => {
40
+ if (!allUserIds[equipmentType.userId]) {
41
+ DR.logger.error(
42
+ `Workout Equipment Type with ID: ${equipmentType._id} has no valid associated user.`
43
+ );
44
+ return true;
45
+ }
46
+ return false;
47
+ },
48
+ deletionFunction: async (docIdsToDelete: UUID[]) => {
49
+ await equipmentTypeRepo.deleteList(docIdsToDelete);
50
+ },
51
+ updateFunction: async (docsToUpdate: WorkoutEquipmentType[]) => {
52
+ await equipmentTypeRepo.updateMany(docsToUpdate);
53
+ }
54
+ });
55
+ }
56
+ }
@@ -0,0 +1,9 @@
1
+ import type { WorkoutExerciseCalibration } from '@aneuhold/core-ts-db-lib';
2
+ import IValidator from '../BaseValidator.js';
3
+ export default class WorkoutExerciseCalibrationValidator extends IValidator<WorkoutExerciseCalibration> {
4
+ constructor();
5
+ protected validateNewObjectBusinessLogic(newCalibration: WorkoutExerciseCalibration): Promise<void>;
6
+ protected validateUpdateObjectBusinessLogic(updatedCalibration: Partial<WorkoutExerciseCalibration>): Promise<void>;
7
+ validateRepositoryInDb(dryRun: boolean): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=ExerciseCalibrationValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExerciseCalibrationValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/ExerciseCalibrationValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAO3E,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,mCAAoC,SAAQ,UAAU,CAAC,0BAA0B,CAAC;;cAKrF,8BAA8B,CAC5C,cAAc,EAAE,0BAA0B,GACzC,OAAO,CAAC,IAAI,CAAC;cAYA,iCAAiC,CAC/C,kBAAkB,EAAE,OAAO,CAAC,0BAA0B,CAAC,GACtD,OAAO,CAAC,IAAI,CAAC;IAqBV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAiC7D"}
@@ -0,0 +1,65 @@
1
+ import { WorkoutExerciseCalibrationSchema } from '@aneuhold/core-ts-db-lib';
2
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
3
+ import UserRepository from '../../repositories/common/UserRepository.js';
4
+ import WorkoutExerciseCalibrationRepository from '../../repositories/workout/WorkoutExerciseCalibrationRepository.js';
5
+ import WorkoutExerciseRepository from '../../repositories/workout/WorkoutExerciseRepository.js';
6
+ import IValidator from '../BaseValidator.js';
7
+ export default class WorkoutExerciseCalibrationValidator extends IValidator {
8
+ constructor() {
9
+ super(WorkoutExerciseCalibrationSchema, WorkoutExerciseCalibrationSchema.partial());
10
+ }
11
+ async validateNewObjectBusinessLogic(newCalibration) {
12
+ // Validate that the exercise exists
13
+ const exerciseRepo = WorkoutExerciseRepository.getRepo();
14
+ const exercise = await exerciseRepo.get({ _id: newCalibration.workoutExerciseId });
15
+ if (!exercise) {
16
+ ErrorUtils.throwError(`Exercise with ID ${newCalibration.workoutExerciseId} does not exist`, newCalibration);
17
+ }
18
+ }
19
+ async validateUpdateObjectBusinessLogic(updatedCalibration) {
20
+ const errors = [];
21
+ if (!updatedCalibration._id) {
22
+ errors.push('No _id defined for WorkoutExerciseCalibration update.');
23
+ }
24
+ // Validate exercise if being updated
25
+ if (updatedCalibration.workoutExerciseId) {
26
+ const exerciseRepo = WorkoutExerciseRepository.getRepo();
27
+ const exercise = await exerciseRepo.get({ _id: updatedCalibration.workoutExerciseId });
28
+ if (!exercise) {
29
+ errors.push(`Exercise with ID ${updatedCalibration.workoutExerciseId} does not exist`);
30
+ }
31
+ }
32
+ if (errors.length > 0) {
33
+ ErrorUtils.throwErrorList(errors, updatedCalibration);
34
+ }
35
+ }
36
+ async validateRepositoryInDb(dryRun) {
37
+ const calibrationRepo = WorkoutExerciseCalibrationRepository.getRepo();
38
+ const allCalibrations = await calibrationRepo.getAll();
39
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
40
+ const allExerciseIds = await WorkoutExerciseRepository.getRepo().getAllIdsAsHash();
41
+ await this.runStandardValidationForRepository({
42
+ dryRun,
43
+ docName: 'Workout Exercise Calibration',
44
+ allDocs: allCalibrations,
45
+ shouldDelete: (calibration) => {
46
+ if (!allUserIds[calibration.userId]) {
47
+ DR.logger.error(`Workout Exercise Calibration with ID: ${calibration._id} has no valid associated user.`);
48
+ return true;
49
+ }
50
+ if (!allExerciseIds[calibration.workoutExerciseId]) {
51
+ DR.logger.error(`Workout Exercise Calibration with ID: ${calibration._id} has no valid associated exercise.`);
52
+ return true;
53
+ }
54
+ return false;
55
+ },
56
+ deletionFunction: async (docIdsToDelete) => {
57
+ await calibrationRepo.deleteList(docIdsToDelete);
58
+ },
59
+ updateFunction: async (docsToUpdate) => {
60
+ await calibrationRepo.updateMany(docsToUpdate);
61
+ }
62
+ });
63
+ }
64
+ }
65
+ //# sourceMappingURL=ExerciseCalibrationValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExerciseCalibrationValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/ExerciseCalibrationValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import type { WorkoutExerciseCalibration } from '@aneuhold/core-ts-db-lib';
2
+ import { WorkoutExerciseCalibrationSchema } from '@aneuhold/core-ts-db-lib';
3
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
4
+ import type { UUID } from 'crypto';
5
+ import UserRepository from '../../repositories/common/UserRepository.js';
6
+ import WorkoutExerciseCalibrationRepository from '../../repositories/workout/WorkoutExerciseCalibrationRepository.js';
7
+ import WorkoutExerciseRepository from '../../repositories/workout/WorkoutExerciseRepository.js';
8
+ import IValidator from '../BaseValidator.js';
9
+
10
+ export default class WorkoutExerciseCalibrationValidator extends IValidator<WorkoutExerciseCalibration> {
11
+ constructor() {
12
+ super(WorkoutExerciseCalibrationSchema, WorkoutExerciseCalibrationSchema.partial());
13
+ }
14
+
15
+ protected async validateNewObjectBusinessLogic(
16
+ newCalibration: WorkoutExerciseCalibration
17
+ ): Promise<void> {
18
+ // Validate that the exercise exists
19
+ const exerciseRepo = WorkoutExerciseRepository.getRepo();
20
+ const exercise = await exerciseRepo.get({ _id: newCalibration.workoutExerciseId });
21
+ if (!exercise) {
22
+ ErrorUtils.throwError(
23
+ `Exercise with ID ${newCalibration.workoutExerciseId} does not exist`,
24
+ newCalibration
25
+ );
26
+ }
27
+ }
28
+
29
+ protected async validateUpdateObjectBusinessLogic(
30
+ updatedCalibration: Partial<WorkoutExerciseCalibration>
31
+ ): Promise<void> {
32
+ const errors: string[] = [];
33
+
34
+ if (!updatedCalibration._id) {
35
+ errors.push('No _id defined for WorkoutExerciseCalibration update.');
36
+ }
37
+
38
+ // Validate exercise if being updated
39
+ if (updatedCalibration.workoutExerciseId) {
40
+ const exerciseRepo = WorkoutExerciseRepository.getRepo();
41
+ const exercise = await exerciseRepo.get({ _id: updatedCalibration.workoutExerciseId });
42
+ if (!exercise) {
43
+ errors.push(`Exercise with ID ${updatedCalibration.workoutExerciseId} does not exist`);
44
+ }
45
+ }
46
+
47
+ if (errors.length > 0) {
48
+ ErrorUtils.throwErrorList(errors, updatedCalibration);
49
+ }
50
+ }
51
+
52
+ async validateRepositoryInDb(dryRun: boolean): Promise<void> {
53
+ const calibrationRepo = WorkoutExerciseCalibrationRepository.getRepo();
54
+ const allCalibrations = await calibrationRepo.getAll();
55
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
56
+ const allExerciseIds = await WorkoutExerciseRepository.getRepo().getAllIdsAsHash();
57
+
58
+ await this.runStandardValidationForRepository({
59
+ dryRun,
60
+ docName: 'Workout Exercise Calibration',
61
+ allDocs: allCalibrations,
62
+ shouldDelete: (calibration: WorkoutExerciseCalibration) => {
63
+ if (!allUserIds[calibration.userId]) {
64
+ DR.logger.error(
65
+ `Workout Exercise Calibration with ID: ${calibration._id} has no valid associated user.`
66
+ );
67
+ return true;
68
+ }
69
+ if (!allExerciseIds[calibration.workoutExerciseId]) {
70
+ DR.logger.error(
71
+ `Workout Exercise Calibration with ID: ${calibration._id} has no valid associated exercise.`
72
+ );
73
+ return true;
74
+ }
75
+ return false;
76
+ },
77
+ deletionFunction: async (docIdsToDelete: UUID[]) => {
78
+ await calibrationRepo.deleteList(docIdsToDelete);
79
+ },
80
+ updateFunction: async (docsToUpdate: WorkoutExerciseCalibration[]) => {
81
+ await calibrationRepo.updateMany(docsToUpdate);
82
+ }
83
+ });
84
+ }
85
+ }
@@ -0,0 +1,9 @@
1
+ import type { WorkoutExercise } from '@aneuhold/core-ts-db-lib';
2
+ import IValidator from '../BaseValidator.js';
3
+ export default class WorkoutExerciseValidator extends IValidator<WorkoutExercise> {
4
+ constructor();
5
+ protected validateNewObjectBusinessLogic(newExercise: WorkoutExercise): Promise<void>;
6
+ protected validateUpdateObjectBusinessLogic(updatedExercise: Partial<WorkoutExercise>): Promise<void>;
7
+ validateRepositoryInDb(dryRun: boolean): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=ExerciseValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExerciseValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/ExerciseValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAQhE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,UAAU,CAAC,eAAe,CAAC;;cAK/D,8BAA8B,CAAC,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;cAgC3E,iCAAiC,CAC/C,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC;IA2CV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA+D7D"}
@@ -0,0 +1,117 @@
1
+ import { WorkoutExerciseSchema } from '@aneuhold/core-ts-db-lib';
2
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
3
+ import UserRepository from '../../repositories/common/UserRepository.js';
4
+ import WorkoutEquipmentTypeRepository from '../../repositories/workout/WorkoutEquipmentTypeRepository.js';
5
+ import WorkoutExerciseRepository from '../../repositories/workout/WorkoutExerciseRepository.js';
6
+ import WorkoutMuscleGroupRepository from '../../repositories/workout/WorkoutMuscleGroupRepository.js';
7
+ import IValidator from '../BaseValidator.js';
8
+ export default class WorkoutExerciseValidator extends IValidator {
9
+ constructor() {
10
+ super(WorkoutExerciseSchema, WorkoutExerciseSchema.partial());
11
+ }
12
+ async validateNewObjectBusinessLogic(newExercise) {
13
+ const errors = [];
14
+ // Collect all muscle group IDs
15
+ const allMuscleGroupIds = [
16
+ ...newExercise.primaryMuscleGroups,
17
+ ...newExercise.secondaryMuscleGroups
18
+ ];
19
+ // Validate muscle groups exist
20
+ if (allMuscleGroupIds.length > 0) {
21
+ const muscleGroupRepo = WorkoutMuscleGroupRepository.getRepo();
22
+ const muscleGroups = await muscleGroupRepo.getList(allMuscleGroupIds);
23
+ if (muscleGroups.length !== allMuscleGroupIds.length) {
24
+ errors.push(`Not all muscle groups exist. Found: ${muscleGroups.length}, expected: ${allMuscleGroupIds.length}`);
25
+ }
26
+ }
27
+ // Validate equipment type exists
28
+ const equipmentRepo = WorkoutEquipmentTypeRepository.getRepo();
29
+ const equipment = await equipmentRepo.get({ _id: newExercise.workoutEquipmentTypeId });
30
+ if (!equipment) {
31
+ errors.push(`Equipment type with ID ${newExercise.workoutEquipmentTypeId} does not exist`);
32
+ }
33
+ if (errors.length > 0) {
34
+ ErrorUtils.throwErrorList(errors, newExercise);
35
+ }
36
+ }
37
+ async validateUpdateObjectBusinessLogic(updatedExercise) {
38
+ const errors = [];
39
+ if (!updatedExercise._id) {
40
+ errors.push('No _id defined for WorkoutExercise update.');
41
+ }
42
+ // Collect all muscle group IDs if being updated
43
+ const allMuscleGroupIds = [];
44
+ if (updatedExercise.primaryMuscleGroups) {
45
+ allMuscleGroupIds.push(...updatedExercise.primaryMuscleGroups);
46
+ }
47
+ if (updatedExercise.secondaryMuscleGroups) {
48
+ allMuscleGroupIds.push(...updatedExercise.secondaryMuscleGroups);
49
+ }
50
+ // Validate muscle groups if being updated
51
+ if (allMuscleGroupIds.length > 0) {
52
+ const muscleGroupRepo = WorkoutMuscleGroupRepository.getRepo();
53
+ const muscleGroups = await muscleGroupRepo.getList(allMuscleGroupIds);
54
+ if (muscleGroups.length !== allMuscleGroupIds.length) {
55
+ errors.push(`Not all muscle groups exist. Found: ${muscleGroups.length}, expected: ${allMuscleGroupIds.length}`);
56
+ }
57
+ }
58
+ // Validate equipment type if being updated
59
+ if (updatedExercise.workoutEquipmentTypeId) {
60
+ const equipmentRepo = WorkoutEquipmentTypeRepository.getRepo();
61
+ const equipment = await equipmentRepo.get({ _id: updatedExercise.workoutEquipmentTypeId });
62
+ if (!equipment) {
63
+ errors.push(`Equipment type with ID ${updatedExercise.workoutEquipmentTypeId} does not exist`);
64
+ }
65
+ }
66
+ if (errors.length > 0) {
67
+ ErrorUtils.throwErrorList(errors, updatedExercise);
68
+ }
69
+ }
70
+ async validateRepositoryInDb(dryRun) {
71
+ const exerciseRepo = WorkoutExerciseRepository.getRepo();
72
+ const allExercises = await exerciseRepo.getAll();
73
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
74
+ const allEquipmentTypeIds = await WorkoutEquipmentTypeRepository.getRepo().getAllIdsAsHash();
75
+ const allMuscleGroupIds = await WorkoutMuscleGroupRepository.getRepo().getAllIdsAsHash();
76
+ await this.runStandardValidationForRepository({
77
+ dryRun,
78
+ docName: 'Workout Exercise',
79
+ allDocs: allExercises,
80
+ shouldDelete: (exercise) => {
81
+ if (!allUserIds[exercise.userId]) {
82
+ DR.logger.error(`Workout Exercise with ID: ${exercise._id} has no valid associated user.`);
83
+ return true;
84
+ }
85
+ return false;
86
+ },
87
+ additionalValidation: (exercise) => {
88
+ const updatedDoc = { ...exercise };
89
+ const errors = [];
90
+ // Check equipment type
91
+ if (!allEquipmentTypeIds[exercise.workoutEquipmentTypeId]) {
92
+ errors.push(`Equipment type with ID: ${exercise.workoutEquipmentTypeId} does not exist.`);
93
+ }
94
+ // Check primary muscle groups
95
+ const invalidPrimaryMuscleGroups = exercise.primaryMuscleGroups.filter((id) => !allMuscleGroupIds[id]);
96
+ if (invalidPrimaryMuscleGroups.length > 0) {
97
+ errors.push(`Invalid primary muscle groups: ${invalidPrimaryMuscleGroups.join(', ')}`);
98
+ updatedDoc.primaryMuscleGroups = exercise.primaryMuscleGroups.filter((id) => allMuscleGroupIds[id]);
99
+ }
100
+ // Check secondary muscle groups
101
+ const invalidSecondaryMuscleGroups = exercise.secondaryMuscleGroups.filter((id) => !allMuscleGroupIds[id]);
102
+ if (invalidSecondaryMuscleGroups.length > 0) {
103
+ errors.push(`Invalid secondary muscle groups: ${invalidSecondaryMuscleGroups.join(', ')}`);
104
+ updatedDoc.secondaryMuscleGroups = exercise.secondaryMuscleGroups.filter((id) => allMuscleGroupIds[id]);
105
+ }
106
+ return { updatedDoc, errors };
107
+ },
108
+ deletionFunction: async (docIdsToDelete) => {
109
+ await exerciseRepo.deleteList(docIdsToDelete);
110
+ },
111
+ updateFunction: async (docsToUpdate) => {
112
+ await exerciseRepo.updateMany(docsToUpdate);
113
+ }
114
+ });
115
+ }
116
+ }
117
+ //# sourceMappingURL=ExerciseValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExerciseValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/ExerciseValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import type { WorkoutExercise } from '@aneuhold/core-ts-db-lib';
2
+ import { WorkoutExerciseSchema } from '@aneuhold/core-ts-db-lib';
3
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
4
+ import type { UUID } from 'crypto';
5
+ import UserRepository from '../../repositories/common/UserRepository.js';
6
+ import WorkoutEquipmentTypeRepository from '../../repositories/workout/WorkoutEquipmentTypeRepository.js';
7
+ import WorkoutExerciseRepository from '../../repositories/workout/WorkoutExerciseRepository.js';
8
+ import WorkoutMuscleGroupRepository from '../../repositories/workout/WorkoutMuscleGroupRepository.js';
9
+ import IValidator from '../BaseValidator.js';
10
+
11
+ export default class WorkoutExerciseValidator extends IValidator<WorkoutExercise> {
12
+ constructor() {
13
+ super(WorkoutExerciseSchema, WorkoutExerciseSchema.partial());
14
+ }
15
+
16
+ protected async validateNewObjectBusinessLogic(newExercise: WorkoutExercise): Promise<void> {
17
+ const errors: string[] = [];
18
+
19
+ // Collect all muscle group IDs
20
+ const allMuscleGroupIds = [
21
+ ...newExercise.primaryMuscleGroups,
22
+ ...newExercise.secondaryMuscleGroups
23
+ ];
24
+
25
+ // Validate muscle groups exist
26
+ if (allMuscleGroupIds.length > 0) {
27
+ const muscleGroupRepo = WorkoutMuscleGroupRepository.getRepo();
28
+ const muscleGroups = await muscleGroupRepo.getList(allMuscleGroupIds);
29
+ if (muscleGroups.length !== allMuscleGroupIds.length) {
30
+ errors.push(
31
+ `Not all muscle groups exist. Found: ${muscleGroups.length}, expected: ${allMuscleGroupIds.length}`
32
+ );
33
+ }
34
+ }
35
+
36
+ // Validate equipment type exists
37
+ const equipmentRepo = WorkoutEquipmentTypeRepository.getRepo();
38
+ const equipment = await equipmentRepo.get({ _id: newExercise.workoutEquipmentTypeId });
39
+ if (!equipment) {
40
+ errors.push(`Equipment type with ID ${newExercise.workoutEquipmentTypeId} does not exist`);
41
+ }
42
+
43
+ if (errors.length > 0) {
44
+ ErrorUtils.throwErrorList(errors, newExercise);
45
+ }
46
+ }
47
+
48
+ protected async validateUpdateObjectBusinessLogic(
49
+ updatedExercise: Partial<WorkoutExercise>
50
+ ): Promise<void> {
51
+ const errors: string[] = [];
52
+
53
+ if (!updatedExercise._id) {
54
+ errors.push('No _id defined for WorkoutExercise update.');
55
+ }
56
+
57
+ // Collect all muscle group IDs if being updated
58
+ const allMuscleGroupIds: UUID[] = [];
59
+ if (updatedExercise.primaryMuscleGroups) {
60
+ allMuscleGroupIds.push(...updatedExercise.primaryMuscleGroups);
61
+ }
62
+ if (updatedExercise.secondaryMuscleGroups) {
63
+ allMuscleGroupIds.push(...updatedExercise.secondaryMuscleGroups);
64
+ }
65
+
66
+ // Validate muscle groups if being updated
67
+ if (allMuscleGroupIds.length > 0) {
68
+ const muscleGroupRepo = WorkoutMuscleGroupRepository.getRepo();
69
+ const muscleGroups = await muscleGroupRepo.getList(allMuscleGroupIds);
70
+ if (muscleGroups.length !== allMuscleGroupIds.length) {
71
+ errors.push(
72
+ `Not all muscle groups exist. Found: ${muscleGroups.length}, expected: ${allMuscleGroupIds.length}`
73
+ );
74
+ }
75
+ }
76
+
77
+ // Validate equipment type if being updated
78
+ if (updatedExercise.workoutEquipmentTypeId) {
79
+ const equipmentRepo = WorkoutEquipmentTypeRepository.getRepo();
80
+ const equipment = await equipmentRepo.get({ _id: updatedExercise.workoutEquipmentTypeId });
81
+ if (!equipment) {
82
+ errors.push(
83
+ `Equipment type with ID ${updatedExercise.workoutEquipmentTypeId} does not exist`
84
+ );
85
+ }
86
+ }
87
+
88
+ if (errors.length > 0) {
89
+ ErrorUtils.throwErrorList(errors, updatedExercise);
90
+ }
91
+ }
92
+
93
+ async validateRepositoryInDb(dryRun: boolean): Promise<void> {
94
+ const exerciseRepo = WorkoutExerciseRepository.getRepo();
95
+ const allExercises = await exerciseRepo.getAll();
96
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
97
+ const allEquipmentTypeIds = await WorkoutEquipmentTypeRepository.getRepo().getAllIdsAsHash();
98
+ const allMuscleGroupIds = await WorkoutMuscleGroupRepository.getRepo().getAllIdsAsHash();
99
+
100
+ await this.runStandardValidationForRepository({
101
+ dryRun,
102
+ docName: 'Workout Exercise',
103
+ allDocs: allExercises,
104
+ shouldDelete: (exercise: WorkoutExercise) => {
105
+ if (!allUserIds[exercise.userId]) {
106
+ DR.logger.error(
107
+ `Workout Exercise with ID: ${exercise._id} has no valid associated user.`
108
+ );
109
+ return true;
110
+ }
111
+ return false;
112
+ },
113
+ additionalValidation: (exercise: WorkoutExercise) => {
114
+ const updatedDoc = { ...exercise };
115
+ const errors: string[] = [];
116
+
117
+ // Check equipment type
118
+ if (!allEquipmentTypeIds[exercise.workoutEquipmentTypeId]) {
119
+ errors.push(`Equipment type with ID: ${exercise.workoutEquipmentTypeId} does not exist.`);
120
+ }
121
+
122
+ // Check primary muscle groups
123
+ const invalidPrimaryMuscleGroups = exercise.primaryMuscleGroups.filter(
124
+ (id) => !allMuscleGroupIds[id]
125
+ );
126
+ if (invalidPrimaryMuscleGroups.length > 0) {
127
+ errors.push(`Invalid primary muscle groups: ${invalidPrimaryMuscleGroups.join(', ')}`);
128
+ updatedDoc.primaryMuscleGroups = exercise.primaryMuscleGroups.filter(
129
+ (id) => allMuscleGroupIds[id]
130
+ );
131
+ }
132
+
133
+ // Check secondary muscle groups
134
+ const invalidSecondaryMuscleGroups = exercise.secondaryMuscleGroups.filter(
135
+ (id) => !allMuscleGroupIds[id]
136
+ );
137
+ if (invalidSecondaryMuscleGroups.length > 0) {
138
+ errors.push(
139
+ `Invalid secondary muscle groups: ${invalidSecondaryMuscleGroups.join(', ')}`
140
+ );
141
+ updatedDoc.secondaryMuscleGroups = exercise.secondaryMuscleGroups.filter(
142
+ (id) => allMuscleGroupIds[id]
143
+ );
144
+ }
145
+
146
+ return { updatedDoc, errors };
147
+ },
148
+ deletionFunction: async (docIdsToDelete: UUID[]) => {
149
+ await exerciseRepo.deleteList(docIdsToDelete);
150
+ },
151
+ updateFunction: async (docsToUpdate: WorkoutExercise[]) => {
152
+ await exerciseRepo.updateMany(docsToUpdate);
153
+ }
154
+ });
155
+ }
156
+ }
@@ -0,0 +1,9 @@
1
+ import type { WorkoutMesocycle } from '@aneuhold/core-ts-db-lib';
2
+ import IValidator from '../BaseValidator.js';
3
+ export default class WorkoutMesocycleValidator extends IValidator<WorkoutMesocycle> {
4
+ constructor();
5
+ protected validateNewObjectBusinessLogic(): Promise<void>;
6
+ protected validateUpdateObjectBusinessLogic(updatedMesocycle: Partial<WorkoutMesocycle>): Promise<void>;
7
+ validateRepositoryInDb(dryRun: boolean): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=MesocycleValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MesocycleValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/MesocycleValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAOjE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,UAAU,CAAC,gBAAgB,CAAC;;IAKjF,SAAS,CAAC,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzD,SAAS,CAAC,iCAAiC,CACzC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC;IAOV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA6C7D"}
@@ -0,0 +1,56 @@
1
+ import { WorkoutMesocycleSchema } from '@aneuhold/core-ts-db-lib';
2
+ import { DR, ErrorUtils } from '@aneuhold/core-ts-lib';
3
+ import UserRepository from '../../repositories/common/UserRepository.js';
4
+ import WorkoutExerciseCalibrationRepository from '../../repositories/workout/WorkoutExerciseCalibrationRepository.js';
5
+ import WorkoutMesocycleRepository from '../../repositories/workout/WorkoutMesocycleRepository.js';
6
+ import IValidator from '../BaseValidator.js';
7
+ export default class WorkoutMesocycleValidator extends IValidator {
8
+ constructor() {
9
+ super(WorkoutMesocycleSchema, WorkoutMesocycleSchema.partial());
10
+ }
11
+ validateNewObjectBusinessLogic() {
12
+ return Promise.resolve();
13
+ }
14
+ validateUpdateObjectBusinessLogic(updatedMesocycle) {
15
+ if (!updatedMesocycle._id) {
16
+ ErrorUtils.throwError('No _id defined for WorkoutMesocycle update.', updatedMesocycle);
17
+ }
18
+ return Promise.resolve();
19
+ }
20
+ async validateRepositoryInDb(dryRun) {
21
+ const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
22
+ const allMesocycles = await mesocycleRepo.getAll();
23
+ const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
24
+ const allCalibrationIds = await WorkoutExerciseCalibrationRepository.getRepo().getAllIdsAsHash();
25
+ await this.runStandardValidationForRepository({
26
+ dryRun,
27
+ docName: 'Workout Mesocycle',
28
+ allDocs: allMesocycles,
29
+ shouldDelete: (mesocycle) => {
30
+ if (!allUserIds[mesocycle.userId]) {
31
+ DR.logger.error(`Workout Mesocycle with ID: ${mesocycle._id} has no valid associated user.`);
32
+ return true;
33
+ }
34
+ return false;
35
+ },
36
+ additionalValidation: (mesocycle) => {
37
+ const updatedDoc = { ...mesocycle };
38
+ const errors = [];
39
+ // Check calibrated exercises
40
+ const invalidCalibrations = mesocycle.calibratedExercises.filter((id) => !allCalibrationIds[id]);
41
+ if (invalidCalibrations.length > 0) {
42
+ errors.push(`Invalid calibrated exercises: ${invalidCalibrations.join(', ')}`);
43
+ updatedDoc.calibratedExercises = mesocycle.calibratedExercises.filter((id) => allCalibrationIds[id]);
44
+ }
45
+ return { updatedDoc, errors };
46
+ },
47
+ deletionFunction: async (docIdsToDelete) => {
48
+ await mesocycleRepo.deleteList(docIdsToDelete);
49
+ },
50
+ updateFunction: async (docsToUpdate) => {
51
+ await mesocycleRepo.updateMany(docsToUpdate);
52
+ }
53
+ });
54
+ }
55
+ }
56
+ //# sourceMappingURL=MesocycleValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MesocycleValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/MesocycleValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,oCAAoC,MAAM,oEAAoE,CAAC;AACtH,OAAO,0BAA0B,MAAM,0DAA0D,CAAC;AAClG,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,UAA4B;IACjF;QACE,KAAK,CAAC,sBAAsB,EAAE,sBAAsB,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAES,8BAA8B;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,iCAAiC,CACzC,gBAA2C;QAE3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC;YAC1B,UAAU,CAAC,UAAU,CAAC,6CAA6C,EAAE,gBAAgB,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAC1C,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,EAAE,CAAC;QAC3D,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QACpE,MAAM,iBAAiB,GACrB,MAAM,oCAAoC,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QAEzE,MAAM,IAAI,CAAC,kCAAkC,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,aAAa;YACtB,YAAY,EAAE,CAAC,SAA2B,EAAE,EAAE;gBAC5C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClC,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,8BAA8B,SAAS,CAAC,GAAG,gCAAgC,CAC5E,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,oBAAoB,EAAE,CAAC,SAA2B,EAAE,EAAE;gBACpD,MAAM,UAAU,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAa,EAAE,CAAC;gBAE5B,6BAA6B;gBAC7B,MAAM,mBAAmB,GAAG,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAC9D,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAC/B,CAAC;gBACF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC/E,UAAU,CAAC,mBAAmB,GAAG,SAAS,CAAC,mBAAmB,CAAC,MAAM,CACnE,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAC9B,CAAC;gBACJ,CAAC;gBAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAChC,CAAC;YACD,gBAAgB,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;gBACjD,MAAM,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACjD,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,YAAgC,EAAE,EAAE;gBACzD,MAAM,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAC/C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}