Skip to content

Commit

Permalink
create and view workouts WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
Felioh committed Apr 17, 2024
1 parent 0588551 commit a1d485b
Showing 20 changed files with 375 additions and 129 deletions.
37 changes: 27 additions & 10 deletions apps/gateway/src/workouts.controller.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import { Body, Controller, Get, Inject, Post, Query } from '@nestjs/common';
import {
Body,
Controller,
Get,
Inject,
Param,
Post,
Query,
} from '@nestjs/common';
import { GatewayService } from './gateway.service';
import { ClientProxy } from '@nestjs/microservices';
import { Public } from '@app/common/lib/auth.guard';
import { CreateExcerciseDto } from 'apps/workouts/src/dto/create-excercise.dto';
import { CreateExerciseDto } from 'apps/workouts/src/dto/create-exercise.dto';
import { CreateWorkoutDto } from 'apps/workouts/src/dto/create-workout.dto';
import { CreateWorkoutLogDto } from 'apps/workouts/src/dto/create-workout-log.dto';
import { ObjectId } from 'mongoose';
import { ValidateObjectIdPipe } from '@app/common/lib/validate-objectid-pipe';

@Public() //TODO: Remove this line to make this endpoint private
@Controller('workouts')
@@ -14,24 +24,24 @@ export class WorkoutsController {
@Inject('WORKOUTS_SERVICE') private readonly workoutsClient: ClientProxy,
) {}

@Post('create-excercise')
async createExcercise(
@Body() createExcerciseDto: CreateExcerciseDto,
@Post('create-exercise')
async createExercise(
@Body() createExerciseDto: CreateExerciseDto,
): Promise<any> {
return this.workoutsClient.send(
{ cmd: 'createExcercise' },
createExcerciseDto,
{ cmd: 'createExercise' },
createExerciseDto,
);
}

@Get('excercises')
async getExcercises(
@Get('exercises')
async getExercises(
@Query('page') page: number = 1,
@Query('limit') limit: number = 10,
@Query('filter') filter: string = '',
): Promise<any> {
return this.workoutsClient.send(
{ cmd: 'getExcercises' },
{ cmd: 'getExercises' },
{ page, limit, filter },
);
}
@@ -55,6 +65,13 @@ export class WorkoutsController {
);
}

@Get('workout/:id')
async getWorkoutById(
@Param('id', new ValidateObjectIdPipe()) id: ObjectId,
): Promise<any> {
return this.workoutsClient.send({ cmd: 'getWorkoutById' }, id);
}

@Post('save-workout')
async saveWorkout(@Body() workout: CreateWorkoutLogDto): Promise<any> {
return this.workoutsClient.send({ cmd: 'saveWorkout' }, workout);
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { IsString } from 'class-validator';

export class CreateExcerciseDto {
export class CreateExerciseDto {
@IsString()
name: string;
}
2 changes: 1 addition & 1 deletion apps/workouts/src/dto/create-workout.dto.ts
Original file line number Diff line number Diff line change
@@ -18,5 +18,5 @@ export class CreateWorkoutDto {

@ValidateNested({ each: true })
@Type(() => WorkoutExerciseDto)
excercises: WorkoutExerciseDto[];
exercises: WorkoutExerciseDto[];
}
12 changes: 0 additions & 12 deletions apps/workouts/src/entities/excercise.schema.ts

This file was deleted.

12 changes: 12 additions & 0 deletions apps/workouts/src/entities/exercise.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument } from 'mongoose';

export type ExerciseDocument = HydratedDocument<Exercise>;

@Schema()
export class Exercise {
@Prop()
name: string;
}

export const ExerciseSchema = SchemaFactory.createForClass(Exercise);
6 changes: 3 additions & 3 deletions apps/workouts/src/entities/workout-log-schema.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument, Types } from 'mongoose';
import { Excercise } from './excercise.schema';
import { Exercise } from './exercise.schema';
import { Workout } from './workout.schema';

export type WorkoutLogDocument = HydratedDocument<WorkoutLog>;
@@ -16,15 +16,15 @@ export class WorkoutLog {
@Prop({
type: [
{
excercise: { type: Types.ObjectId, ref: 'Excercise' },
exercise: { type: Types.ObjectId, ref: 'Exercise' },
sets: Number,
reps: Number,
weight: Number,
},
],
})
exercises: {
exercise: Types.ObjectId | Excercise;
exercise: Types.ObjectId | Exercise;
sets: number;
reps: number;
weight: number;
8 changes: 4 additions & 4 deletions apps/workouts/src/entities/workout.schema.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { HydratedDocument, Types } from 'mongoose';
import { Excercise } from './excercise.schema';
import { Exercise } from './exercise.schema';

export type WorkoutDocument = HydratedDocument<Workout>;

@@ -12,14 +12,14 @@ export class Workout {
@Prop({
type: [
{
excercise: { type: Types.ObjectId, ref: 'Excercise' },
exercise: { type: Types.ObjectId, ref: 'Exercise' },
sets: Number,
reps: Number,
},
],
})
excercises: {
excercise: Types.ObjectId | Excercise;
exercises: {
exercise: Types.ObjectId | Exercise;
sets: number;
reps: number;
}[];
27 changes: 16 additions & 11 deletions apps/workouts/src/workouts.controller.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Controller } from '@nestjs/common';
import { WorkoutsService } from './workouts.service';
import { MessagePattern } from '@nestjs/microservices';
import { CreateExcerciseDto } from './dto/create-excercise.dto';
import { Excercise } from './entities/excercise.schema';
import { CreateExerciseDto } from './dto/create-exercise.dto';
import { Exercise } from './entities/exercise.schema';
import { PaginatedResult } from '@app/common/lib/paginated-result';
import { CreateWorkoutDto } from './dto/create-workout.dto';
import { Workout } from './entities/workout.schema';
@@ -13,22 +13,22 @@ import { CreateWorkoutLogDto } from './dto/create-workout-log.dto';
export class WorkoutsController {
constructor(private readonly workoutsService: WorkoutsService) {}

@MessagePattern({ cmd: 'createExcercise' })
async createExcercise(
createExcerciseDto: CreateExcerciseDto,
): Promise<Excercise> {
@MessagePattern({ cmd: 'createExercise' })
async createExercise(
createExerciseDto: CreateExerciseDto,
): Promise<Exercise> {
return this.workoutsService
.createExcercise(createExcerciseDto)
.createExercise(createExerciseDto)
.then((result) => result);
}

@MessagePattern({ cmd: 'getExcercises' })
async getExcercises({
@MessagePattern({ cmd: 'getExercises' })
async getExercises({
page,
limit,
filter,
}): Promise<PaginatedResult<Excercise>> {
return this.workoutsService.getExcercises({ page, limit, filter });
}): Promise<PaginatedResult<Exercise>> {
return this.workoutsService.getExercises({ page, limit, filter });
}

@MessagePattern({ cmd: 'createWorkout' })
@@ -45,6 +45,11 @@ export class WorkoutsController {
return this.workoutsService.getWorkouts({ page, limit, filter });
}

@MessagePattern({ cmd: 'getWorkoutById' })
async getWorkoutById(id: string): Promise<Workout> {
return this.workoutsService.getWorkoutById(id);
}

@MessagePattern({ cmd: 'saveWorkout' })
async saveWorkout(workout: CreateWorkoutLogDto): Promise<WorkoutLog> {
return this.workoutsService.saveWorkout(workout);
4 changes: 2 additions & 2 deletions apps/workouts/src/workouts.module.ts
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ import { WorkoutsController } from './workouts.controller';
import { WorkoutsService } from './workouts.service';
import { MongooseModule } from '@nestjs/mongoose';
import { WorkoutSchema } from './entities/workout.schema';
import { ExcerciseSchema } from './entities/excercise.schema';
import { ExerciseSchema } from './entities/exercise.schema';
import { WorkoutLogSchema } from './entities/workout-log-schema';

@Module({
@@ -13,7 +13,7 @@ import { WorkoutLogSchema } from './entities/workout-log-schema';
),
MongooseModule.forFeature([
{ name: 'Workout', schema: WorkoutSchema },
{ name: 'Excercise', schema: ExcerciseSchema },
{ name: 'Exercise', schema: ExerciseSchema },
{ name: 'WorkoutLog', schema: WorkoutLogSchema },
]),
],
56 changes: 34 additions & 22 deletions apps/workouts/src/workouts.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Injectable } from '@nestjs/common';
import { CreateExcerciseDto } from './dto/create-excercise.dto';
import { Injectable, NotFoundException } from '@nestjs/common';
import { CreateExerciseDto } from './dto/create-exercise.dto';
import { InjectModel } from '@nestjs/mongoose';
import { Excercise, ExcerciseDocument } from './entities/excercise.schema';
import { Exercise, ExerciseDocument } from './entities/exercise.schema';
import { Model } from 'mongoose';
import { RpcException } from '@nestjs/microservices';
import { PaginatedResult } from '@app/common/lib/paginated-result';
@@ -13,36 +13,36 @@ import { CreateWorkoutLogDto } from './dto/create-workout-log.dto';
@Injectable()
export class WorkoutsService {
constructor(
@InjectModel(Excercise.name)
private excerciseModel: Model<ExcerciseDocument>,
@InjectModel(Exercise.name)
private exerciseModel: Model<ExerciseDocument>,
@InjectModel(Workout.name)
private workoutModel: Model<WorkoutDocument>,
@InjectModel(WorkoutLog.name)
private workoutLogModel: Model<WorkoutLogDocument>,
) {}
async createExcercise(createExcerciseDto: CreateExcerciseDto): Promise<any> {
const createdExcercise = new this.excerciseModel(createExcerciseDto);
async createExercise(createExerciseDto: CreateExerciseDto): Promise<any> {
const createdExercise = new this.exerciseModel(createExerciseDto);

try {
return await createdExcercise.save();
return await createdExercise.save();
} catch (error) {
throw new RpcException(error);
}
}

async getExcercises({
async getExercises({
page,
limit,
filter = '',
}): Promise<PaginatedResult<Excercise>> {
}): Promise<PaginatedResult<Exercise>> {
const skip = (page - 1) * limit;

const data = await this.excerciseModel
const data = await this.exerciseModel
.find({ name: { $regex: filter, $options: 'i' } })
.skip(skip)
.limit(limit)
.exec();
const totalCount = await this.excerciseModel
const totalCount = await this.exerciseModel
.countDocuments({ name: { $regex: filter, $options: 'i' } })
.exec();

@@ -56,23 +56,23 @@ export class WorkoutsService {

async createWorkout(createWorkoutDto: CreateWorkoutDto): Promise<Workout> {
try {
const excercises = [];
const exercises = [];

for (const excerciseDto of createWorkoutDto.excercises) {
const excercise = new this.excerciseModel({
name: excerciseDto.exercise,
for (const exerciseDto of createWorkoutDto.exercises) {
const exercise = new this.exerciseModel({
name: exerciseDto.exercise,
});
await excercise.save(); //TODO: check if excercises already exist. Do we want to assume that they exist and expect an id here?
excercises.push({
excercise: excercise._id,
sets: excerciseDto.sets,
reps: excerciseDto.reps,
await exercise.save(); //TODO: check if exercises already exist. Do we want to assume that they exist and expect an id here?
exercises.push({
exercise: exercise._id,
sets: exerciseDto.sets,
reps: exerciseDto.reps,
});
}

const createdWorkout = new this.workoutModel({
...createWorkoutDto,
excercises: excercises,
exercises: exercises,
});

return await createdWorkout.save();
@@ -105,6 +105,18 @@ export class WorkoutsService {
};
}

async getWorkoutById(id: string): Promise<Workout> {
const workout = await this.workoutModel
.findById(id)
.populate('exercises.exercise')
.exec();

if (!workout) {
throw new RpcException(new NotFoundException('Workout not found'));
}
return workout;
}

async saveWorkout(workout: CreateWorkoutLogDto): Promise<WorkoutLog> {
const createdWorkoutLog = new this.workoutLogModel(workout);

Loading

0 comments on commit a1d485b

Please sign in to comment.