Skip to content

Commit

Permalink
Fix error response (#29)
Browse files Browse the repository at this point in the history
* improve error responses on failed req body validations while event onboarding

* change add organizer method to accept username instead of id

---------

Co-authored-by: Sharthak Sharma <sharthaksharma.ss@gmail.com>
  • Loading branch information
gdsc-nits and shrthk-7 authored Sep 2, 2024
1 parent 0abbe11 commit bab11bb
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 56 deletions.
54 changes: 24 additions & 30 deletions src/controllers/event/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {
const {
description,
posterImage,
attendanceIncentive,
registrationIncentive,
thirdPartyURL,
lat,
lng,
Expand All @@ -24,14 +22,11 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {
venue,
extraQuestions,
} = req.body as Event;
// const { organisers, managers }: { organisers: [User]; managers: [User] } =
// req.body;

if (
!(
description &&
posterImage &&
// incentive &&
// isIncentivised &&
lat &&
lng &&
maxTeamSize &&
Expand All @@ -45,22 +40,16 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {
venue
)
)
return next(Errors.Module.invalidInput);
return next(Errors.Module.invalidAttribute);

if (!String(moduleId) || moduleId.length !== 24)
return next(Errors.Module.invalidInput);
return next(Errors.Module.moduleIdInvalid);

if (extraQuestions && !Array.isArray(extraQuestions)) {
return next(Errors.Module.invalidInput);
}
if (minTeamSize > maxTeamSize) return next(Errors.Module.invalidInput);
if (extraQuestions && !Array.isArray(extraQuestions))
return next(Errors.Module.extraQuestionsJSONInvalid);

if (minTeamSize > maxTeamSize) return next(Errors.Module.teamSizeMismatch);

if (
!(registrationIncentive && typeof registrationIncentive === "number") ||
!(attendanceIncentive && typeof attendanceIncentive === "number")
) {
return next(Errors.Module.invalidInput);
}
if (
typeof maxTeamSize !== "number" ||
typeof minTeamSize !== "number" ||
Expand All @@ -73,29 +62,36 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {
typeof venue !== "string" ||
typeof posterImage !== "string"
)
return next(Errors.Module.invalidInput);
return next(Errors.Module.invalidAttribute);

const regStart = new Date(registrationStartTime);
const regEnd = new Date(registrationEndTime);

if (JSON.stringify(regStart) === "null" || JSON.stringify(regEnd) === "null")
return next(Errors.Module.invalidInput);
if (
JSON.stringify(regStart) === "null" ||
JSON.stringify(regEnd) === "null"
) {
return next(Errors.Module.timingInvalid);
}

if (regStart && regEnd && regStart > regEnd)
return next(Errors.Module.invalidInput);
if (regStart && regEnd && regStart > regEnd) {
return next(Errors.Module.timingInvalid);
}

if (
thirdPartyURL &&
(typeof thirdPartyURL !== "string" || !thirdPartyURL.length)
)
return next(Errors.Module.invalidInput);
) {
return next(Errors.Module.thirdPartyURLInvalid);
}

if (
!(await prisma.module.findFirst({
where: { id: moduleId },
}))
)
) {
return next(Errors.Module.moduleNotFound);
}

const { organizers, managers }: { organizers: [string]; managers: [string] } =
req.body;
Expand All @@ -109,7 +105,7 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {

if (organizers) {
if (!organizers.every((organizer) => organizer.length === 24)) {
return next(Errors.Module.invalidInput);
return next(Errors.Module.organizerIdInvalid);
}

const userIdExist = await Utils.Event.userIdExist(organizers);
Expand All @@ -122,7 +118,7 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {

if (managers) {
if (!managers.every((manager) => manager.length === 24)) {
return next(Errors.Module.invalidInput);
return next(Errors.Module.managerIdInvalid);
}

const userIdExist = await Utils.Event.userIdExist(managers);
Expand All @@ -137,8 +133,6 @@ const createEvent: Interfaces.Controller.Async = async (req, res, next) => {
data: {
description,
posterImage,
attendanceIncentive,
registrationIncentive,
thirdPartyURL,
lat,
lng,
Expand Down
52 changes: 27 additions & 25 deletions src/controllers/event/addOrganizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,35 +28,37 @@ const addOrganizer: Interfaces.Controller.Async = async (req, res, next) => {
(value, index, array) => array.indexOf(value) === index
);

if (!organizers.every((organizer) => organizer.length === 24)) {
return next(Errors.Module.invalidInput);
const results = await Promise.all(
organizers.map((username: string) =>
prisma.user.findFirst({
where: { username: username },
})
)
);

if (!results.every((result) => result)) {
return next(Errors.User.userNotFound);
}

const userIdExist = await Utils.Event.userIdExist(organizers);
const eventOrganisers: EventOrganiser[] = [];
await Promise.all(
results.map(async (result) => {
const eventOrganizer = await prisma.eventOrganiser.upsert({
create: {
user: { connect: { id: result!.id } },
event: { connect: { id: eventId } },
},
where: { userId_eventId: { userId: result!.id, eventId: eventId } },
update: {},
});

if (!userIdExist) {
return next(Errors.User.userNotFound);
} else {
const eventOrganisers: EventOrganiser[] = [];
await Promise.all(
organizers.map(async (id: string) => {
const eventOrganizer = await prisma.eventOrganiser.upsert({
create: {
user: { connect: { id: id } },
event: { connect: { id: eventId } },
},
where: { userId_eventId: { userId: id, eventId: eventId } },
update: {},
});

if (eventOrganizer) {
eventOrganisers.push(eventOrganizer);
}
})
);
if (eventOrganizer) {
eventOrganisers.push(eventOrganizer);
}
})
);

return res.json(Utils.Response.Success(eventOrganisers));
}
return res.json(Utils.Response.Success(eventOrganisers));
};

export { addOrganizer };
36 changes: 35 additions & 1 deletion src/global/errors/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,47 @@ const userUnauthorized = Utils.Response.Error(
);

const extraQuestionsJSONInvalid = Utils.Response.Error(
"extra questions misc JSON in invalid"
"Extra questions misc JSON is invalid",
400
);

const invalidAttribute = Utils.Response.Error(
"One or more required attributes invalid [description, posterImage, lat, lng, maxTeamSize, minTeamSize, moduleId, name, prizeDescription, registrationEndTime, registrationStartTime, stagesDescription, venue]",
400
);

const moduleIdInvalid = Utils.Response.Error("Invalid moduleId", 400);

const teamSizeMismatch = Utils.Response.Error(
"minTeamSize cannot exceed maxTeamSize",
400
);

const timingInvalid = Utils.Response.Error(
"Invalid values for registrationStartTime and registrationEndTIme",
400
);

const thirdPartyURLInvalid = Utils.Response.Error(
"Invalid value received for thirdPartyURL",
400
);

const organizerIdInvalid = Utils.Response.Error("Invalid organizer id(s)", 400);

const managerIdInvalid = Utils.Response.Error("Invalid manager id(s)", 400);

export {
managerIdInvalid,
organizerIdInvalid,
thirdPartyURLInvalid,
invalidInput,
moduleNotFound,
eventNotFound,
userUnauthorized,
extraQuestionsJSONInvalid,
invalidAttribute,
moduleIdInvalid,
teamSizeMismatch,
timingInvalid,
};

0 comments on commit bab11bb

Please sign in to comment.