ecliptica/server/routers/task-boss/controllers.js

289 lines
7.1 KiB
JavaScript

/* eslint-disable no-restricted-syntax */
const hash = require('pbkdf2-password')()
const { getDB } = require('../../utils/mongo')
// eslint-disable-next-line import/order
const ObjectId = require('mongodb').ObjectID
let db = null
const connect = async () => {
db = await getDB('task-boss')
}
const _idToId = (data) => {
const { _id, ...rest } = data
return {
id: _id,
...rest,
}
}
const DEPTS_COLLECTION = 'depts4'
const PEOPLES_COLLECTION = 'peoples4'
const USERS_COLL = 'users3'
const getDepts = async () => {
if (db === null) throw new Error('no db connection')
const deptsCollection = db.collection(DEPTS_COLLECTION)
let responseData = null
try {
responseData = await deptsCollection.aggregate([{
$lookup: {
from: 'peoples',
let: {
id_fio_resp: '$idFio',
},
pipeline: [
{
$match:
{
$expr:
{
$eq: ['$id', '$$id_fio_resp'],
},
},
},
{
$project: {
id: '$_id',
_id: 0,
family: 1,
name: 1,
secondName: 1,
email: 1,
phone: 1,
},
}],
as: 'responsible',
},
},
{
$unwind: '$responsible',
},
{
$project: {
id: '$_id',
_id: 0,
parentId: '$parentDept',
name: 1,
qty: {
$size: '$employees',
},
responsible: '$responsible',
notes: '$note',
tasks: {
inWork: '0',
newTasks: '0',
},
},
},
]).toArray()
} catch (e) {
console.log(e.message)
}
if (!responseData || responseData?.length === 0) {
responseData = require('./stubs/depts.json').body
}
return responseData
}
const getDeptData = async (deptId) => {
if (db === null) throw new Error('no db connection')
const deptsCollection = db.collection(DEPTS_COLLECTION)
const data = await deptsCollection.aggregate([
{
$match: {
_id: new ObjectId(deptId),
},
},
{
$lookup: {
from: 'peoples',
pipeline: [{
$project: {
id: '$_id',
_id: 0,
family: 1,
name: 1,
secondName: 1,
email: 1,
phone: 1,
},
}],
localField: 'idFio',
foreignField: 'id',
as: 'responsible',
},
},
{
$unwind: '$responsible',
},
{
$project: {
id: '$_id',
_id: 0,
parentId: '$parentDept',
name: 1,
qty: {
$size: '$employees',
},
responsible: '$responsible',
notes: '$note',
tasks: {
inWork: '0',
newTasks: '0',
},
},
},
]).toArray()
if (data.length === 0) {
throw new Error('No data')
}
return _idToId(data[0])
}
const dropDocuments = async (id) => {
try {
const deptsCollection = db.collection(DEPTS_COLLECTION)
const data = await deptsCollection.find({
parentDept: id,
}).toArray()
data.forEach((element) => {
dropDocuments(element._id)
})
deptsCollection.deleteOne({
_id: new ObjectId(id),
})
} catch (e) {
console.log(e)
}
}
const deleteDeptById = async (body) => {
if (db === null) throw new Error('no db connection');
try {
// eslint-disable-next-line guard-for-in
for (let deptId in body) {
dropDocuments(deptId)
}
} catch (e) {
console.log(e)
}
}
const getPeoplesData = async () => {
if (db === null) throw new Error('no db connection')
const peoplesCollection = db.collection(PEOPLES_COLLECTION)
const data = await peoplesCollection.find().toArray()
if (data.length === 0) {
const newData = require('./stubs/peoples/success.json').data
peoplesCollection.insertMany(newData)
return _idToId(newData)
}
return data
}
const createDept = async ({ form, peoples }) => {
if (db === null) throw new Error('no db connection')
const deptsCollection = db.collection(DEPTS_COLLECTION)
const data = await deptsCollection.find({
name: form.name,
}).toArray()
if (data.length > 0) throw new Error('duplication of stirng')
const employees = []
peoples.forEach((item) => employees.push({
id: item.id,
}))
const dataToInsert = {
...form, employees,
}
deptsCollection.insertMany([dataToInsert])
return dataToInsert
}
const authenticate = async (login, pass, fn) => {
if (db === null) return fn(new Error('no db connection'))
const usersCollection = db.collection(USERS_COLL)
const users = await usersCollection.find({
login,
}).toArray()
if (!users.length) return fn(new Error('невозможно найти пользователя'))
const [user] = users
hash({
password: pass, salt: user.salt,
}, (err, pass, salt, hash) => {
if (err) return fn(err)
if (hash === user.hash) return fn(null, user)
fn(new Error('неверный пароль'))
})
}
const setUsers = async (dataUsers) => {
if (db === null) throw new Error('no db connection')
const usersCollection = db.collection(USERS_COLL)
const data = await usersCollection.find({
$or: [{
login: dataUsers.login,
}, {
mail: dataUsers.mail,
}],
}).toArray()
if (data.length === 0) {
hash({
password: dataUsers.password, saltLength: 15,
}, (err, pass, salt, hash) => {
const users = {
}
const { login, password, mail } = {
...dataUsers,
}
users.login = login
users.name = login
users.mail = mail
users.hash = hash
users.salt = salt
usersCollection.insertMany([users])
})
return dataUsers
}
if (data.length !== 0) throw new Error('Почта или логин уже существует')
}
module.exports = {
connect,
getDepts,
getDeptData,
getPeoplesData,
createDept,
setUsers,
deleteDeptById,
authenticate,
}