Services_UserService.js

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;