import { OkPacket } from "mysql"; import cyber from "../2-utils/cyber"; import dal from "../2-utils/dal"; import CredentialsModel from "../4-models/credentials-model"; import { UnauthorizedError, ValidationError } from "../4-models/errors-model"; import Role from "../4-models/role-model"; import UserModel from "../4-models/user-model"; async function register(user: UserModel): Promise { const errors = user.validateRegister(); if (errors) { throw new ValidationError(errors); } user.username = user.username.toLowerCase(); if(await isUsernameExist(user.username)) { throw new ValidationError(`This username: "${user.username}" already exists.`) } const sql = `INSERT INTO users(FirstName, LastName, Username, Password) VALUES('${user.firstName}', '${user.lastName}', '${user.username}', '${user.password}')`; const result: OkPacket = await dal.fetchUsers(sql); user.id = result.insertId; user.role = Role.User; console.log(user); const token = cyber.getNewToken(user); return token; } async function login(credential: CredentialsModel): Promise { const errors = credential.logInValidation(); if (errors) { throw new ValidationError(errors); } credential.username = credential.username.toLowerCase(); const sql = `SELECT UserID, Username,Password, Role FROM users WHERE Username LIKE '${credential.username}' AND Password LIKE '${credential.password}';`; const result = await dal.fetchUsers(sql); if(result[0] === undefined) { throw new UnauthorizedError("Incorrect username or password") } const token = cyber.getNewToken(result); return token; } async function isUsernameExist(username: string): Promise { const sql = `SELECT COUNT(Username) as count FROM users WHERE Username = '${username}'`; const result = await dal.fetchVacations(sql); const count = result[0].count; return count > 0 } export default { register, login }