Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions backend/typescript/middlewares/validators/activityValidators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,74 @@ export const activityUpdateDtoValidator = async (

return next();
};

export const activityUserPatchValidator = async (
req: Request,
res: Response,
next: NextFunction,
) => {
const { body } = req;

if (!validatePrimitive(body.userId, "integer")) {
return res.status(400).send(getApiValidationError("userId", "integer"));
}

return next();
};

export const activityScheduledTimePatchValidator = async (
req: Request,
res: Response,
next: NextFunction,
) => {
const { body } = req;

if (!validateDate(body.scheduledStartTime)) {
return res
.status(400)
.send(getApiValidationError("scheduledStartTime", "Date"));
}

return next();
};

export const activityStartTimePatchValidator = async (
req: Request,
res: Response,
next: NextFunction,
) => {
const { body } = req;

if (!validateDate(body.startTime)) {
return res.status(400).send(getApiValidationError("startTime", "Date"));
}

return next();
};

export const activityEndTimePatchValidator = async (
req: Request,
res: Response,
next: NextFunction,
) => {
const { body } = req;

if (!validateDate(body.endTime)) {
return res.status(400).send(getApiValidationError("endTime", "Date"));
}

return next();
};

export const activityNotesPatchValidator = async (
req: Request,
res: Response,
next: NextFunction,
) => {
const { body } = req;
if (!validatePrimitive(body.notes, "string")) {
return res.status(400).send(getApiValidationError("notes", "string"));
}

return next();
};
127 changes: 127 additions & 0 deletions backend/typescript/rest/activityRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import { Router } from "express";
import { isAuthorizedByRole } from "../middlewares/auth";
import {
activityEndTimePatchValidator,
activityNotesPatchValidator,
activityRequestDtoValidator,
activityScheduledTimePatchValidator,
activityStartTimePatchValidator,
activityUpdateDtoValidator,
activityUserPatchValidator,
} from "../middlewares/validators/activityValidators";
import ActivityService from "../services/implementations/activityService";
import {
Expand Down Expand Up @@ -50,6 +55,36 @@ activityRouter.get("/:id", async (req, res) => {
}
});

/* Get Activities for specific Pet by Pet id */
activityRouter.get("/pet/:petId", async (req, res) => {
const { petId } = req.params;
try {
const activitiesByPet = await activityService.getPetActivities(petId);
res.status(200).json(activitiesByPet);
} catch (e: unknown) {
if (e instanceof NotFoundError) {
res.status(404).send(getErrorMessage(e));
} else {
res.status(500).send(getErrorMessage(e));
}
}
});

/* Get Activities for specific User by User id */
activityRouter.get("/user/:userId", async (req, res) => {
const { userId } = req.params;
try {
const activitiesByUser = await activityService.getUserActivities(userId);
res.status(200).json(activitiesByUser);
} catch (e: unknown) {
if (e instanceof NotFoundError) {
res.status(404).send(getErrorMessage(e));
} else {
res.status(500).send(getErrorMessage(e));
}
}
});

/* Create Activity */
activityRouter.post(
"/",
Expand Down Expand Up @@ -103,6 +138,98 @@ activityRouter.patch(
},
);

/* Updates/Sets User assigned to an Activity */
activityRouter.patch(
"/:id/assign-user",
isAuthorizedByRole(new Set([Role.ANIMAL_BEHAVIOURIST, Role.ADMINISTRATOR])),
activityUserPatchValidator,
async (req, res) => {
const { id } = req.params;
try {
const { body } = req;
const Activity = await activityService.assignUser(id, {
userId: body.userId,
});
res.status(200).json(Activity);
} catch (e: unknown) {
res.status(500).send(getErrorMessage(e));
}
},
);

/* Updates/Sets a scheduled start time to an Activity */
activityRouter.patch(
"/:id/schedule",
isAuthorizedByRole(new Set([Role.ANIMAL_BEHAVIOURIST, Role.ADMINISTRATOR])),
activityScheduledTimePatchValidator,
async (req, res) => {
const { id } = req.params;
try {
const { body } = req;
const Activity = await activityService.scheduleActivity(id, {
time: body.scheduledStartTime,
});
res.status(200).json(Activity);
} catch (e: unknown) {
res.status(500).send(getErrorMessage(e));
}
},
);

/* Adds a start time to an Activity */
activityRouter.patch(
"/:id/start",
activityStartTimePatchValidator,
async (req, res) => {
const { id } = req.params;
try {
const { body } = req;
const Activity = await activityService.startActivity(id, {
time: body.startTime,
});
res.status(200).json(Activity);
} catch (e: unknown) {
res.status(500).send(getErrorMessage(e));
}
},
);

/* Adds an end time to an Activity */
activityRouter.patch(
"/:id/end",
activityEndTimePatchValidator,
async (req, res) => {
const { id } = req.params;
try {
const { body } = req;
const Activity = await activityService.endActivity(id, {
time: body.endTime,
});
res.status(200).json(Activity);
} catch (e: unknown) {
res.status(500).send(getErrorMessage(e));
}
},
);

/* Updates/Adds notes to an Activity */
activityRouter.patch(
"/:id/notes",
activityNotesPatchValidator,
async (req, res) => {
const { id } = req.params;
try {
const { body } = req;
const Activity = await activityService.updateActivityNotes(id, {
notes: body.notes,
});
res.status(200).json(Activity);
} catch (e: unknown) {
res.status(500).send(getErrorMessage(e));
}
},
);

/* Delete Activity by id */
activityRouter.delete(
"/:id",
Expand Down
Loading
Loading