/var/www/greso.tech/server/nsm/controllers/auth
Edit: /var/www/greso.tech/server/nsm/controllers/auth/signin.js (4512B)
module.exports = function ({ db, logger }) {
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const RefreshTokenUtils = require('../../utils/refreshToken.util')
const { NotFound, BadRequest } = require('../../responseModels/errors')
const { isSet, isEmail, isPhone, isEmpty, minLength, isNumber } = require('../../utils/validator.util')
return async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
let t1 = performance.now()
try {
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
let foundUserEmail = null
if (isSet(googleId) && !isEmpty(googleId)) {
// google авторизация
// найти пользователя по googleId
foundUser = await db.user.findOne({ where: { googleId } })
if (!foundUser) {
// не нашли
// найти по email
const roleId = 7; // Client TODO role key
foundUser = await db.userEmail.findOne({ where: { email: login } })
if (!foundUser) {
// create user
foundUser = await db.user.create({
roleId,
googleId
})
// create email
foundUser = await db.userEmail.create({
name: name,
email: login,
})
// !!! создается без логина
// !!! нужно дать пользователю возможность создать логин если его нет
} else {
// если нашли присвоить googleId
foundUser.googleId = googleId
await foundUser.save()
}
}
} else {
// авторизация по логину и паролю
if ((!isSet(login) || isEmpty(login)) && !isPhone(login) && !isEmail(login)) {
throw new BadRequest({
code: 1002,
lang: req.user?.languageCode
})
}
if (!isSet(password) || isEmpty(password)) {
throw new BadRequest({
code: 1005,
lang: req.user?.languageCode
})
}
if (isEmail(login)) { // auth by email
try{
foundUserEmail = (
await db.userEmail.findOne({ where: { email: login } })
)
foundUser = (
await db.user.findOne({ where: { id: foundUserEmail.userId } })
)
}catch(e){
throw new BadRequest({
code: 2081,
lang: req.user?.languageCode
})
}
}
if (!foundUser || !foundUserEmail) {
throw new NotFound({
code: 1007,
lang: req.user?.languageCode
})
}
if (foundUserEmail) {
const passwordIsValid = await bcrypt.compare(password, foundUserEmail.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
})
const time = performance.now() - t1
return res.status(200).json({ accessToken, refreshToken, time })
} catch (err) {
next(err)
}
}
}