diff --git a/src/middlewares/auth/complete.ts b/src/middlewares/auth/complete.ts index ac2036d50462fbdd7af9f1a49b62302347b944e4..25ff354d76bd8639602ba2835e2b5f5f96f43c05 100644 --- a/src/middlewares/auth/complete.ts +++ b/src/middlewares/auth/complete.ts @@ -14,30 +14,20 @@ const complete = () => async (req: Request, res: Response) => { try { const token = await oauth2().authorizationCode.getToken(tokenConfig); + let isRegistered = false; await axios .get<authschResponse>( `https://auth.sch.bme.hu/api/profile/?access_token=${token.access_token}` ) - .then((response) => { - Profile.findOne( + .then(async (response) => { + await Profile.findOne( { external_id: response.data.internal_id }, (error, profile) => { if (error) { console.warn(error); return res.status(400); } else { - if (!profile) { - const newProfile = new Profile(); - newProfile.external_id = response.data.internal_id; - newProfile.email = response.data.mail; - newProfile.name = `${response.data.sn} ${response.data.givenName}`; - newProfile.save((err) => { - if (err) { - console.log(err); - return res.status(400); - } - }); - } + if (!!profile) isRegistered = true; } } ); @@ -45,6 +35,7 @@ const complete = () => async (req: Request, res: Response) => { id: String(response.data.internal_id), email: String(response.data.mail), name: `${response.data.sn} ${response.data.givenName}`, + isRegistered, token, }; }) diff --git a/src/middlewares/user/addUser.ts b/src/middlewares/user/addUser.ts index ede1490decdb0c849d1b950059ae622d7c5c8757..74eceb9e215da9cb3ae2d4bbe34fbb144166ab52 100644 --- a/src/middlewares/user/addUser.ts +++ b/src/middlewares/user/addUser.ts @@ -1,27 +1,67 @@ import { NextFunction, Request, Response } from "express"; import Profile, { Role } from "../../models/ProfileSchema"; -const addUser = () => (req: Request, res: Response, next: NextFunction) => { - const profile = new Profile(); +import { ValidationError } from "../utils/ValidationError"; - const fields = ["studentCardNumber", "roomNumber", "picture"]; - fields.forEach((field) => { - const value = req.body[field]; - if (value) profile.set(field, value); - }); +const addUser = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + // Already registered + if (req.session?.user?.isRegistered) { + await Profile.findOne( + { external_id: req.session.user.id }, + (error, profile) => { + if (error) { + console.warn(error); + return res.status(400); + } else { + res.status(200); + res.data = { profile }; + } + } + ); + return next(); + } + // Register + try { + const profile = new Profile(); - profile.external_id = req.session!.user!.id; - profile.role = Role.User; + const fields = [ + { name: "studentCardNumber", required: true }, + { name: "roomNumber", required: true }, + { name: "picture", required: false }, + ]; + fields.forEach((field) => { + const value = req.body[field.name]; + if (field.required && !value) { + res.status(400); + throw new ValidationError(400, `Field: {${field.name}} is required!`); + } + if (value) profile.set(field.name, value); + }); - profile.save((err) => { - if (err) { - res.status(400); - } else { - res.status(201); - res.data = { profile }; + profile.external_id = req.session!.user!.id; + profile.email = req.session?.user?.email; + profile.name = req.session?.user?.name; + + profile.save((err) => { + if (err) { + res.status(400); + } else { + res.status(201); + res.data = { profile }; + req.session!.user!.isRegistered = true; + } + next(); + }); + } catch (error) { + if (error instanceof ValidationError) { + const { code, message } = error; + return res.status(code).send({ message }); } - next(); - }); + } }; export default addUser; diff --git a/src/middlewares/utils/ValidationError.ts b/src/middlewares/utils/ValidationError.ts new file mode 100644 index 0000000000000000000000000000000000000000..4da9eeaa20f57ba786a10cb8befc10df8a05e4c3 --- /dev/null +++ b/src/middlewares/utils/ValidationError.ts @@ -0,0 +1,9 @@ +export class ValidationError extends Error { + code: number; + constructor(code: number, message: string) { + super(message); + this.code = code; + this.name = "ValidationError"; + Object.setPrototypeOf(this, new.target.prototype); + } +} diff --git a/src/models/user.interface.ts b/src/models/user.interface.ts index d571e6900b31d73bab2ef717146431c8041d3dc3..3790163841341078e60796c7fa257048892eaa06 100644 --- a/src/models/user.interface.ts +++ b/src/models/user.interface.ts @@ -4,5 +4,6 @@ export interface User { email: string; name: string; id: string; + isRegistered: boolean; token: Token; } diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts index 6d004f4f33ad3c529a7d21f4f28281439024e601..77bdbb461ed6d7d90e6d5fb05666477b57081c8f 100644 --- a/src/utils/declarations/response.d.ts +++ b/src/utils/declarations/response.d.ts @@ -9,6 +9,7 @@ declare global { newsObject?: INews | null; profile?: IProfile | null; profiles?: IProfile[] | null; + error?: string | null; }; } }