Skip to content

Commit

Permalink
feat: Sort data by date
Browse files Browse the repository at this point in the history
Workouts, records and memebers can be sorted by createdAt and updatedAt,
ascendig and descendig.
Typo that did not limit data in Members was fixed.
  • Loading branch information
JSamuelAP committed Oct 7, 2023
1 parent 3d44c49 commit babae92
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 31 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "crossfit-wod-api",
"version": "1.4.0",
"version": "1.5.0",
"description": "Crossfit Work Of Day REST API from freeCodeCamp",
"main": "index.js",
"scripts": {
Expand Down
5 changes: 3 additions & 2 deletions src/controllers/memberController.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
const memberService = require("../services/memberService");

const getAllMembers = (req, res) => {
const { name, gender, lenght, page } = req.query;
const { name, gender, length, page, sort } = req.query;
try {
const allMembers = memberService.getAllMembers(
{ name, gender },
{ lenght, page }
{ length, page },
{ sort }
);
res.send({ status: "OK", data: allMembers });
} catch (error) {
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/recordController.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ const getRecordsForMember = (req, res) => {
};

const getAllRecords = (req, res) => {
const { length, page } = req.query;
const { length, page, sort } = req.query;

try {
const allRecords = recordService.getAllRecords({ length, page });
const allRecords = recordService.getAllRecords({ length, page }, { sort });
res.send({ status: "OK", data: allRecords });
} catch (error) {
res
Expand Down
5 changes: 3 additions & 2 deletions src/controllers/workoutController.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
const workoutService = require("../services/workoutService");

const getAllWorkouts = (req, res) => {
const { mode, equipment, length, page } = req.query;
const { mode, equipment, length, page, sort } = req.query;
try {
const allWorkouts = workoutService.getAllWorkouts(
{ mode, equipment },
{ length, page }
{ length, page },
{ sort }
);
res.send({ status: "OK", data: allWorkouts });
} catch (error) {
Expand Down
10 changes: 8 additions & 2 deletions src/database/Member.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
const DB = require("./db.json");

const { saveToDatabase, getCurrentDateTime, getPage } = require("./utils");
const {
saveToDatabase,
getCurrentDateTime,
getPage,
sortByDate,
} = require("./utils");

const getAllMembers = (filterParams, paginationParams) => {
const getAllMembers = (filterParams, paginationParams, sortingParams) => {
try {
let members = DB.members;

Expand All @@ -15,6 +20,7 @@ const getAllMembers = (filterParams, paginationParams) => {
(member) => member.gender === filterParams.gender
);
members = getPage(members, paginationParams.page, paginationParams.length);
if (sortingParams.sort) members = sortByDate(members, sortingParams.sort);

return members;
} catch (error) {
Expand Down
11 changes: 9 additions & 2 deletions src/database/Record.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
const DB = require("./db.json");

const { saveToDatabase, getCurrentDateTime, getPage } = require("./utils");
const {
saveToDatabase,
getCurrentDateTime,
getPage,
sortByDate,
} = require("./utils");

const getRecordsForWorkout = (workoutId) => {
try {
Expand Down Expand Up @@ -30,13 +35,15 @@ const getRecordsForMember = (memberId) => {
}
};

const getAllRecords = (paginationParams) => {
const getAllRecords = (paginationParams, sortingParams) => {
try {
let records = getPage(
DB.records,
paginationParams.page,
paginationParams.length
);
if (sortingParams.sort) records = sortByDate(records, sortingParams.sort);

return records;
} catch (error) {
throw { status: 500, message: error };
Expand Down
10 changes: 8 additions & 2 deletions src/database/Workout.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
const DB = require("./db.json");
const { saveToDatabase, getCurrentDateTime, getPage } = require("./utils");
const {
saveToDatabase,
getCurrentDateTime,
getPage,
sortByDate,
} = require("./utils");

const getAllWorkouts = (filterParams, paginationParams) => {
const getAllWorkouts = (filterParams, paginationParams, sortingParams) => {
try {
let workouts = DB.workouts;

Expand All @@ -18,6 +23,7 @@ const getAllWorkouts = (filterParams, paginationParams) => {
paginationParams.page,
paginationParams.length
);
if (sortingParams.sort) workouts = sortByDate(workouts, sortingParams.sort);

return workouts;
} catch (error) {
Expand Down
40 changes: 28 additions & 12 deletions src/database/db.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@
"Try to hold your pace"
],
"id": "0a5948af-5185-4266-8c4b-818889657e9d",
"createdAt": "4/25/2022, 2:48:53 PM",
"updatedAt": "4/25/2022, 2:48:53 PM"
"createdAt": "1/25/2022, 2:48:53 PM",
"updatedAt": "5/25/2022, 2:48:53 PM"
},
{
"name": "Dumbbell Rower",
Expand All @@ -108,8 +108,8 @@
"RX weights for men: 50-lb"
],
"id": "3dc53bc8-27b8-4773-b85d-89f0a354d437",
"createdAt": "4/25/2022, 2:56:03 PM",
"updatedAt": "4/25/2022, 2:56:03 PM"
"createdAt": "6/20/2022, 2:56:03 PM",
"updatedAt": "7/25/2022, 2:56:03 PM"
}
],
"members": [
Expand All @@ -119,31 +119,39 @@
"gender": "male",
"dateOfBirth": "23/04/1990",
"email": "jason@mail.com",
"password": "666349420ec497c1dc890c45179d44fb13220239325172af02d1fb6635922956"
"password": "666349420ec497c1dc890c45179d44fb13220239325172af02d1fb6635922956",
"createdAt": "1/6/2022, 1:33:35 AM",
"updatedAt": "9/30/2023, 1:33:35 AM"
},
{
"id": "2b9130d4-47a7-4085-800e-0144f6a46059",
"name": "Tiffany Brookston",
"gender": "female",
"dateOfBirth": "09/06/1996",
"email": "tiffy@mail.com",
"password": "8a1ea5669b749354110dcba3fac5546c16e6d0f73a37f35a84f6b0d7b3c22fcc"
"password": "8a1ea5669b749354110dcba3fac5546c16e6d0f73a37f35a84f6b0d7b3c22fcc",
"createdAt": "8/2/2021, 1:33:35 AM",
"updatedAt": "12/16/2023, 1:33:35 AM"
},
{
"id": "11817fb1-03a1-4b4a-8d27-854ac893cf41",
"name": "Catrin Stevenson",
"gender": "female",
"dateOfBirth": "17/08/2001",
"email": "catrin@mail.com",
"password": "18eb2d6c5373c94c6d5d707650d02c3c06f33fac557c9cfb8cb1ee625a649ff3"
"password": "18eb2d6c5373c94c6d5d707650d02c3c06f33fac557c9cfb8cb1ee625a649ff3",
"createdAt": "2/11/2023, 1:33:35 AM",
"updatedAt": "4/29/2023, 1:33:35 AM"
},
{
"id": "6a89217b-7c28-4219-bd7f-af119c314159",
"name": "Greg Bronson",
"gender": "male",
"dateOfBirth": "08/04/1993",
"email": "greg@mail.com",
"password": "a6dcde7eceb689142f21a1e30b5fdb868ec4cd25d5537d67ac7e8c7816b0e862"
"password": "a6dcde7eceb689142f21a1e30b5fdb868ec4cd25d5537d67ac7e8c7816b0e862",
"createdAt": "8/20/2021, 1:33:35 AM",
"updatedAt": "10/2/2022, 1:33:35 AM"
},
{
"id": "ac23ae88-05b5-4b8d-83b8-a15f938b834c",
Expand All @@ -161,25 +169,33 @@
"id": "ad75d475-ac57-44f4-a02a-8f6def58ff56",
"workout": "4a3d9aaa-608c-49a7-a004-66305ad4ab50",
"record": "160 reps",
"member": "12a410bc-849f-4e7e-bfc8-4ef283ee4b19"
"member": "12a410bc-849f-4e7e-bfc8-4ef283ee4b19",
"createdAt": "4/24/2023, 2:45:26 AM",
"updatedAt": "7/24/2023, 3:24:23 AM"
},
{
"id": "0bff586f-2017-4526-9e52-fe3ea46d55ab",
"workout": "d8be2362-7b68-4ea4-a1f6-03f8bc4eede7",
"record": "7:23 minutes",
"member": "6a89217b-7c28-4219-bd7f-af119c314159"
"member": "6a89217b-7c28-4219-bd7f-af119c314159",
"createdAt": "8/9/2022, 2:45:26 AM",
"updatedAt": "8/10/2022, 3:24:23 AM"
},
{
"id": "365cc0bb-ba8f-41d3-bf82-83d041d38b82",
"workout": "a24d2618-01d1-4682-9288-8de1343e53c7",
"record": "358 reps",
"member": "ac23ae88-05b5-4b8d-83b8-a15f938b834c"
"member": "ac23ae88-05b5-4b8d-83b8-a15f938b834c",
"createdAt": "10/9/2020, 2:45:26 AM",
"updatedAt": "10/9/2020, 3:24:23 AM"
},
{
"id": "62251cfe-fdb6-4fa6-9a2d-c21be93ac78d",
"workout": "4a3d9aaa-608c-49a7-a004-66305ad4ab50",
"record": "145 reps",
"member": "2b9130d4-47a7-4085-800e-0144f6a46059"
"member": "2b9130d4-47a7-4085-800e-0144f6a46059",
"createdAt": "1/3/2023, 2:45:26 AM",
"updatedAt": "1/3/2023, 3:24:23 AM"
},
{
"workout": "d8be2362-7b68-4ea4-a1f6-03f8bc4eede7",
Expand Down
27 changes: 27 additions & 0 deletions src/database/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,37 @@ const getPage = (array = [], page = 1, length = 20) => {
return array.slice(startIndex, endIndex);
};

const sortByDate = (array = [], propertyDate) => {
const allowedSortValues = [
"createdAt",
"updatedAt",
"-createdAt",
"-updatedAt",
];

if (allowedSortValues.includes(propertyDate)) {
const descending = propertyDate.charAt(0) === "-";
const property = descending ? propertyDate.substring(1) : propertyDate;

return array.sort((obj1, obj2) => {
const date1 = new Date(obj1[property]);
const date2 = new Date(obj2[property]);
const order = descending ? -1 : 1; // sorting direction

if (date1 < date2) return -1 * order;
else if (date1 > date2) return order;
else return 0; // Equals
});
}

return array;
};

module.exports = {
saveToDatabase,
getCurrentDateTime,
hashPassword,
comparePassword,
getPage,
sortByDate,
};
8 changes: 6 additions & 2 deletions src/services/memberService.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ const crypto = require("node:crypto");
const Member = require("../database/Member");
const { getCurrentDateTime, hashPassword } = require("../database/utils");

const getAllMembers = (filterParams, paginationParams) => {
const getAllMembers = (filterParams, paginationParams, sortingParams) => {
try {
const allMembers = Member.getAllMembers(filterParams, paginationParams);
const allMembers = Member.getAllMembers(
filterParams,
paginationParams,
sortingParams
);
return allMembers;
} catch (error) {
throw error;
Expand Down
4 changes: 2 additions & 2 deletions src/services/recordService.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ const getRecordsForMember = (memberId) => {
}
};

const getAllRecords = (paginationParams) => {
const getAllRecords = (paginationParams, sortingParams) => {
try {
const allRecords = Record.getAllRecords(paginationParams);
const allRecords = Record.getAllRecords(paginationParams, sortingParams);
return allRecords;
} catch (error) {
throw error;
Expand Down
8 changes: 6 additions & 2 deletions src/services/workoutService.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ const crypto = require("node:crypto");
const Workout = require("../database/Workout");
const { getCurrentDateTime } = require("../database/utils");

const getAllWorkouts = (filterParams, paginationParams) => {
const getAllWorkouts = (filterParams, paginationParams, sortingParams) => {
try {
const allWorkouts = Workout.getAllWorkouts(filterParams, paginationParams);
const allWorkouts = Workout.getAllWorkouts(
filterParams,
paginationParams,
sortingParams
);
return allWorkouts;
} catch (error) {
throw error;
Expand Down

0 comments on commit babae92

Please sign in to comment.