Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const sha512 = require('js-sha512');
  2. const iplocation = require("iplocation").default;
  3. const crypto = require('crypto');
  4.  
  5. module.exports = function (db, Sequelize, app)
  6. {
  7.     let User = db.define('user',
  8.     {
  9.         id: {
  10.             type: Sequelize.UUID,
  11.             defaultValue: Sequelize.UUIDV1,
  12.             unique: true,
  13.             primaryKey: true
  14.         },
  15.         country: {
  16.             type: Sequelize.STRING,
  17.             allowNull: true
  18.         },
  19.         nickname: {
  20.             type: Sequelize.STRING,
  21.             allowNull: false,
  22.             unique: true,
  23.             validate: {
  24.                 len: {
  25.                     args: [3, 16],
  26.                     msg: "The nickname must be between 3 and 16 characters in length"
  27.                 }
  28.             }  
  29.         },
  30.         email: {
  31.             type: Sequelize.STRING,
  32.             allowNull: false,
  33.             unique: true,
  34.             validate: {
  35.                 len: {
  36.                     args: [6, 128],
  37.                     msg: "Email address must be between 6 and 128 characters in length"
  38.                 },
  39.                 isEmail: {
  40.                     msg: "Email address must be valid"
  41.                 }
  42.             }
  43.         },
  44.         password: {
  45.             type: Sequelize.STRING,
  46.             allowNull: false,
  47.             validate: {
  48.                 len: {
  49.                     args: 6
  50.                 }
  51.             }
  52.         },
  53.         activated: {
  54.             type: Sequelize.BOOLEAN,
  55.             defaultValue: 0
  56.         },
  57.         ban: {
  58.             type: Sequelize.BOOLEAN,
  59.             defaultValue: 0
  60.         },
  61.         ban_start: {
  62.             type: Sequelize.DATE,
  63.             allowNull: true
  64.         },
  65.         ban_end: {
  66.             type: Sequelize.DATE,
  67.             allowNull: true
  68.         },
  69.         role: {
  70.             type: Sequelize.ENUM('user', 'admin')
  71.         },
  72.         passwordAt: {
  73.             type: Sequelize.DATE,
  74.             allowNull: true
  75.         },
  76.         lastSeen: {
  77.             type: Sequelize.DATE,
  78.             allowNull: true
  79.         },
  80.         activatedAt: {
  81.             type: Sequelize.DATE,
  82.             allowNull: true
  83.         },
  84.         resetAt: {
  85.             type: Sequelize.DATE,
  86.             allowNull: true
  87.         },
  88.         resetKey: {
  89.             type: Sequelize.STRING
  90.         },
  91.         activationKey:
  92.         {
  93.             type: Sequelize.STRING
  94.         }
  95.     });
  96.  
  97.     User.associate = function (models) {
  98.         User.hasMany(models.character);
  99.     }
  100.  
  101.     User.login = function (payload)
  102.     {
  103.         return new Promise((resolve, reject) => {
  104.             // Check errors
  105.             let errors = [];
  106.  
  107.             if (typeof payload.email == 'undefined' || payload.email.length == 0)
  108.                 errors.push("The email can't be empty");
  109.             else if (typeof payload.password == 'undefined' || payload.password.length == 0)
  110.                 errors.push("The password can't be empty");
  111.  
  112.             if (Object.keys(errors).length == 0) {
  113.                 return app.models.user.findOne({
  114.                     where: {
  115.                         email: payload.email,
  116.                         password: sha512(payload.password)
  117.                     }
  118.                 }).then(user => {
  119.                     if (user == null) reject("Authentication failed");
  120.                     else if (user.activated == 0) reject("Please activate your account.")
  121.                     else resolve(user);
  122.                 }).catch(error => reject(error));
  123.             } else {
  124.                 reject(errors);
  125.             }
  126.         });
  127.     }
  128.  
  129.     User.register = function (socket, payload)
  130.     {
  131.         return new Promise((resolve, reject) =>
  132.         {
  133.             // Check errors
  134.             let errors = [];
  135.  
  136.             if (typeof payload.nickname == 'undefined' || payload.nickname.length == 0)
  137.                 errors.push("The nickname can't be empty");
  138.             else if (typeof payload.email == 'undefined' || payload.email.length == 0)
  139.                 errors.push("The email can't be empty");
  140.             else if (typeof payload.password == 'undefined' || payload.password.length == 0)
  141.                 errors.push("The password can't be empty");
  142.             else if (payload.password.length < 6)
  143.                 errors.push("The password should be at least 6 characters");
  144.  
  145.             if (Object.keys(errors).length == 0)
  146.             {
  147.                 let defaultDate = '1000-01-01 00:00:00';
  148.                 let now = new Date();
  149.                 let location = null;
  150.  
  151.                 // Get Ip location
  152.                 return iplocation(socket.handshake.address, [], (error, res) =>
  153.                 {
  154.                     if (!error)
  155.                         location = res.country;
  156.  
  157.                     // Generate activation key
  158.                     return User.generateActionKey().then(activationKey =>
  159.                     {
  160.                         // Insert user into database
  161.                         return app.models.user.create({
  162.                             nickname      : payload.nickname,
  163.                             email         : payload.email,
  164.                             password      : sha512(payload.password),
  165.                             country       : location,
  166.                             activated     : 0,
  167.                             ban           : 0,
  168.                             ban_start     : defaultDate,
  169.                             ban_end       : defaultDate,
  170.                             role          : 'user',
  171.                             passwordAt    : defaultDate,
  172.                             lastSeen      : defaultDate,
  173.                             activatedAt   : defaultDate,
  174.                             resetAt       : defaultDate,
  175.                             resetKey      : null,
  176.                             activationKey : activationKey,
  177.                             createdAt     : now,
  178.                             updatedAt     : defaultDate
  179.                         })
  180.                         .then(user => {
  181.                             resolve(user);
  182.                         })
  183.                         .catch(error => reject(error));
  184.                     }).catch(error => reject(error));
  185.                 });
  186.             }
  187.             else
  188.                 reject(errors);
  189.         });
  190.     }
  191.  
  192.     User.resetPassword = payload => {
  193.         return new Promise((resolve, reject) => {
  194.             let errors = [];
  195.  
  196.             if (typeof payload.email == 'undefined' || payload.email.length == 0)
  197.                 errors.push("The email can't be empty");
  198.  
  199.             if (Object.keys(errors).length == 0) {
  200.                 return app.models.user.findOne({
  201.                     where: {
  202.                         email: payload.email
  203.                     }
  204.                 }).then(user => {
  205.                     if (user == null) reject('Account not found')
  206.                     else if (user.activated == 0) reject('Please first activate your account')
  207.                     else if (user.resetKey != null) reject('A password reset process is already pending.')
  208.                     else {
  209.                         return User.generateActionKey().then(key => {
  210.                             return User.update({ resetKey: key }, { where: { email: user.email } }).then(reset => {
  211.                                 resolve(true);
  212.                             }).catch(error => reject(error));
  213.                         }).catch(error => reject(error));
  214.                     }
  215.                 }).catch(error => reject(error))
  216.             }
  217.             else {
  218.                 reject(errors);
  219.             }
  220.         });
  221.     }
  222.  
  223.     User.generateActionKey = (size = 48) => {
  224.         return new Promise((res, rej) => {
  225.             return crypto.randomBytes(size, (err, buffer) => {
  226.                 if (err) rej(err);
  227.                 else res(buffer.toString('hex'));
  228.             });
  229.         })
  230.     }
  231.  
  232.     User.activate = token => {
  233.  
  234.     }
  235.  
  236.     return User;
  237. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement