LocationAPI/src/controllers/authorization/loginController.js

86 lines
3.3 KiB
JavaScript

import { getUserListModel } from "../../models/authorization/userModel.js";
import { noResults } from "../../validators/result-validators.js";
import mysql from "../../adapters/mysql.js";
import bcrypt from "bcrypt";
import { error404, errorHandler } from "../../utils/errors.js";
import { sendResponseNotFound, sendResponseUnauthorized } from "../../utils/responses.js";
import { getRolesHasPermissionsModel } from "../../models/authorization/roles_has_permissionsModel.js";
const postLoginController = (req, res, next, config) => {
const { username, password } = req.body;
const conn = mysql.start(config);
getUserListModel({ conn, loginUsername: username})
.then((response) => {
if (noResults(response)) {
const error = errorHandler({code: 'UNAUTHORIZED'}, config.environment);
return sendResponseUnauthorized(res, error);
}
return bcrypt
.compare(password, response[0].password)
.then((isMatch) => {
if (!isMatch) {
const error = errorHandler({code: 'UNAUTHORIZED'}, config.environment);
return sendResponseUnauthorized(res, error);
}
const {uuid, username, email, role} = response[0];
const roleUuid = role
//obtain role permissions
return _getRolePermissions(config, roleUuid, conn)
.then(rolePermissions => {
const roleData = {
name: response[0].role_name || 'viewer',
roles_uuid: roleUuid
};
const result = {
_data: {
uuid,
username,
email,
role,
roleData: roleData,
role_permissions: rolePermissions
},
};
next(result);
});
});
})
.catch((err) => {
const error = errorHandler(err, config.environment);
res.status(error.code).json(error);
})
.finally(() => {
mysql.end(conn);
});
}
const _getRolePermissions = (config, roleUuid, conn) => {
return getRolesHasPermissionsModel({ uuid_role: roleUuid, conn })
.then((response) => {
if (noResults(response)) {
const err = error404();
const error = errorHandler(err, config.environment);
return sendResponseNotFound(res, error);
}
return response.map(({ permission }) => permission);
})
.catch((err) => {
const error = errorHandler(err, config.environment);
res.status(error.code).json(error);
})
.finally(() => {
mysql.end(conn);
});
}
export {
postLoginController
}