From 52513e3003b3562e4b12fcb8a518b50d70a47ddd Mon Sep 17 00:00:00 2001 From: Jack Garritano <114269804+jackgarritano@users.noreply.github.com> Date: Wed, 28 Feb 2024 11:14:40 -0600 Subject: [PATCH] implements education controller --- src/controllers/activities.controller.ts | 4 +- src/controllers/education.controller.ts | 138 +++++++++++++++++++++++ 2 files changed, 140 insertions(+), 2 deletions(-) diff --git a/src/controllers/activities.controller.ts b/src/controllers/activities.controller.ts index 70af4ba..da0e234 100644 --- a/src/controllers/activities.controller.ts +++ b/src/controllers/activities.controller.ts @@ -51,11 +51,11 @@ export const getAllActivities = async (user: string) => { export const getActivityById = async (user: string, activityId: string) => { try { - const activities = await ActivitiesModel.findOne({ + const activity = await ActivitiesModel.findOne({ user: user, _id: activityId, }); - return activities; + return activity; } catch (err: unknown) { //rethrow any errors as HttpErrors if (err instanceof HttpError) { diff --git a/src/controllers/education.controller.ts b/src/controllers/education.controller.ts index e69de29..143ca93 100644 --- a/src/controllers/education.controller.ts +++ b/src/controllers/education.controller.ts @@ -0,0 +1,138 @@ +import { EducationModel, type EducationType } from "../models/education.model"; +import { HttpError, HttpStatus, checkMongooseErrors } from "../utils/errors"; +import { checkDuplicateItemName } from "../utils/checkDuplicates"; + +export const createEducation = async (educationFields: EducationType) => { + try { + if (await checkDuplicateItemName(educationFields.itemName)) { + throw new HttpError(HttpStatus.BAD_REQUEST, "Duplicate item name"); + } + + const newEducation = new EducationModel(educationFields); + await newEducation.save(); + return newEducation; + } catch (err: unknown) { + if (err instanceof HttpError) { + throw err; + } + + checkMongooseErrors(err); + + throw new HttpError( + HttpStatus.INTERNAL_SERVER_ERROR, + "Education creation failed", + { cause: err }, + ); + } +}; + +export const getAllEducation = async (user: string) => { + try { + const education = await EducationModel.find({ user: user }); + return education; + } catch (err: unknown) { + //rethrow any errors as HttpErrors + if (err instanceof HttpError) { + throw err; + } + //checks if mongoose threw and will rethrow with appropriate status code and message + checkMongooseErrors(err); + + throw new HttpError( + HttpStatus.INTERNAL_SERVER_ERROR, + "Education retrieval failed", + { cause: err }, + ); + } +}; + +export const getActivityById = async (user: string, educationId: string) => { + try { + const education = await EducationModel.findOne({ + user: user, + _id: educationId, + }); + return education; + } catch (err: unknown) { + //rethrow any errors as HttpErrors + if (err instanceof HttpError) { + throw err; + } + //checks if mongoose threw and will rethrow with appropriate status code and message + checkMongooseErrors(err); + + throw new HttpError( + HttpStatus.INTERNAL_SERVER_ERROR, + "Education retrieval failed", + { cause: err }, + ); + } +}; + +export const updateEducation = async ( + user: string, + educationId: string, + educationFields: EducationType, +) => { + try { + if (!educationId) { + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Missing education ID for update", + ); + } + + if (await checkDuplicateItemName(educationFields.itemName)) { + throw new HttpError(HttpStatus.BAD_REQUEST, "Duplicate item name"); + } + + const updatedActivity = await EducationModel.findOneAndUpdate( + { _id: educationId, user: user }, // Query to match the document by _id and user + { $set: educationFields }, // Update operation + { new: true, runValidators: true }, // Options: return the updated document and run schema validators + ); + return updatedActivity; + } catch (err: unknown) { + //rethrow any errors as HttpErrors + if (err instanceof HttpError) { + throw err; + } + //checks if mongoose threw and will rethrow with appropriate status code and message + checkMongooseErrors(err); + + throw new HttpError( + HttpStatus.INTERNAL_SERVER_ERROR, + "Education update failed", + { cause: err }, + ); + } +}; + +export const deleteEducation = async (user: string, educationId: string) => { + try { + const deletedEducation = await EducationModel.findOneAndDelete({ + _id: educationId, + user: user, + }); + if (!deletedEducation) { + throw new HttpError( + HttpStatus.NOT_FOUND, + "Education not found or already deleted", + ); + } + return { message: "Education deleted successfully" }; + } catch (err: unknown) { + //rethrow any errors as HttpErrors + if (err instanceof HttpError) { + throw err; + } + //checks if mongoose threw and will rethrow with appropriate status code and message + checkMongooseErrors(err); + + throw new HttpError( + HttpStatus.INTERNAL_SERVER_ERROR, + "Education deletion failed", + { cause: err }, + ); + } +};