@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.
- package/CHANGELOG.md +18 -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 +56 -0
- package/lib/validators/workout/MesocycleValidator.js.map +1 -0
- package/lib/validators/workout/MesocycleValidator.ts +73 -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,73 @@
|
|
|
1
|
+
import type { WorkoutMesocycle } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import { WorkoutMesocycleSchema } 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 WorkoutMesocycleRepository from '../../repositories/workout/WorkoutMesocycleRepository.js';
|
|
8
|
+
import IValidator from '../BaseValidator.js';
|
|
9
|
+
|
|
10
|
+
export default class WorkoutMesocycleValidator extends IValidator<WorkoutMesocycle> {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(WorkoutMesocycleSchema, WorkoutMesocycleSchema.partial());
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
protected validateNewObjectBusinessLogic(): Promise<void> {
|
|
16
|
+
return Promise.resolve();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected validateUpdateObjectBusinessLogic(
|
|
20
|
+
updatedMesocycle: Partial<WorkoutMesocycle>
|
|
21
|
+
): Promise<void> {
|
|
22
|
+
if (!updatedMesocycle._id) {
|
|
23
|
+
ErrorUtils.throwError('No _id defined for WorkoutMesocycle update.', updatedMesocycle);
|
|
24
|
+
}
|
|
25
|
+
return Promise.resolve();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async validateRepositoryInDb(dryRun: boolean): Promise<void> {
|
|
29
|
+
const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
|
|
30
|
+
const allMesocycles = await mesocycleRepo.getAll();
|
|
31
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
32
|
+
const allCalibrationIds =
|
|
33
|
+
await WorkoutExerciseCalibrationRepository.getRepo().getAllIdsAsHash();
|
|
34
|
+
|
|
35
|
+
await this.runStandardValidationForRepository({
|
|
36
|
+
dryRun,
|
|
37
|
+
docName: 'Workout Mesocycle',
|
|
38
|
+
allDocs: allMesocycles,
|
|
39
|
+
shouldDelete: (mesocycle: WorkoutMesocycle) => {
|
|
40
|
+
if (!allUserIds[mesocycle.userId]) {
|
|
41
|
+
DR.logger.error(
|
|
42
|
+
`Workout Mesocycle with ID: ${mesocycle._id} has no valid associated user.`
|
|
43
|
+
);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
},
|
|
48
|
+
additionalValidation: (mesocycle: WorkoutMesocycle) => {
|
|
49
|
+
const updatedDoc = { ...mesocycle };
|
|
50
|
+
const errors: string[] = [];
|
|
51
|
+
|
|
52
|
+
// Check calibrated exercises
|
|
53
|
+
const invalidCalibrations = mesocycle.calibratedExercises.filter(
|
|
54
|
+
(id) => !allCalibrationIds[id]
|
|
55
|
+
);
|
|
56
|
+
if (invalidCalibrations.length > 0) {
|
|
57
|
+
errors.push(`Invalid calibrated exercises: ${invalidCalibrations.join(', ')}`);
|
|
58
|
+
updatedDoc.calibratedExercises = mesocycle.calibratedExercises.filter(
|
|
59
|
+
(id) => allCalibrationIds[id]
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { updatedDoc, errors };
|
|
64
|
+
},
|
|
65
|
+
deletionFunction: async (docIdsToDelete: UUID[]) => {
|
|
66
|
+
await mesocycleRepo.deleteList(docIdsToDelete);
|
|
67
|
+
},
|
|
68
|
+
updateFunction: async (docsToUpdate: WorkoutMesocycle[]) => {
|
|
69
|
+
await mesocycleRepo.updateMany(docsToUpdate);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkoutMicrocycle } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import IValidator from '../BaseValidator.js';
|
|
3
|
+
export default class WorkoutMicrocycleValidator extends IValidator<WorkoutMicrocycle> {
|
|
4
|
+
constructor();
|
|
5
|
+
protected validateNewObjectBusinessLogic(newMicrocycle: WorkoutMicrocycle): Promise<void>;
|
|
6
|
+
protected validateUpdateObjectBusinessLogic(updatedMicrocycle: Partial<WorkoutMicrocycle>): Promise<void>;
|
|
7
|
+
validateRepositoryInDb(dryRun: boolean): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=MicrocycleValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MicrocycleValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/MicrocycleValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAOlE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,UAAU,CAAC,iBAAiB,CAAC;;cAKnE,8BAA8B,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;cAc/E,iCAAiC,CAC/C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC;IAqBV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAuC7D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { WorkoutMicrocycleSchema } 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 WorkoutMesocycleRepository from '../../repositories/workout/WorkoutMesocycleRepository.js';
|
|
5
|
+
import WorkoutMicrocycleRepository from '../../repositories/workout/WorkoutMicrocycleRepository.js';
|
|
6
|
+
import IValidator from '../BaseValidator.js';
|
|
7
|
+
export default class WorkoutMicrocycleValidator extends IValidator {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(WorkoutMicrocycleSchema, WorkoutMicrocycleSchema.partial());
|
|
10
|
+
}
|
|
11
|
+
async validateNewObjectBusinessLogic(newMicrocycle) {
|
|
12
|
+
// Validate that the mesocycle exists if workoutMesocycleId is provided
|
|
13
|
+
if (newMicrocycle.workoutMesocycleId) {
|
|
14
|
+
const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
|
|
15
|
+
const mesocycle = await mesocycleRepo.get({ _id: newMicrocycle.workoutMesocycleId });
|
|
16
|
+
if (!mesocycle) {
|
|
17
|
+
ErrorUtils.throwError(`Mesocycle with ID ${newMicrocycle.workoutMesocycleId} does not exist`, newMicrocycle);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async validateUpdateObjectBusinessLogic(updatedMicrocycle) {
|
|
22
|
+
const errors = [];
|
|
23
|
+
if (!updatedMicrocycle._id) {
|
|
24
|
+
errors.push('No _id defined for WorkoutMicrocycle update.');
|
|
25
|
+
}
|
|
26
|
+
// Validate mesocycle if being updated
|
|
27
|
+
if (updatedMicrocycle.workoutMesocycleId) {
|
|
28
|
+
const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
|
|
29
|
+
const mesocycle = await mesocycleRepo.get({ _id: updatedMicrocycle.workoutMesocycleId });
|
|
30
|
+
if (!mesocycle) {
|
|
31
|
+
errors.push(`Mesocycle with ID ${updatedMicrocycle.workoutMesocycleId} does not exist`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (errors.length > 0) {
|
|
35
|
+
ErrorUtils.throwErrorList(errors, updatedMicrocycle);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async validateRepositoryInDb(dryRun) {
|
|
39
|
+
const microcycleRepo = WorkoutMicrocycleRepository.getRepo();
|
|
40
|
+
const allMicrocycles = await microcycleRepo.getAll();
|
|
41
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
42
|
+
const allMesocycleIds = await WorkoutMesocycleRepository.getRepo().getAllIdsAsHash();
|
|
43
|
+
await this.runStandardValidationForRepository({
|
|
44
|
+
dryRun,
|
|
45
|
+
docName: 'Workout Microcycle',
|
|
46
|
+
allDocs: allMicrocycles,
|
|
47
|
+
shouldDelete: (microcycle) => {
|
|
48
|
+
if (!allUserIds[microcycle.userId]) {
|
|
49
|
+
DR.logger.error(`Workout Microcycle with ID: ${microcycle._id} has no valid associated user.`);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
},
|
|
54
|
+
additionalValidation: (microcycle) => {
|
|
55
|
+
const updatedDoc = { ...microcycle };
|
|
56
|
+
const errors = [];
|
|
57
|
+
// Check mesocycle if it exists
|
|
58
|
+
if (microcycle.workoutMesocycleId && !allMesocycleIds[microcycle.workoutMesocycleId]) {
|
|
59
|
+
errors.push(`Mesocycle with ID: ${microcycle.workoutMesocycleId} does not exist.`);
|
|
60
|
+
updatedDoc.workoutMesocycleId = null;
|
|
61
|
+
}
|
|
62
|
+
return { updatedDoc, errors };
|
|
63
|
+
},
|
|
64
|
+
deletionFunction: async (docIdsToDelete) => {
|
|
65
|
+
await microcycleRepo.deleteList(docIdsToDelete);
|
|
66
|
+
},
|
|
67
|
+
updateFunction: async (docsToUpdate) => {
|
|
68
|
+
await microcycleRepo.updateMany(docsToUpdate);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=MicrocycleValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MicrocycleValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/MicrocycleValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { WorkoutMicrocycle } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import { WorkoutMicrocycleSchema } 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 WorkoutMesocycleRepository from '../../repositories/workout/WorkoutMesocycleRepository.js';
|
|
7
|
+
import WorkoutMicrocycleRepository from '../../repositories/workout/WorkoutMicrocycleRepository.js';
|
|
8
|
+
import IValidator from '../BaseValidator.js';
|
|
9
|
+
|
|
10
|
+
export default class WorkoutMicrocycleValidator extends IValidator<WorkoutMicrocycle> {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(WorkoutMicrocycleSchema, WorkoutMicrocycleSchema.partial());
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
protected async validateNewObjectBusinessLogic(newMicrocycle: WorkoutMicrocycle): Promise<void> {
|
|
16
|
+
// Validate that the mesocycle exists if workoutMesocycleId is provided
|
|
17
|
+
if (newMicrocycle.workoutMesocycleId) {
|
|
18
|
+
const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
|
|
19
|
+
const mesocycle = await mesocycleRepo.get({ _id: newMicrocycle.workoutMesocycleId });
|
|
20
|
+
if (!mesocycle) {
|
|
21
|
+
ErrorUtils.throwError(
|
|
22
|
+
`Mesocycle with ID ${newMicrocycle.workoutMesocycleId} does not exist`,
|
|
23
|
+
newMicrocycle
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
protected async validateUpdateObjectBusinessLogic(
|
|
30
|
+
updatedMicrocycle: Partial<WorkoutMicrocycle>
|
|
31
|
+
): Promise<void> {
|
|
32
|
+
const errors: string[] = [];
|
|
33
|
+
|
|
34
|
+
if (!updatedMicrocycle._id) {
|
|
35
|
+
errors.push('No _id defined for WorkoutMicrocycle update.');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Validate mesocycle if being updated
|
|
39
|
+
if (updatedMicrocycle.workoutMesocycleId) {
|
|
40
|
+
const mesocycleRepo = WorkoutMesocycleRepository.getRepo();
|
|
41
|
+
const mesocycle = await mesocycleRepo.get({ _id: updatedMicrocycle.workoutMesocycleId });
|
|
42
|
+
if (!mesocycle) {
|
|
43
|
+
errors.push(`Mesocycle with ID ${updatedMicrocycle.workoutMesocycleId} does not exist`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (errors.length > 0) {
|
|
48
|
+
ErrorUtils.throwErrorList(errors, updatedMicrocycle);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async validateRepositoryInDb(dryRun: boolean): Promise<void> {
|
|
53
|
+
const microcycleRepo = WorkoutMicrocycleRepository.getRepo();
|
|
54
|
+
const allMicrocycles = await microcycleRepo.getAll();
|
|
55
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
56
|
+
const allMesocycleIds = await WorkoutMesocycleRepository.getRepo().getAllIdsAsHash();
|
|
57
|
+
|
|
58
|
+
await this.runStandardValidationForRepository({
|
|
59
|
+
dryRun,
|
|
60
|
+
docName: 'Workout Microcycle',
|
|
61
|
+
allDocs: allMicrocycles,
|
|
62
|
+
shouldDelete: (microcycle: WorkoutMicrocycle) => {
|
|
63
|
+
if (!allUserIds[microcycle.userId]) {
|
|
64
|
+
DR.logger.error(
|
|
65
|
+
`Workout Microcycle with ID: ${microcycle._id} has no valid associated user.`
|
|
66
|
+
);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
},
|
|
71
|
+
additionalValidation: (microcycle: WorkoutMicrocycle) => {
|
|
72
|
+
const updatedDoc = { ...microcycle };
|
|
73
|
+
const errors: string[] = [];
|
|
74
|
+
|
|
75
|
+
// Check mesocycle if it exists
|
|
76
|
+
if (microcycle.workoutMesocycleId && !allMesocycleIds[microcycle.workoutMesocycleId]) {
|
|
77
|
+
errors.push(`Mesocycle with ID: ${microcycle.workoutMesocycleId} does not exist.`);
|
|
78
|
+
updatedDoc.workoutMesocycleId = null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return { updatedDoc, errors };
|
|
82
|
+
},
|
|
83
|
+
deletionFunction: async (docIdsToDelete: UUID[]) => {
|
|
84
|
+
await microcycleRepo.deleteList(docIdsToDelete);
|
|
85
|
+
},
|
|
86
|
+
updateFunction: async (docsToUpdate: WorkoutMicrocycle[]) => {
|
|
87
|
+
await microcycleRepo.updateMany(docsToUpdate);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkoutMuscleGroup } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import IValidator from '../BaseValidator.js';
|
|
3
|
+
export default class WorkoutMuscleGroupValidator extends IValidator<WorkoutMuscleGroup> {
|
|
4
|
+
constructor();
|
|
5
|
+
protected validateNewObjectBusinessLogic(): Promise<void>;
|
|
6
|
+
protected validateUpdateObjectBusinessLogic(updatedMuscleGroup: Partial<WorkoutMuscleGroup>): Promise<void>;
|
|
7
|
+
validateRepositoryInDb(dryRun: boolean): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=MuscleGroupValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MuscleGroupValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/MuscleGroupValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAMnE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,UAAU,CAAC,kBAAkB,CAAC;;IAKrF,SAAS,CAAC,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzD,SAAS,CAAC,iCAAiC,CACzC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAC9C,OAAO,CAAC,IAAI,CAAC;IAOV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B7D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { WorkoutMuscleGroupSchema } 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 WorkoutMuscleGroupRepository from '../../repositories/workout/WorkoutMuscleGroupRepository.js';
|
|
5
|
+
import IValidator from '../BaseValidator.js';
|
|
6
|
+
export default class WorkoutMuscleGroupValidator extends IValidator {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(WorkoutMuscleGroupSchema, WorkoutMuscleGroupSchema.partial());
|
|
9
|
+
}
|
|
10
|
+
validateNewObjectBusinessLogic() {
|
|
11
|
+
return Promise.resolve();
|
|
12
|
+
}
|
|
13
|
+
validateUpdateObjectBusinessLogic(updatedMuscleGroup) {
|
|
14
|
+
if (!updatedMuscleGroup._id) {
|
|
15
|
+
ErrorUtils.throwError('No _id defined for WorkoutMuscleGroup update.', updatedMuscleGroup);
|
|
16
|
+
}
|
|
17
|
+
return Promise.resolve();
|
|
18
|
+
}
|
|
19
|
+
async validateRepositoryInDb(dryRun) {
|
|
20
|
+
const muscleGroupRepo = WorkoutMuscleGroupRepository.getRepo();
|
|
21
|
+
const allMuscleGroups = await muscleGroupRepo.getAll();
|
|
22
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
23
|
+
await this.runStandardValidationForRepository({
|
|
24
|
+
dryRun,
|
|
25
|
+
docName: 'Workout Muscle Group',
|
|
26
|
+
allDocs: allMuscleGroups,
|
|
27
|
+
shouldDelete: (muscleGroup) => {
|
|
28
|
+
if (!allUserIds[muscleGroup.userId]) {
|
|
29
|
+
DR.logger.error(`Workout Muscle Group with ID: ${muscleGroup._id} has no valid associated user.`);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
},
|
|
34
|
+
deletionFunction: async (docIdsToDelete) => {
|
|
35
|
+
await muscleGroupRepo.deleteList(docIdsToDelete);
|
|
36
|
+
},
|
|
37
|
+
updateFunction: async (docsToUpdate) => {
|
|
38
|
+
await muscleGroupRepo.updateMany(docsToUpdate);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=MuscleGroupValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MuscleGroupValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/MuscleGroupValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,4BAA4B,MAAM,4DAA4D,CAAC;AACtG,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,UAA8B;IACrF;QACE,KAAK,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAES,8BAA8B;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,iCAAiC,CACzC,kBAA+C;QAE/C,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;YAC5B,UAAU,CAAC,UAAU,CAAC,+CAA+C,EAAE,kBAAkB,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAC1C,MAAM,eAAe,GAAG,4BAA4B,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QAEpE,MAAM,IAAI,CAAC,kCAAkC,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,eAAe;YACxB,YAAY,EAAE,CAAC,WAA+B,EAAE,EAAE;gBAChD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,iCAAiC,WAAW,CAAC,GAAG,gCAAgC,CACjF,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,YAAkC,EAAE,EAAE;gBAC3D,MAAM,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { WorkoutMuscleGroup } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import { WorkoutMuscleGroupSchema } 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 WorkoutMuscleGroupRepository from '../../repositories/workout/WorkoutMuscleGroupRepository.js';
|
|
7
|
+
import IValidator from '../BaseValidator.js';
|
|
8
|
+
|
|
9
|
+
export default class WorkoutMuscleGroupValidator extends IValidator<WorkoutMuscleGroup> {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(WorkoutMuscleGroupSchema, WorkoutMuscleGroupSchema.partial());
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
protected validateNewObjectBusinessLogic(): Promise<void> {
|
|
15
|
+
return Promise.resolve();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected validateUpdateObjectBusinessLogic(
|
|
19
|
+
updatedMuscleGroup: Partial<WorkoutMuscleGroup>
|
|
20
|
+
): Promise<void> {
|
|
21
|
+
if (!updatedMuscleGroup._id) {
|
|
22
|
+
ErrorUtils.throwError('No _id defined for WorkoutMuscleGroup update.', updatedMuscleGroup);
|
|
23
|
+
}
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async validateRepositoryInDb(dryRun: boolean): Promise<void> {
|
|
28
|
+
const muscleGroupRepo = WorkoutMuscleGroupRepository.getRepo();
|
|
29
|
+
const allMuscleGroups = await muscleGroupRepo.getAll();
|
|
30
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
31
|
+
|
|
32
|
+
await this.runStandardValidationForRepository({
|
|
33
|
+
dryRun,
|
|
34
|
+
docName: 'Workout Muscle Group',
|
|
35
|
+
allDocs: allMuscleGroups,
|
|
36
|
+
shouldDelete: (muscleGroup: WorkoutMuscleGroup) => {
|
|
37
|
+
if (!allUserIds[muscleGroup.userId]) {
|
|
38
|
+
DR.logger.error(
|
|
39
|
+
`Workout Muscle Group with ID: ${muscleGroup._id} has no valid associated user.`
|
|
40
|
+
);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
},
|
|
45
|
+
deletionFunction: async (docIdsToDelete: UUID[]) => {
|
|
46
|
+
await muscleGroupRepo.deleteList(docIdsToDelete);
|
|
47
|
+
},
|
|
48
|
+
updateFunction: async (docsToUpdate: WorkoutMuscleGroup[]) => {
|
|
49
|
+
await muscleGroupRepo.updateMany(docsToUpdate);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkoutSessionExercise } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import IValidator from '../BaseValidator.js';
|
|
3
|
+
export default class WorkoutSessionExerciseValidator extends IValidator<WorkoutSessionExercise> {
|
|
4
|
+
constructor();
|
|
5
|
+
protected validateNewObjectBusinessLogic(newSessionExercise: WorkoutSessionExercise): Promise<void>;
|
|
6
|
+
protected validateUpdateObjectBusinessLogic(updatedSessionExercise: Partial<WorkoutSessionExercise>): Promise<void>;
|
|
7
|
+
validateRepositoryInDb(dryRun: boolean): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=SessionExerciseValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionExerciseValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/SessionExerciseValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAQvE,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,UAAU,CAAC,sBAAsB,CAAC;;cAK7E,8BAA8B,CAC5C,kBAAkB,EAAE,sBAAsB,GACzC,OAAO,CAAC,IAAI,CAAC;cAsBA,iCAAiC,CAC/C,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACtD,OAAO,CAAC,IAAI,CAAC;IA8BV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA6C7D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { WorkoutSessionExerciseSchema } 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 WorkoutExerciseRepository from '../../repositories/workout/WorkoutExerciseRepository.js';
|
|
5
|
+
import WorkoutSessionExerciseRepository from '../../repositories/workout/WorkoutSessionExerciseRepository.js';
|
|
6
|
+
import WorkoutSessionRepository from '../../repositories/workout/WorkoutSessionRepository.js';
|
|
7
|
+
import IValidator from '../BaseValidator.js';
|
|
8
|
+
export default class WorkoutSessionExerciseValidator extends IValidator {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(WorkoutSessionExerciseSchema, WorkoutSessionExerciseSchema.partial());
|
|
11
|
+
}
|
|
12
|
+
async validateNewObjectBusinessLogic(newSessionExercise) {
|
|
13
|
+
const errors = [];
|
|
14
|
+
// Validate that the session exists
|
|
15
|
+
const sessionRepo = WorkoutSessionRepository.getRepo();
|
|
16
|
+
const session = await sessionRepo.get({ _id: newSessionExercise.workoutSessionId });
|
|
17
|
+
if (!session) {
|
|
18
|
+
errors.push(`Session with ID ${newSessionExercise.workoutSessionId} does not exist`);
|
|
19
|
+
}
|
|
20
|
+
// Validate that the exercise exists
|
|
21
|
+
const exerciseRepo = WorkoutExerciseRepository.getRepo();
|
|
22
|
+
const exercise = await exerciseRepo.get({ _id: newSessionExercise.workoutExerciseId });
|
|
23
|
+
if (!exercise) {
|
|
24
|
+
errors.push(`Exercise with ID ${newSessionExercise.workoutExerciseId} does not exist`);
|
|
25
|
+
}
|
|
26
|
+
if (errors.length > 0) {
|
|
27
|
+
ErrorUtils.throwErrorList(errors, newSessionExercise);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async validateUpdateObjectBusinessLogic(updatedSessionExercise) {
|
|
31
|
+
const errors = [];
|
|
32
|
+
if (!updatedSessionExercise._id) {
|
|
33
|
+
errors.push('No _id defined for WorkoutSessionExercise update.');
|
|
34
|
+
}
|
|
35
|
+
// Validate session if being updated
|
|
36
|
+
if (updatedSessionExercise.workoutSessionId) {
|
|
37
|
+
const sessionRepo = WorkoutSessionRepository.getRepo();
|
|
38
|
+
const session = await sessionRepo.get({ _id: updatedSessionExercise.workoutSessionId });
|
|
39
|
+
if (!session) {
|
|
40
|
+
errors.push(`Session with ID ${updatedSessionExercise.workoutSessionId} does not exist`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Validate exercise if being updated
|
|
44
|
+
if (updatedSessionExercise.workoutExerciseId) {
|
|
45
|
+
const exerciseRepo = WorkoutExerciseRepository.getRepo();
|
|
46
|
+
const exercise = await exerciseRepo.get({ _id: updatedSessionExercise.workoutExerciseId });
|
|
47
|
+
if (!exercise) {
|
|
48
|
+
errors.push(`Exercise with ID ${updatedSessionExercise.workoutExerciseId} does not exist`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (errors.length > 0) {
|
|
52
|
+
ErrorUtils.throwErrorList(errors, updatedSessionExercise);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async validateRepositoryInDb(dryRun) {
|
|
56
|
+
const sessionExerciseRepo = WorkoutSessionExerciseRepository.getRepo();
|
|
57
|
+
const allSessionExercises = await sessionExerciseRepo.getAll();
|
|
58
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
59
|
+
const allSessionIds = await WorkoutSessionRepository.getRepo().getAllIdsAsHash();
|
|
60
|
+
const allExerciseIds = await WorkoutExerciseRepository.getRepo().getAllIdsAsHash();
|
|
61
|
+
await this.runStandardValidationForRepository({
|
|
62
|
+
dryRun,
|
|
63
|
+
docName: 'Workout Session Exercise',
|
|
64
|
+
allDocs: allSessionExercises,
|
|
65
|
+
shouldDelete: (sessionExercise) => {
|
|
66
|
+
if (!allUserIds[sessionExercise.userId]) {
|
|
67
|
+
DR.logger.error(`Workout Session Exercise with ID: ${sessionExercise._id} has no valid associated user.`);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (!allSessionIds[sessionExercise.workoutSessionId]) {
|
|
71
|
+
DR.logger.error(`Workout Session Exercise with ID: ${sessionExercise._id} has no valid associated session.`);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
},
|
|
76
|
+
additionalValidation: (sessionExercise) => {
|
|
77
|
+
const updatedDoc = { ...sessionExercise };
|
|
78
|
+
const errors = [];
|
|
79
|
+
// Check exercise
|
|
80
|
+
if (!allExerciseIds[sessionExercise.workoutExerciseId]) {
|
|
81
|
+
errors.push(`Exercise with ID: ${sessionExercise.workoutExerciseId} does not exist.`);
|
|
82
|
+
}
|
|
83
|
+
return { updatedDoc, errors };
|
|
84
|
+
},
|
|
85
|
+
deletionFunction: async (docIdsToDelete) => {
|
|
86
|
+
await sessionExerciseRepo.deleteList(docIdsToDelete);
|
|
87
|
+
},
|
|
88
|
+
updateFunction: async (docsToUpdate) => {
|
|
89
|
+
await sessionExerciseRepo.updateMany(docsToUpdate);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=SessionExerciseValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionExerciseValidator.js","sourceRoot":"","sources":["../../../src/validators/workout/SessionExerciseValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,cAAc,MAAM,6CAA6C,CAAC;AACzE,OAAO,yBAAyB,MAAM,yDAAyD,CAAC;AAChG,OAAO,gCAAgC,MAAM,gEAAgE,CAAC;AAC9G,OAAO,wBAAwB,MAAM,wDAAwD,CAAC;AAC9F,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,UAAkC;IAC7F;QACE,KAAK,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAES,KAAK,CAAC,8BAA8B,CAC5C,kBAA0C;QAE1C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,mCAAmC;QACnC,MAAM,WAAW,GAAG,wBAAwB,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,mBAAmB,kBAAkB,CAAC,gBAAgB,iBAAiB,CAAC,CAAC;QACvF,CAAC;QAED,oCAAoC;QACpC,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,kBAAkB,CAAC,iBAAiB,iBAAiB,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAES,KAAK,CAAC,iCAAiC,CAC/C,sBAAuD;QAEvD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACnE,CAAC;QAED,oCAAoC;QACpC,IAAI,sBAAsB,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,wBAAwB,CAAC,OAAO,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,sBAAsB,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACxF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,mBAAmB,sBAAsB,CAAC,gBAAgB,iBAAiB,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,sBAAsB,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,sBAAsB,CAAC,iBAAiB,EAAE,CAAC,CAAC;YAC3F,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,oBAAoB,sBAAsB,CAAC,iBAAiB,iBAAiB,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAC1C,MAAM,mBAAmB,GAAG,gCAAgC,CAAC,OAAO,EAAE,CAAC;QACvE,MAAM,mBAAmB,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QACpE,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QACjF,MAAM,cAAc,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;QAEnF,MAAM,IAAI,CAAC,kCAAkC,CAAC;YAC5C,MAAM;YACN,OAAO,EAAE,0BAA0B;YACnC,OAAO,EAAE,mBAAmB;YAC5B,YAAY,EAAE,CAAC,eAAuC,EAAE,EAAE;gBACxD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxC,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,qCAAqC,eAAe,CAAC,GAAG,gCAAgC,CACzF,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACrD,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,qCAAqC,eAAe,CAAC,GAAG,mCAAmC,CAC5F,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,oBAAoB,EAAE,CAAC,eAAuC,EAAE,EAAE;gBAChE,MAAM,UAAU,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;gBAE5B,iBAAiB;gBACjB,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACvD,MAAM,CAAC,IAAI,CAAC,qBAAqB,eAAe,CAAC,iBAAiB,kBAAkB,CAAC,CAAC;gBACxF,CAAC;gBAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAChC,CAAC;YACD,gBAAgB,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;gBACjD,MAAM,mBAAmB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACvD,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,YAAsC,EAAE,EAAE;gBAC/D,MAAM,mBAAmB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACrD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { WorkoutSessionExercise } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import { WorkoutSessionExerciseSchema } 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 WorkoutExerciseRepository from '../../repositories/workout/WorkoutExerciseRepository.js';
|
|
7
|
+
import WorkoutSessionExerciseRepository from '../../repositories/workout/WorkoutSessionExerciseRepository.js';
|
|
8
|
+
import WorkoutSessionRepository from '../../repositories/workout/WorkoutSessionRepository.js';
|
|
9
|
+
import IValidator from '../BaseValidator.js';
|
|
10
|
+
|
|
11
|
+
export default class WorkoutSessionExerciseValidator extends IValidator<WorkoutSessionExercise> {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(WorkoutSessionExerciseSchema, WorkoutSessionExerciseSchema.partial());
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
protected async validateNewObjectBusinessLogic(
|
|
17
|
+
newSessionExercise: WorkoutSessionExercise
|
|
18
|
+
): Promise<void> {
|
|
19
|
+
const errors: string[] = [];
|
|
20
|
+
|
|
21
|
+
// Validate that the session exists
|
|
22
|
+
const sessionRepo = WorkoutSessionRepository.getRepo();
|
|
23
|
+
const session = await sessionRepo.get({ _id: newSessionExercise.workoutSessionId });
|
|
24
|
+
if (!session) {
|
|
25
|
+
errors.push(`Session with ID ${newSessionExercise.workoutSessionId} does not exist`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Validate that the exercise exists
|
|
29
|
+
const exerciseRepo = WorkoutExerciseRepository.getRepo();
|
|
30
|
+
const exercise = await exerciseRepo.get({ _id: newSessionExercise.workoutExerciseId });
|
|
31
|
+
if (!exercise) {
|
|
32
|
+
errors.push(`Exercise with ID ${newSessionExercise.workoutExerciseId} does not exist`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (errors.length > 0) {
|
|
36
|
+
ErrorUtils.throwErrorList(errors, newSessionExercise);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected async validateUpdateObjectBusinessLogic(
|
|
41
|
+
updatedSessionExercise: Partial<WorkoutSessionExercise>
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
const errors: string[] = [];
|
|
44
|
+
|
|
45
|
+
if (!updatedSessionExercise._id) {
|
|
46
|
+
errors.push('No _id defined for WorkoutSessionExercise update.');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Validate session if being updated
|
|
50
|
+
if (updatedSessionExercise.workoutSessionId) {
|
|
51
|
+
const sessionRepo = WorkoutSessionRepository.getRepo();
|
|
52
|
+
const session = await sessionRepo.get({ _id: updatedSessionExercise.workoutSessionId });
|
|
53
|
+
if (!session) {
|
|
54
|
+
errors.push(`Session with ID ${updatedSessionExercise.workoutSessionId} does not exist`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Validate exercise if being updated
|
|
59
|
+
if (updatedSessionExercise.workoutExerciseId) {
|
|
60
|
+
const exerciseRepo = WorkoutExerciseRepository.getRepo();
|
|
61
|
+
const exercise = await exerciseRepo.get({ _id: updatedSessionExercise.workoutExerciseId });
|
|
62
|
+
if (!exercise) {
|
|
63
|
+
errors.push(`Exercise with ID ${updatedSessionExercise.workoutExerciseId} does not exist`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (errors.length > 0) {
|
|
68
|
+
ErrorUtils.throwErrorList(errors, updatedSessionExercise);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async validateRepositoryInDb(dryRun: boolean): Promise<void> {
|
|
73
|
+
const sessionExerciseRepo = WorkoutSessionExerciseRepository.getRepo();
|
|
74
|
+
const allSessionExercises = await sessionExerciseRepo.getAll();
|
|
75
|
+
const allUserIds = await UserRepository.getRepo().getAllIdsAsHash();
|
|
76
|
+
const allSessionIds = await WorkoutSessionRepository.getRepo().getAllIdsAsHash();
|
|
77
|
+
const allExerciseIds = await WorkoutExerciseRepository.getRepo().getAllIdsAsHash();
|
|
78
|
+
|
|
79
|
+
await this.runStandardValidationForRepository({
|
|
80
|
+
dryRun,
|
|
81
|
+
docName: 'Workout Session Exercise',
|
|
82
|
+
allDocs: allSessionExercises,
|
|
83
|
+
shouldDelete: (sessionExercise: WorkoutSessionExercise) => {
|
|
84
|
+
if (!allUserIds[sessionExercise.userId]) {
|
|
85
|
+
DR.logger.error(
|
|
86
|
+
`Workout Session Exercise with ID: ${sessionExercise._id} has no valid associated user.`
|
|
87
|
+
);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (!allSessionIds[sessionExercise.workoutSessionId]) {
|
|
91
|
+
DR.logger.error(
|
|
92
|
+
`Workout Session Exercise with ID: ${sessionExercise._id} has no valid associated session.`
|
|
93
|
+
);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
},
|
|
98
|
+
additionalValidation: (sessionExercise: WorkoutSessionExercise) => {
|
|
99
|
+
const updatedDoc = { ...sessionExercise };
|
|
100
|
+
const errors: string[] = [];
|
|
101
|
+
|
|
102
|
+
// Check exercise
|
|
103
|
+
if (!allExerciseIds[sessionExercise.workoutExerciseId]) {
|
|
104
|
+
errors.push(`Exercise with ID: ${sessionExercise.workoutExerciseId} does not exist.`);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return { updatedDoc, errors };
|
|
108
|
+
},
|
|
109
|
+
deletionFunction: async (docIdsToDelete: UUID[]) => {
|
|
110
|
+
await sessionExerciseRepo.deleteList(docIdsToDelete);
|
|
111
|
+
},
|
|
112
|
+
updateFunction: async (docsToUpdate: WorkoutSessionExercise[]) => {
|
|
113
|
+
await sessionExerciseRepo.updateMany(docsToUpdate);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WorkoutSession } from '@aneuhold/core-ts-db-lib';
|
|
2
|
+
import IValidator from '../BaseValidator.js';
|
|
3
|
+
export default class WorkoutSessionValidator extends IValidator<WorkoutSession> {
|
|
4
|
+
constructor();
|
|
5
|
+
protected validateNewObjectBusinessLogic(newSession: WorkoutSession): Promise<void>;
|
|
6
|
+
protected validateUpdateObjectBusinessLogic(updatedSession: Partial<WorkoutSession>): Promise<void>;
|
|
7
|
+
validateRepositoryInDb(dryRun: boolean): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=SessionValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionValidator.d.ts","sourceRoot":"","sources":["../../../src/validators/workout/SessionValidator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO/D,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,UAAU,CAAC,cAAc,CAAC;;cAK7D,8BAA8B,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cAczE,iCAAiC,CAC/C,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAqBV,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAqC7D"}
|