289 lines
7.1 KiB
JavaScript
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,
|
||
|
}
|