@aneuhold/be-ts-db-lib 4.1.2 → 4.2.1
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 +29 -0
- package/README.md +1 -0
- package/lib/repositories/BaseRepository.d.ts +8 -1
- package/lib/repositories/BaseRepository.d.ts.map +1 -1
- package/lib/repositories/BaseRepository.js +13 -1
- package/lib/repositories/BaseRepository.js.map +1 -1
- package/lib/repositories/BaseRepository.ts +14 -1
- package/lib/repositories/common/UserRepository.d.ts.map +1 -1
- package/lib/repositories/common/UserRepository.js +12 -0
- package/lib/repositories/common/UserRepository.js.map +1 -1
- package/lib/repositories/common/UserRepository.ts +12 -0
- package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.d.ts +20 -0
- package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.js +36 -4
- package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardBaseWithUserIdRepository.ts +39 -4
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js +2 -12
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaItemRepository.ts +2 -16
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js +2 -12
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardNonogramKatanaUpgradeRepository.ts +2 -16
- package/lib/repositories/dashboard/DashboardTaskRepository.d.ts +14 -0
- package/lib/repositories/dashboard/DashboardTaskRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.js +33 -35
- package/lib/repositories/dashboard/DashboardTaskRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardTaskRepository.ts +41 -45
- package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts +14 -0
- package/lib/repositories/dashboard/DashboardUserConfigRepository.d.ts.map +1 -1
- package/lib/repositories/dashboard/DashboardUserConfigRepository.js +26 -15
- package/lib/repositories/dashboard/DashboardUserConfigRepository.js.map +1 -1
- package/lib/repositories/dashboard/DashboardUserConfigRepository.ts +38 -21
- package/lib/repositories/workout/WorkoutBaseRepository.d.ts +22 -0
- package/lib/repositories/workout/WorkoutBaseRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutBaseRepository.js +53 -0
- package/lib/repositories/workout/WorkoutBaseRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutBaseRepository.ts +85 -0
- package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.d.ts +40 -0
- package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.js +96 -0
- package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutBaseWithUserIdRepository.ts +134 -0
- package/lib/repositories/workout/WorkoutEquipmentTypeRepository.d.ts +17 -0
- package/lib/repositories/workout/WorkoutEquipmentTypeRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutEquipmentTypeRepository.js +34 -0
- package/lib/repositories/workout/WorkoutEquipmentTypeRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutEquipmentTypeRepository.ts +40 -0
- package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.d.ts +31 -0
- package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.js +70 -0
- package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutExerciseCalibrationRepository.ts +84 -0
- package/lib/repositories/workout/WorkoutExerciseRepository.d.ts +14 -0
- package/lib/repositories/workout/WorkoutExerciseRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutExerciseRepository.js +34 -0
- package/lib/repositories/workout/WorkoutExerciseRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutExerciseRepository.ts +40 -0
- package/lib/repositories/workout/WorkoutMesocycleRepository.d.ts +14 -0
- package/lib/repositories/workout/WorkoutMesocycleRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutMesocycleRepository.js +34 -0
- package/lib/repositories/workout/WorkoutMesocycleRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutMesocycleRepository.ts +40 -0
- package/lib/repositories/workout/WorkoutMicrocycleRepository.d.ts +31 -0
- package/lib/repositories/workout/WorkoutMicrocycleRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutMicrocycleRepository.js +72 -0
- package/lib/repositories/workout/WorkoutMicrocycleRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutMicrocycleRepository.ts +86 -0
- package/lib/repositories/workout/WorkoutMuscleGroupRepository.d.ts +20 -0
- package/lib/repositories/workout/WorkoutMuscleGroupRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutMuscleGroupRepository.js +37 -0
- package/lib/repositories/workout/WorkoutMuscleGroupRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutMuscleGroupRepository.ts +43 -0
- package/lib/repositories/workout/WorkoutSessionExerciseRepository.d.ts +31 -0
- package/lib/repositories/workout/WorkoutSessionExerciseRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutSessionExerciseRepository.js +72 -0
- package/lib/repositories/workout/WorkoutSessionExerciseRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutSessionExerciseRepository.ts +86 -0
- package/lib/repositories/workout/WorkoutSessionRepository.d.ts +31 -0
- package/lib/repositories/workout/WorkoutSessionRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutSessionRepository.js +72 -0
- package/lib/repositories/workout/WorkoutSessionRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutSessionRepository.ts +86 -0
- package/lib/repositories/workout/WorkoutSetRepository.d.ts +31 -0
- package/lib/repositories/workout/WorkoutSetRepository.d.ts.map +1 -0
- package/lib/repositories/workout/WorkoutSetRepository.js +69 -0
- package/lib/repositories/workout/WorkoutSetRepository.js.map +1 -0
- package/lib/repositories/workout/WorkoutSetRepository.ts +89 -0
- package/lib/util/DbSchemaUpdater.d.ts.map +1 -1
- package/lib/util/DbSchemaUpdater.js +25 -0
- package/lib/util/DbSchemaUpdater.js.map +1 -1
- package/lib/util/DbSchemaUpdater.ts +27 -0
- package/lib/util/DocumentCleaner.d.ts +2 -1
- package/lib/util/DocumentCleaner.d.ts.map +1 -1
- package/lib/util/DocumentCleaner.js +5 -0
- package/lib/util/DocumentCleaner.js.map +1 -1
- package/lib/util/DocumentCleaner.ts +14 -1
- package/lib/util/globalTestVariables.d.ts +8 -0
- package/lib/util/globalTestVariables.d.ts.map +1 -0
- package/lib/util/globalTestVariables.js +8 -0
- package/lib/util/globalTestVariables.js.map +1 -0
- package/lib/{tests → util}/globalTestVariables.ts +3 -0
- package/lib/validators/common/UserValidator.js +1 -1
- package/lib/validators/common/UserValidator.js.map +1 -1
- package/lib/validators/common/UserValidator.ts +1 -1
- package/lib/validators/workout/EquipmentTypeValidator.d.ts +9 -0
- package/lib/validators/workout/EquipmentTypeValidator.d.ts.map +1 -0
- package/lib/validators/workout/EquipmentTypeValidator.js +43 -0
- package/lib/validators/workout/EquipmentTypeValidator.js.map +1 -0
- package/lib/validators/workout/EquipmentTypeValidator.ts +56 -0
- package/lib/validators/workout/ExerciseCalibrationValidator.d.ts +9 -0
- package/lib/validators/workout/ExerciseCalibrationValidator.d.ts.map +1 -0
- package/lib/validators/workout/ExerciseCalibrationValidator.js +65 -0
- package/lib/validators/workout/ExerciseCalibrationValidator.js.map +1 -0
- package/lib/validators/workout/ExerciseCalibrationValidator.ts +85 -0
- package/lib/validators/workout/ExerciseValidator.d.ts +9 -0
- package/lib/validators/workout/ExerciseValidator.d.ts.map +1 -0
- package/lib/validators/workout/ExerciseValidator.js +117 -0
- package/lib/validators/workout/ExerciseValidator.js.map +1 -0
- package/lib/validators/workout/ExerciseValidator.ts +156 -0
- package/lib/validators/workout/MesocycleValidator.d.ts +9 -0
- package/lib/validators/workout/MesocycleValidator.d.ts.map +1 -0
- package/lib/validators/workout/MesocycleValidator.js +60 -0
- package/lib/validators/workout/MesocycleValidator.js.map +1 -0
- package/lib/validators/workout/MesocycleValidator.ts +79 -0
- package/lib/validators/workout/MicrocycleValidator.d.ts +9 -0
- package/lib/validators/workout/MicrocycleValidator.d.ts.map +1 -0
- package/lib/validators/workout/MicrocycleValidator.js +73 -0
- package/lib/validators/workout/MicrocycleValidator.js.map +1 -0
- package/lib/validators/workout/MicrocycleValidator.ts +91 -0
- package/lib/validators/workout/MuscleGroupValidator.d.ts +9 -0
- package/lib/validators/workout/MuscleGroupValidator.d.ts.map +1 -0
- package/lib/validators/workout/MuscleGroupValidator.js +43 -0
- package/lib/validators/workout/MuscleGroupValidator.js.map +1 -0
- package/lib/validators/workout/MuscleGroupValidator.ts +53 -0
- package/lib/validators/workout/SessionExerciseValidator.d.ts +9 -0
- package/lib/validators/workout/SessionExerciseValidator.d.ts.map +1 -0
- package/lib/validators/workout/SessionExerciseValidator.js +94 -0
- package/lib/validators/workout/SessionExerciseValidator.js.map +1 -0
- package/lib/validators/workout/SessionExerciseValidator.ts +117 -0
- package/lib/validators/workout/SessionValidator.d.ts +9 -0
- package/lib/validators/workout/SessionValidator.d.ts.map +1 -0
- package/lib/validators/workout/SessionValidator.js +73 -0
- package/lib/validators/workout/SessionValidator.js.map +1 -0
- package/lib/validators/workout/SessionValidator.ts +89 -0
- package/lib/validators/workout/SetValidator.d.ts +9 -0
- package/lib/validators/workout/SetValidator.d.ts.map +1 -0
- package/lib/validators/workout/SetValidator.js +69 -0
- package/lib/validators/workout/SetValidator.js.map +1 -0
- package/lib/validators/workout/SetValidator.ts +88 -0
- package/package.json +6 -5
- package/lib/tests/globalTestVariables.d.ts +0 -5
- package/lib/tests/globalTestVariables.d.ts.map +0 -1
- package/lib/tests/globalTestVariables.js +0 -5
- package/lib/tests/globalTestVariables.js.map +0 -1
- package/lib/tests/testsUtil.d.ts +0 -34
- package/lib/tests/testsUtil.d.ts.map +0 -1
- package/lib/tests/testsUtil.js +0 -60
- package/lib/tests/testsUtil.js.map +0 -1
- 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":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,oCAAoC,MAAM,oEAAoE,CAAC;AACtH,OAAO,yBAAyB,MAAM,yDAAyD,CAAC;AAChG,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,mCAAoC,SAAQ,UAAsC;IACrG;QACE,KAAK,CAAC,gCAAgC,EAAE,gCAAgC,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAES,KAAK,CAAC,8BAA8B,CAC5C,cAA0C;QAE1C,oCAAoC;QACpC,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,UAAU,CACnB,oBAAoB,cAAc,CAAC,iBAAiB,iBAAiB,EACrE,cAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAES,KAAK,CAAC,iCAAiC,CAC/C,kBAAuD;QAEvD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;QAED,qCAAqC;QACrC,IAAI,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,kBAAkB,CAAC,iBAAiB,iBAAiB,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAC1C,MAAM,eAAe,GAAG,oCAAoC,CAAC,OAAO,EAAE,CAAC;QACvE,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QACpE,MAAM,cAAc,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QAEnF,MAAM,IAAI,CAAC,kCAAkC,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE,eAAe;YACxB,YAAY,EAAE,CAAC,WAAuC,EAAE,EAAE;gBACxD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,yCAAyC,WAAW,CAAC,GAAG,gCAAgC,CACzF,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACnD,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,yCAAyC,WAAW,CAAC,GAAG,oCAAoC,CAC7F,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,gBAAgB,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;gBACjD,MAAM,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACnD,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,YAA0C,EAAE,EAAE;gBACnE,MAAM,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -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(mesocycle: WorkoutMesocycle): 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,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpF,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,60 @@
|
|
|
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(mesocycle) {
|
|
12
|
+
if (mesocycle.calibratedExercises.length < mesocycle.plannedSessionCountPerMicrocycle) {
|
|
13
|
+
throw new Error('Number of calibrated exercises must be at least equal to planned sessions per microcycle.' +
|
|
14
|
+
' Create a slight variation of an existing exercise if needed.');
|
|
15
|
+
}
|
|
16
|
+
return Promise.resolve();
|
|
17
|
+
}
|
|
18
|
+
validateUpdateObjectBusinessLogic(updatedMesocycle) {
|
|
19
|
+
if (!updatedMesocycle._id) {
|
|
20
|
+
ErrorUtils.throwError('No _id defined for WorkoutMesocycle update.', updatedMesocycle);
|
|
21
|
+
}
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
async validateRepositoryInDb(dryRun) {
|
|
25
|
+
const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
|
|
26
|
+
const allMesocycles = await mesocycleRepo.getAll();
|
|
27
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
28
|
+
const allCalibrationIds = await WorkoutExerciseCalibrationRepository.getRepo().getAllIdsAsHash();
|
|
29
|
+
await this.runStandardValidationForRepository({
|
|
30
|
+
dryRun,
|
|
31
|
+
docName: 'Workout Mesocycle',
|
|
32
|
+
allDocs: allMesocycles,
|
|
33
|
+
shouldDelete: (mesocycle) => {
|
|
34
|
+
if (!allUserIds[mesocycle.userId]) {
|
|
35
|
+
DR.logger.error(`Workout Mesocycle with ID: ${mesocycle._id} has no valid associated user.`);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
},
|
|
40
|
+
additionalValidation: (mesocycle) => {
|
|
41
|
+
const updatedDoc = { ...mesocycle };
|
|
42
|
+
const errors = [];
|
|
43
|
+
// Check calibrated exercises
|
|
44
|
+
const invalidCalibrations = mesocycle.calibratedExercises.filter((id) => !allCalibrationIds[id]);
|
|
45
|
+
if (invalidCalibrations.length > 0) {
|
|
46
|
+
errors.push(`Invalid calibrated exercises: ${invalidCalibrations.join(', ')}`);
|
|
47
|
+
updatedDoc.calibratedExercises = mesocycle.calibratedExercises.filter((id) => allCalibrationIds[id]);
|
|
48
|
+
}
|
|
49
|
+
return { updatedDoc, errors };
|
|
50
|
+
},
|
|
51
|
+
deletionFunction: async (docIdsToDelete) => {
|
|
52
|
+
await mesocycleRepo.deleteList(docIdsToDelete);
|
|
53
|
+
},
|
|
54
|
+
updateFunction: async (docsToUpdate) => {
|
|
55
|
+
await mesocycleRepo.updateMany(docsToUpdate);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=MesocycleValidator.js.map
|