Skip to content

Commit 1f314f2

Browse files
committed
fully implements activities backend
1 parent 3393640 commit 1f314f2

File tree

4 files changed

+93
-14
lines changed

4 files changed

+93
-14
lines changed

src/controllers/activities.controller.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ export const createActivity = async (activitiesFields: ActivitiesType) => {
1111
throw new HttpError(HttpStatus.BAD_REQUEST, "Duplicate item name");
1212
}
1313

14-
const newActivities = new ActivitiesModel(activitiesFields);
15-
await newActivities.save();
16-
return newActivities;
14+
const newActivity = new ActivitiesModel(activitiesFields);
15+
await newActivity.save();
16+
return newActivity;
1717
} catch (err: unknown) {
1818
if (err instanceof HttpError) {
1919
throw err;
@@ -74,19 +74,19 @@ export const getActivityById = async (user: string, activityId: string) => {
7474

7575
export const updateActivity = async (
7676
user: string,
77+
activityId: string,
7778
activitiesFields: ActivitiesType,
7879
) => {
7980
try {
80-
const _id = activitiesFields._id; // Extract the _id from activitiesFields
81-
if (!_id) {
81+
if (!activityId) {
8282
throw new HttpError(
8383
HttpStatus.BAD_REQUEST,
8484
"Missing activity ID for update",
8585
);
8686
}
8787

8888
const updatedActivity = await ActivitiesModel.findOneAndUpdate(
89-
{ _id: _id, user: user }, // Query to match the document by _id and user
89+
{ _id: activityId, user: user }, // Query to match the document by _id and user
9090
{ $set: activitiesFields }, // Update operation
9191
{ new: true, runValidators: true }, // Options: return the updated document and run schema validators
9292
);

src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ app.use(helmet());
2525
* Uses the verifyToken middleware to protect the "/data" route
2626
* Use the verifyToken to protect all the routes that require authentication
2727
*/
28-
app.use("/api", /*verifyToken,*/ router);
28+
app.use("/api", verifyToken, router);
2929
app.use("/example", verifyToken, exampleRoute);
3030

3131
// Default route: Unprotected

src/routers/activities.router.ts

+80-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import { Router, type Request, type Response } from "express";
2-
import { createActivity } from "../controllers/activities.controller";
2+
import {
3+
createActivity,
4+
getAllActivities,
5+
getActivityById,
6+
updateActivity,
7+
deleteActivity,
8+
} from "../controllers/activities.controller";
39
import { HttpError, HttpStatus } from "../utils/errors";
410
import { type ActivitiesType } from "../models/activities.model";
511

@@ -10,7 +16,25 @@ activitiesRouter.post(
1016
"/",
1117
async (req: Request<any, any, ActivitiesType>, res: Response) => {
1218
try {
13-
const activities = await createActivity(req.body);
19+
const activity = await createActivity(req.body);
20+
res.status(HttpStatus.OK).json(activity);
21+
} catch (err: unknown) {
22+
if (err instanceof HttpError) {
23+
res.status(err.errorCode).json({ error: err.message });
24+
} else {
25+
res
26+
.status(HttpStatus.INTERNAL_SERVER_ERROR)
27+
.json({ error: "An unknown error occurred" });
28+
}
29+
}
30+
},
31+
);
32+
33+
activitiesRouter.get(
34+
"/",
35+
async (req: Request<any, any, ActivitiesType>, res: Response) => {
36+
try {
37+
const activities = await getAllActivities(req.body.user);
1438
res.status(HttpStatus.OK).json(activities);
1539
} catch (err: unknown) {
1640
if (err instanceof HttpError) {
@@ -23,3 +47,57 @@ activitiesRouter.post(
2347
}
2448
},
2549
);
50+
51+
activitiesRouter.get(
52+
"/:activityId",
53+
async (req: Request<any, any, ActivitiesType>, res: Response) => {
54+
try {
55+
const activity = await getActivityById(req.body.user, req.params.activityId);
56+
res.status(HttpStatus.OK).json(activity);
57+
} catch (err: unknown) {
58+
if (err instanceof HttpError) {
59+
res.status(err.errorCode).json({ error: err.message });
60+
} else {
61+
res
62+
.status(HttpStatus.INTERNAL_SERVER_ERROR)
63+
.json({ error: "An unknown error occurred" });
64+
}
65+
}
66+
},
67+
);
68+
69+
activitiesRouter.put(
70+
"/:activityId",
71+
async (req: Request<any, any, ActivitiesType>, res: Response) => {
72+
try {
73+
const activity = await updateActivity(req.body.user, req.params.activityId, req.body);
74+
res.status(HttpStatus.OK).json(activity);
75+
} catch (err: unknown) {
76+
if (err instanceof HttpError) {
77+
res.status(err.errorCode).json({ error: err.message });
78+
} else {
79+
res
80+
.status(HttpStatus.INTERNAL_SERVER_ERROR)
81+
.json({ error: "An unknown error occurred" });
82+
}
83+
}
84+
},
85+
);
86+
87+
activitiesRouter.delete(
88+
"/:activityId",
89+
async (req: Request<any, any, ActivitiesType>, res: Response) => {
90+
try {
91+
const activity = await deleteActivity(req.body.user, req.params.activityId);
92+
res.status(HttpStatus.OK).json(activity);
93+
} catch (err: unknown) {
94+
if (err instanceof HttpError) {
95+
res.status(err.errorCode).json({ error: err.message });
96+
} else {
97+
res
98+
.status(HttpStatus.INTERNAL_SERVER_ERROR)
99+
.json({ error: "An unknown error occurred" });
100+
}
101+
}
102+
},
103+
);

src/tests/controllers.tests/activities.test.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,8 @@ describe("Activities controller tests", () => {
4949

5050
expect(returnedActivity).toMatchObject(activityDummyData1);
5151

52-
await updateActivity(activityDummyData1.user, {
52+
await updateActivity(activityDummyData1.user, returnedActivities[0]._id, {
5353
...activityDummyData1,
54-
_id: returnedActivities[0]._id,
5554
itemName: "activitiesItem2",
5655
} as ActivitiesType);
5756
const returnedActivity2 = await getActivityById(
@@ -61,9 +60,11 @@ describe("Activities controller tests", () => {
6160
expect(returnedActivity2?.itemName).to.equal("activitiesItem2");
6261

6362
await deleteActivity(activityDummyData1.user, returnedActivities[0]._id);
64-
const returnedActivities3 = await getAllActivities(activityDummyData1.user);
65-
expect(returnedActivities3.length).to.equal(0);
63+
const returnedActivities3 = await getAllActivities(activityDummyData1.user);
64+
expect(returnedActivities3.length).to.equal(0);
6665

67-
await expect(updateActivity(activityDummyData1.user, {} as ActivitiesType)).rejects.toThrowError("Missing");
66+
await expect(
67+
updateActivity(activityDummyData1.user, "", {} as ActivitiesType),
68+
).rejects.toThrowError("Missing");
6869
});
6970
});

0 commit comments

Comments
 (0)