const CrudService = require('./CrudService');
const crypto = require('crypto');
/**
* @extends Myintranet.Services.CrudService
* @memberof Myintranet.Services
* @inheritDoc
*/
class UserService extends CrudService {
constructor(db) {
super(db.User);
this.db = db;
}
async getAll() {
let {db} = this;
let condition = {};
return await db.User.findAll(condition);
}
async update(request) {
let id = this.__getIdFromRequest(request);
let data = request.body;
let {db} = this;
if (data.password && data.password.length < 40) {
let pAndS = this._getPasswordAndSalt(data.password);
data.password = pAndS.password;
data.salt = pAndS.salt;
} else {
delete data.password;
delete data.salt;
}
// let person = data.person;
// data.login = person.email;
// return db.Person.update(person, {where: {id: person.id}}).then(() => {
await db.User.update(data, {
where: {id}
});
return await this.getOne(request)
// })
}
getOne(request) {
let {db} = this;
let id = this.__getIdFromRequest(request)
let condition = {
where: {id},
include: db.Consultant
};
return db.User.findOne(condition);
}
// /**
// *
// */
// getOne(id) {
// let condition = id?{where:{id}}:{include:[{ model: db.Etablissement }]};
// return new Promise((resolve, reject) => {
// this.model.findOne(condition).then(user=>{
// resolve(user);
// }).catch(err=>{
// reject(err);
// })
// });
// }
_getPasswordAndSalt(clearPassword) {
let length = 32;
let salt = crypto.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, 32);
let hash = crypto.createHmac('sha512', salt);
hash.update(clearPassword);
let password = hash.digest('hex');
return {password, salt};
}
add(request) {
let {db} = this;
let User = request.body;
let crypted = this._getPasswordAndSalt(User.password || "123456");
User.password = crypted.password;
User.salt = crypted.salt;
return db.User.create(User, {include: [db.Consultant]});
}
delete(request) {
let {db} = this;
let id = this.__getIdFromRequest(request);
let user = {request};
return new Promise((resolve, reject) => {
db.User.findOne({where: {id}, include: db.Consultant}).then(userToDelete => {
//console.log("***********************************************************************************")
//console.log(userToDelete.type.toLowerCase())
if (userToDelete.type.toLowerCase() == "admin") {
reject(new Error('Impossible de supprimer un Administrateur '));
} else {
db.User.destroy({
where: {id}
}).then(() => {
resolve()
}).catch(err => {
reject(err);
});
}
})
});
// return db.User.destroy({where: {id}, include: db.Person});
}
deleteUserTransactio() {
return new Promise((resolve, reject) => {
sequelize.transaction().then(t => {
try {
// add here the transaction to delete user and associated entities
t.commit().then(() => {
resolve();
})
} catch (error) {
// If the execution reaches this line, an error was thrown.
// We rollback the transaction.
t.rollback().then(() => {
reject(error);
})
}
})
})
}
register(email, password) {
}
}
module.exports = UserService;