/var/www/qr4y.gr/server/delivery/api/controllers
NameSizeModeActions
tableReserv/-0755rm
userAccount/-0755rm
auth.controller.js123060644editdlrm
branch.controller.js251870644editdlrm
branchReview.controller.js56200644editdlrm
category.controller.js55210644editdlrm
company.controller.js205950644editdlrm
companyReview.controller.js57730644editdlrm
companyTypes.controller.js27220644editdlrm
countryCodes.controller.js26480644editdlrm
delivery.controller.js74700644editdlrm
deliveryTypes.controller.js23970644editdlrm
driver.controller.js46030644editdlrm
language.controller.js27090644editdlrm
order.controller.js313010644editdlrm
orderCancelCause.controller.js34600644editdlrm
payTypes.controller.js22780644editdlrm
permission.controller.js26050644editdlrm
product.controller.js257930644editdlrm
productGroups.controller.js65680644editdlrm
productReview.controller.js52330644editdlrm
productTypeFeatures.controller.js27130644editdlrm
productTypes.controller.js41540644editdlrm
role.controller.js40120644editdlrm
room.controller.js34570644editdlrm
table.controller.js154950644editdlrm
user.controller.js217940644editdlrm
userCart.controller.js72310644editdlrm
waiter.controller.js61730644editdlrm
Edit: /var/www/qr4y.gr/server/delivery/api/controllers/auth.controller.js (12306B)
const bcrypt = require('bcryptjs') const jwt = require('jsonwebtoken') const config = require('../../config/app.json') const logger = require('../../logger')({ service: 'api' }) const { isSet, isEmail, isPhone, isEmpty, minLength } = require('../utils/validator.util') const RefreshTokenUtils = require('../utils/refreshToken.util') const { Op } = require('sequelize') const { BadRequest, Forbidden, NotFound } = require('../responseModels/errors') module.exports = function ({ db }) { // Логин this.SignIn = async (req, res, next) => { try { logger.child({ path: req.path }).info() const { login, password, app, platform, deviceId, googleId, googleName, googleToken } = req.body const ipAddress = req.headers['x-forwarded-for'] || req.socket.remoteAddress const userAgent = req.get('User-Agent') let name = isSet(googleName)?googleName:'' if (!isSet(platform)) { throw new BadRequest({ code: 1017, lang: req.user?.languageCode }) } if (!isSet(app)) { throw new BadRequest({ code: 1018, lang: req.user?.languageCode }) } if (!isSet(deviceId)) { throw new BadRequest({ code: 1019, lang: req.user?.languageCode }) } let foundUser = null if (isSet(googleId) && !isEmpty(googleId)) { // google авторизация // найти пользователя по googleId foundUser = await db.user.findOne({ where: { googleId } }) if (!foundUser) { // не нашли // найти по email foundUser = await db.user.findOne({ where: { email:login } }) if(!foundUser){ // если не нашли создать foundUser = await db.user.create({ name: name, email: login, googleId }) // !!! создается без логина // !!! нужно дать пользователю возможность создать логин если его нет }else{ // если нашли присвоить googleId foundUser.googleId = googleId await foundUser.save() } } } else { // авторизация по логину и паролю if (!isSet(login) || isEmpty(login)) { throw new BadRequest({ code: 1002, lang: req.user?.languageCode }) } if (!isSet(password) || isEmpty(password)) { throw new BadRequest({ code: 1005, lang: req.user?.languageCode }) } foundUser = ( await db.user.findOne({ include: [ { model: db.userPhone } ], where: { [Op.or]: [ { '$user.login$': login }, { '$user.email$': login }, // { '$userPhones.phone$': login } // TODO: поиск по номеру не работает ] } }) ) if (!foundUser) { throw new BadRequest({ code: 1007, lang: req.user?.languageCode }) } if (foundUser) { const passwordIsValid = await bcrypt.compare(password, foundUser.passwordHash) if (!passwordIsValid) { throw new BadRequest({ code: 1007, lang: req.user?.languageCode }) } } } let accessToken = await RefreshTokenUtils.createAccessToken({ db, app, deviceId, platform, userId: foundUser.id }) let refreshToken = await db.refreshToken.findOne({ where: { app, deviceId, userId: foundUser.id } }) if (refreshToken !== null) { await db.refreshToken.destroy({ where: { id: refreshToken.id } }) } refreshToken = await RefreshTokenUtils.createRefreshToken({ db, app, deviceId, platform, userId: foundUser.id }) if (googleToken) { const gToken = await db.userGoogleToken.findOne({ where: { token: googleToken } }) if (gToken) { //обновить gToken.token = googleToken gToken.save() } else { // создать db.userGoogleToken.create({ token: googleToken, userId: foundUser.id, deviceId: deviceId }) } } db.userLoginHistory.create({ ipAddress, userAgent, app, deviceId, platform, userId: foundUser.id }) return res.status(200).json({ accessToken, refreshToken }) } catch (err) { next(err) } } //Выход this.SignOut = async (req, res, next) => { logger.child({ path: req.path, request: req.user }).info() try { const { uid } = req.user const user = await db.user.findOne({ where: { uid } }) await db.refreshToken.destroy({ where: { userId: user.id } }) req.user = null return res.status(200).json({ status: 'success' }) } catch (err) { next(err) } } // Регистрация this.SignUp = async (req, res, next) => { logger.child({ path: req.path }).info() try { const { login, name, email, phone, password, passwordConfirm, googleId, languageId } = req.body // Role ID const roleId = 7; // Client // Not required // if (!isSet(login) || isEmpty(login)) { // throw new BadRequest({ // code: 1002, // lang: req.user?.languageCode // }) // } if (!isSet(name) || isEmpty(name)) { throw new BadRequest({ code: 1001, lang: req.user?.languageCode }) } if (!minLength(name, 4)) { throw new BadRequest({ code: 1009, lang: req.user?.languageCode }) } if (!isSet(email) || !isEmail(email)) { throw new BadRequest({ code: 1003, lang: req.user?.languageCode }) } if (!isSet(languageId) || languageId == 0) { throw new BadRequest({ code: 1024, lang: req.user?.languageCode }) } let foundUser = null let newUser = null if (isSet(googleId) && !isEmpty(googleId)) { // найти пользователя по googleId foundUser = await db.user.findOne({ where: { googleId } }) if (foundUser) { throw new BadRequest({ code: 1008, lang: req.user?.languageCode }) } // найти пользователся по email foundUser = await db.user.findOne({ where: { email } }) if (!foundUser) { // если не нашли создать нового newUser = await db.user.create({ login, name, email, googleId, roleId, languageId }) } else { // если нашли присвоить googleId foundUser.googleId = googleId await foundUser.save() } } else { // if (!isSet(phone) || !isPhone(phone)) { // throw new BadRequest({ // code: 1004, // lang: req.user?.languageCode // }) // } if (!isSet(password) || isEmpty(password)) { throw new BadRequest({ code: 1005, lang: req.user?.languageCode }) } if (password != passwordConfirm) { throw new BadRequest({ code: 1006, lang: req.user?.languageCode }) } // if (!minLength(login, 4)) { // throw new BadRequest({ // code: 1010, // lang: req.user?.languageCode // }) // } if (!minLength(password, 4)) { throw new BadRequest({ code: 1011, lang: req.user?.languageCode }) } let op_or = [ { '$user.email$': email }, ] if(isSet(login) && !isEmpty(login)){ op_or.push({ '$user.login$': login }) } if(isSet(phone) && !isEmpty(phone)){ op_or.push({ '$userPhone.phone$': phone }) } foundUser = ( await db.userPhone.findOne({ include: ['user'], where: { [Op.or]: op_or } }) )?.user if (foundUser) { throw new BadRequest({ code: 1008, lang: req.user?.languageCode }) } // сгенегрировать хэш пароля const salt = await bcrypt.genSalt(10) const passwordHash = await bcrypt.hash(password, salt) // Params let params = { name, email, passwordHash, roleId, languageId, } if(isSet(login) && !isEmpty(login)){ params.login = login } if(isSet(phone) && !isEmpty(phone)){ params.userPhones = [ { phone } ] } let include = null; if(isSet(phone) && !isEmpty(phone)){ include = { include: ['userPhones'] } } // создать запись в базе newUser = await db.user.create(params, include) } return res.status(200).json({ status: 'success', uid: newUser.uid }) } catch (err) { next(err) } } // Обновление токена this.RefreshToken = async (req, res, next) => { logger.child({ path: req.path, request: req.body }).info() try { const { refreshToken } = req.body if (!isSet(refreshToken)) { throw new Forbidden({ lang: req.user?.languageCode }) } let token = await db.refreshToken.findOne({ where: { token: refreshToken } }) if (!token) { throw new Forbidden({ lang: req.user?.languageCode }) } if (!RefreshTokenUtils.verify(token)) { throw new Forbidden({ code: 1011, lang: req.user?.languageCode }) } const { app, deviceId, platform, userId } = token const accessToken = await RefreshTokenUtils.createAccessToken({ db, app, deviceId, platform, userId }) return res.status(200).json({ accessToken: accessToken, refreshToken: token.token }) } catch (err) { next(err) } } this.ResetPassword = async (req, res, next) => { logger.child({ path: req.path, request: req.body }).info() try { // разбор и валидация запроса const { email } = req.body if (!isSet(email) || isEmpty(email)) { throw new BadRequest({ code: 1003, lang: req.user?.languageCode }) } // найти пользователя const user = await db.user.findOne({ where: { email: email } }) if (!user) { throw new NotFound({ lang: req.user?.languageCode }) } // сгенрировать токен const resetPasswordToken = jwt.sign( { uid: user.uid }, config.jwt.secret, { expiresIn: config.jwt.confirmTokenExpires } ) const nodemailer = require('nodemailer') const smtpProtocol = nodemailer.createTransport({ host: config.mail.smtpServer, port: config.mail.smtpPort, secure: true, auth: { user: config.mail.userName, pass: config.mail.password } }) const message = { from: config.mail.userName, // адрес отправителя to: email, // список получателей "mailto1, mailto2" subject: 'Сброс пароля', // заголовок //text: 'text', html: `Для сброса пароля перейдите по ссылке.` } // отправка сообщения const result = await smtpProtocol.sendMail(message) return res.status(200).json(result) } catch (err) { next(err) } } this.ResetPasswordConfirm = async (req, res, next) => { logger.child({ path: req.path, request: req.body }).info() try { // разбор и валидация запроса const { token, newPassword, newPasswordConfirm } = req.body if (!isSet(token) || isEmpty(token)) { throw new BadRequest({ code: 1011, lang: req.user?.languageCode }) } if (!isSet(newPassword) || isEmpty(newPassword)) { throw new BadRequest({ code: 1005, lang: req.user?.languageCode }) } if (newPassword != newPasswordConfirm) { throw new BadRequest({ code: 1006, lang: req.user?.languageCode }) } // декодировать токен const decodedToken = jwt.verify(token, config.jwt.secret) if (!decodedToken || !decodedToken.uid) { throw new NotFound({ lang: req.user?.languageCode }) } // найти пользователя let user = await db.user.findOne({ where: { uid: decodedToken.uid } }) if (!user) { throw new NotFound({ lang: req.user?.languageCode }) } // сгененировать соль и создать хэш пароля const salt = await bcrypt.genSalt(10) user.passwordHash = await bcrypt.hash(newPassword, salt) await user.save() return res.status(200).json({ status: 'success' }) } catch (err) { next(err) } } }