Browse Source

Create route to update an exercise note.

Lee Morgan 1 năm trước cách đây
mục cha
commit
8c06de012a
3 tập tin đã thay đổi với 69 bổ sung2 xóa
  1. 41 1
      controllers/workout.js
  2. 25 0
      documentation/data.js
  3. 3 1
      routes/workout.js

+ 41 - 1
controllers/workout.js

@@ -1,5 +1,7 @@
 import Workout from "../models/Workout.js";
 
+import {HttpError} from "../HttpError.js";
+
 const createRoute = async (req, res, next)=>{
     try{
         const workout = createWorkout(req.body, res.locals.user._id);
@@ -15,6 +17,17 @@ const getRoute = async (req, res, next)=>{
     }catch(e){next(e)}
 }
 
+const addNoteRoute = async (req, res, next)=>{
+    try{
+        const workout = await Workout.find({_id: req.params.workoutId});
+        confirmOwnership(workout, res.locals.user);
+        const exercise = findExercise(workout, req.body.exerciseId);
+        exercise.notes = req.body.note;
+        await workout.save();
+        res.json(responseWorkout(workout));
+    }catch(e){next(e)}
+}
+
 /*
  Create a new Workout object
  @param {Object} - Body data from the request
@@ -29,6 +42,32 @@ const createWorkout = (data, userId)=>{
     });
 }
 
+/*
+ Throw error if user does not own workout
+ @param {Workout} workout - Workout object
+ @param {User} user - User object
+ */
+const confirmOwnership = (workout, user)=>{
+   if(workout.user.toString() !== user._id.toString()){
+       throw new HttpError(403, "Unauthorized");
+   }
+}
+
+/*
+ Retrieve a single exercise from a workout
+ @param {Workout} workout - Workout object
+ @param {String} exerciseId - ID of the exercise to retrieve
+ @return {Object} - Exercise object
+ */
+const findExercise = (workout, exerciseId)=>{
+    for(let i = 0; i < workout.exercises.length; i++){
+        if(workout.exercises._id.toString === exerciseId){
+            return workout.exercises[i];
+        }
+    }
+    return null;
+}
+
 /*
  Create a new workout object for sending to the frontend
  @param {Workout} workout - Workout object
@@ -44,5 +83,6 @@ const responseWorkout = (workout)=>{
 
 export {
     createRoute,
-    getRoute
+    getRoute,
+    addNoteRoute
 }

+ 25 - 0
documentation/data.js

@@ -190,6 +190,31 @@ window.data = [
             desc: "List of workouts for the logged in user"
         }]
     },
+    {
+        type: "route",
+        id: "updateWorkoutNote",
+        title: "Update Note",
+        url: "PUT /workout/:workoutId/note",
+        auth: true,
+        description: "Create a note for a specific exercise",
+        requestBody: [
+            {
+                name: "exercise",
+                type: "String",
+                desc: "ID of the exercise to update the note for"
+            },
+            {
+                name: "note",
+                type: "String",
+                desc: "User created note for exercise"
+            }
+        ],
+        responseBody: [{
+            name: "N/A",
+            type: "Workout",
+            desc: "Workout object"
+        }]
+    },
     {
         type: "object",
         title: "Session",

+ 3 - 1
routes/workout.js

@@ -1,6 +1,7 @@
 import {
     createRoute,
-    getRoute
+    getRoute,
+    addNoteRoute
 } from "../controllers/workout.js";
 
 import {userAuth} from "../auth.js";
@@ -8,4 +9,5 @@ import {userAuth} from "../auth.js";
 export default (app)=>{
     app.post("/workout", userAuth, createRoute);
     app.get("/workout", userAuth, getRoute);
+    app.put("/workout/:workoutId/note", userAuth, addNoteRoute);
 }