188 lines
5.8 KiB
JavaScript
188 lines
5.8 KiB
JavaScript
const express = require('express');
|
|
const { v4: uuidv4 } = require('uuid');
|
|
|
|
const {schemas} = require("../models/schemaMapper");
|
|
const {httpStatus} = require("../helpers/httpResponses");
|
|
const crypto = require("crypto");
|
|
const {departmentsDB} = require("../db/jsonDatabaseManager");
|
|
|
|
const router = express.Router();
|
|
|
|
function validateBody(req, res, next) {
|
|
if(req.path !== '/login'){
|
|
const ceoDB = req.app.get('ceoDB');
|
|
const ceoPassword = req.headers['ceo_password'];
|
|
const {password} = ceoDB.readFile()
|
|
|
|
if(ceoPassword !== password){
|
|
return res.status(httpStatus.UNAUTHORIZED).json({message: 'Invalid CEO password.'});
|
|
}
|
|
}
|
|
|
|
let validationSchema = undefined;
|
|
|
|
switch(req.path){
|
|
case '/set_security_levels':
|
|
validationSchema = schemas.securityLevelsModelSchema;
|
|
break;
|
|
case '/login':
|
|
validationSchema = schemas.usersLoginModelSchema;
|
|
break;
|
|
case '/departments':
|
|
validationSchema = schemas.departmentRegisterModelSchema;
|
|
break;
|
|
case '/':
|
|
if(req.method === 'PUT'){
|
|
validationSchema = schemas.ceoModifyModelSchema;
|
|
}
|
|
break;
|
|
default:
|
|
validationSchema = undefined;
|
|
}
|
|
|
|
if(validationSchema !== undefined){
|
|
const {error} = validationSchema.validate(req.body);
|
|
if(error){
|
|
const errorMessage = error.details.map(detail => detail.message).join(', ');
|
|
return res.status(httpStatus.BAD_REQUEST).json({ message: errorMessage });
|
|
}
|
|
}
|
|
|
|
next();
|
|
}
|
|
|
|
router.post('/login', validateBody, (req, res) => {
|
|
const ceoDB = req.app.get('ceoDB');
|
|
const { email, password } = req.body;
|
|
|
|
if(ceoDB.findIndexByKeyValueInArray('email', email) !== ceoDB.findIndexByKeyValueInArray('password', password)){
|
|
return res.status(httpStatus.UNAUTHORIZED).json({message: 'Invalid credentials.'});
|
|
}
|
|
|
|
return res.status(httpStatus.Ok).json({message: 'Logged in.'});
|
|
});
|
|
|
|
router.post('/set_security_levels', validateBody, (req, res) => {
|
|
const departmentsDB = req.app.get('departmentsDB');
|
|
const departmentsJson = departmentsDB.readFile();
|
|
|
|
const levelsJson = req.body;
|
|
console.log(levelsJson);
|
|
|
|
const newJson = {};
|
|
|
|
Object.entries(levelsJson).forEach(([levelKey, departmentName]) => {
|
|
let departmentId = -1;
|
|
for (let deptKey in departmentsJson) {
|
|
if (departmentsJson.hasOwnProperty(deptKey)) {
|
|
if (departmentsJson[deptKey].name === departmentName) {
|
|
departmentId = deptKey;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (departmentId !== -1) {
|
|
newJson[levelKey] = {
|
|
name: departmentName,
|
|
key: departmentsJson[departmentId].key
|
|
};
|
|
}
|
|
});
|
|
|
|
|
|
departmentsDB.writeFile(newJson);
|
|
return res.status(httpStatus.OK).json({message: 'Departments levels updated.'});
|
|
});
|
|
|
|
router.delete('/users/:id', validateBody, (req, res) => {
|
|
const usersDB = req.app.get('usersDB');
|
|
const { id } = req.params;
|
|
|
|
const userIndex = usersDB.findIndexByKeyValueInArray('id', id);
|
|
if(userIndex === -1){
|
|
return res.status(httpStatus.NOT_FOUND).json({message: 'User not found in system.'});
|
|
}
|
|
|
|
let usersJson = usersDB.readFile;
|
|
usersJson.splice(userIndex, 1);
|
|
usersDB.writeFile(usersJson);
|
|
|
|
return res.status(httpStatus.OK).json({ message: 'User deleted successfully.' });
|
|
});
|
|
|
|
router.post('/departments', validateBody, (req, res) => {
|
|
const departmentsDB = req.app.get('departmentsDB');
|
|
const { name } = req.body;
|
|
|
|
let jsonDepartments = departmentsDB.readFile();
|
|
const nameExists = Object.values(jsonDepartments).some(department => department.name === name);
|
|
if(nameExists){
|
|
return res.status(httpStatus.CONFLICT).json({message: 'Department already in system.'})
|
|
}
|
|
|
|
const isObjectEmpty = !Object.keys(jsonDepartments).length;
|
|
const highestKey = isObjectEmpty ? 0 : Math.max(...Object.keys(jsonDepartments).map(Number));
|
|
const nextKey = highestKey + 1;
|
|
|
|
jsonDepartments[nextKey] = {
|
|
name: name,
|
|
key: crypto.randomBytes(32).toString('hex')
|
|
};
|
|
departmentsDB.writeFile(jsonDepartments);
|
|
|
|
return res.status(httpStatus.CREATED).json({message: 'Department successfully created'});
|
|
});
|
|
|
|
router.delete('/departments/:name', validateBody, (req, res) => {
|
|
const departmentsDB = req.app.get('departmentsDB');
|
|
let departmentsJson = departmentsDB.readFile();
|
|
let foundName = false;
|
|
const { name } = req.params;
|
|
|
|
console.log(name);
|
|
|
|
for (let key in departmentsJson) {
|
|
if (departmentsJson.hasOwnProperty(key)) {
|
|
const department = departmentsJson[key];
|
|
if (department.name === name) {
|
|
delete departmentsJson[key];
|
|
foundName = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(foundName !== true){
|
|
return res.status(httpStatus.NOT_FOUND).json({ message: 'Department not found.' });
|
|
}
|
|
|
|
departmentsDB.writeFile(departmentsJson);
|
|
return res.status(httpStatus.OK).json({ message: 'Department deleted successfully.' });
|
|
});
|
|
|
|
router.put('/', validateBody, (req, res) => {
|
|
const ceoDB = req.app.get('ceoDB');
|
|
const { name, email } = req.body;
|
|
const {id} = ceoDB.readFile()
|
|
|
|
const newCeo = {
|
|
id: id,
|
|
name: name,
|
|
email: email,
|
|
password: crypto.randomBytes(16).toString('hex')
|
|
}
|
|
|
|
ceoDB.writeFile(newCeo);
|
|
return res.status(httpStatus.OK).json({message: 'Information modified.'});
|
|
});
|
|
|
|
router.get('/get_decrypt_keys', (req, res) => {
|
|
return res.status(httpStatus.OK).json({
|
|
message: 'Departments fetched.',
|
|
data: departmentsDB.readFile()
|
|
});
|
|
});
|
|
|
|
module.exports = router;
|