|
@@ -14,29 +14,45 @@ import { z } from "zod";
|
|
|
import bcript from "bcrypt";
|
|
|
import { v7 as uuidv7 } from "uuid";
|
|
|
|
|
|
-import tokenService from "../services/token-service.js";
|
|
|
import { UserAuthService } from "../services/user-auth-service.js";
|
|
|
-import { ConfirmPinsService } from "#modules/users/confirm-pins/confirm-pins-service.js";
|
|
|
+import { ConfirmPinsService } from "#modules/client/users/confirm-pins/confirm-pins-service.js";
|
|
|
import { RouterUtils } from "#utils/router-utils.js";
|
|
|
import { config } from "#config";
|
|
|
import { Request, Response } from "express";
|
|
|
+import { cUsersService } from "../../c-users-service.js";
|
|
|
+import sessionService from "../services/session-service.js";
|
|
|
+import tokenService from "../services/token-service.js";
|
|
|
+import { cCustomFieldsValidateService } from "#modules/client/custom-fields/c-cf-validate-service.js";
|
|
|
|
|
|
class authController {
|
|
|
// --- Регистрация ---
|
|
|
+ async getUserRegData(req: Request, res: Response) {
|
|
|
+ const event = await sessionService.getCurrentEventFromReq(req);
|
|
|
+
|
|
|
+ const regData = await cUsersService.getUserEventFieldsWithValidators(
|
|
|
+ event.eventId,
|
|
|
+ );
|
|
|
+
|
|
|
+ RouterUtils.validAndSendResponse(api.client.auth.GET_UserRegData.res, res, {
|
|
|
+ code: "success",
|
|
|
+ fields: [...regData],
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
async register(
|
|
|
req: Request,
|
|
|
res: Response,
|
|
|
// next: NextFunction
|
|
|
) {
|
|
|
// валидация запроса
|
|
|
- const { email } = api.auth.POST_Registration.req.parse(req.body);
|
|
|
+ const { email } = api.client.auth.POST_Registration.req.parse(req.body);
|
|
|
|
|
|
const isUserExist = await UserAuthService.checkUserExistByEmail(email);
|
|
|
|
|
|
// если пользователь уже зарегистрирован
|
|
|
if (isUserExist) {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_Registration.res,
|
|
|
+ api.client.auth.POST_Registration.res,
|
|
|
res,
|
|
|
{ code: "alreadyExists" },
|
|
|
400,
|
|
@@ -48,10 +64,14 @@ class authController {
|
|
|
// отправка пина
|
|
|
const transactionId = uuidv7();
|
|
|
try {
|
|
|
- await ConfirmPinsService.sendConfirmPin(transactionId, email);
|
|
|
+ await ConfirmPinsService.sendConfirmPin({
|
|
|
+ transactionId,
|
|
|
+ email,
|
|
|
+ actionType: "registration",
|
|
|
+ });
|
|
|
} catch {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_Registration.res,
|
|
|
+ api.client.auth.POST_Registration.res,
|
|
|
res,
|
|
|
{ code: "pinIsNotSent" },
|
|
|
400,
|
|
@@ -59,16 +79,25 @@ class authController {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- RouterUtils.validAndSendResponse(api.auth.POST_Registration.res, res, {
|
|
|
- code: "pinIsSent",
|
|
|
- transactionId: transactionId,
|
|
|
- });
|
|
|
+ RouterUtils.validAndSendResponse(
|
|
|
+ api.client.auth.POST_Registration.res,
|
|
|
+ res,
|
|
|
+ {
|
|
|
+ code: "pinIsSent",
|
|
|
+ transactionId: transactionId,
|
|
|
+ },
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
async confirmRegistration(req: Request, res: Response) {
|
|
|
// валидация запроса
|
|
|
- const { password, transactionId, confirmPin } =
|
|
|
- api.auth.POST_ConfirmRegistration.req.parse(req.body);
|
|
|
+ const { password, transactionId, confirmPin, fields } =
|
|
|
+ api.client.auth.POST_ConfirmRegistration.req.formData.body.parse(
|
|
|
+ JSON.parse(req.body.body),
|
|
|
+ );
|
|
|
+
|
|
|
+ const event = await sessionService.getCurrentEventFromReq(req);
|
|
|
+ const files = req.files;
|
|
|
|
|
|
// проверка пина
|
|
|
const pinInfo = await ConfirmPinsService.checkConfirmPin(
|
|
@@ -79,7 +108,7 @@ class authController {
|
|
|
switch (pinInfo.status) {
|
|
|
case "rotten": {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_ConfirmRegistration.res,
|
|
|
+ api.client.auth.POST_ConfirmRegistration.res,
|
|
|
res,
|
|
|
{ code: "pinIsRotten" },
|
|
|
400,
|
|
@@ -88,7 +117,7 @@ class authController {
|
|
|
}
|
|
|
case "tooManyTries": {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_ConfirmRegistration.res,
|
|
|
+ api.client.auth.POST_ConfirmRegistration.res,
|
|
|
res,
|
|
|
{ code: "tooManyTries" },
|
|
|
400,
|
|
@@ -97,7 +126,7 @@ class authController {
|
|
|
}
|
|
|
case "wrong": {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_ConfirmRegistration.res,
|
|
|
+ api.client.auth.POST_ConfirmRegistration.res,
|
|
|
res,
|
|
|
{
|
|
|
code: "pinIsWrong",
|
|
@@ -113,15 +142,55 @@ class authController {
|
|
|
const email = pinInfo.email;
|
|
|
// регистрация
|
|
|
const hashPassword = await bcript.hash(password, 3);
|
|
|
- const userId = uuidv7();
|
|
|
- await updPool.query(
|
|
|
- sql.unsafe`
|
|
|
- insert into usr.users
|
|
|
- (user_id, email, password)
|
|
|
- values
|
|
|
- (${userId}, ${email}, ${hashPassword})`,
|
|
|
+
|
|
|
+ // поля пользователя
|
|
|
+ const userData = await cUsersService.getUserEventFieldsWithValidators(
|
|
|
+ event.eventId,
|
|
|
);
|
|
|
|
|
|
+ const refFields = userData.map((f) => ({
|
|
|
+ ...f,
|
|
|
+ idKey: "userEfId",
|
|
|
+ }));
|
|
|
+
|
|
|
+ // валидация полей
|
|
|
+ const validationResult =
|
|
|
+ await cCustomFieldsValidateService.processAndValidateFields({
|
|
|
+ inputFields: fields,
|
|
|
+ referenceFields: refFields,
|
|
|
+ files,
|
|
|
+ idKey: "userEfId",
|
|
|
+ addOldValue: false,
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!validationResult.isValid)
|
|
|
+ throw ApiError.BadRequest(
|
|
|
+ "fieldsValidationFailed",
|
|
|
+ JSON.stringify(validationResult.messages),
|
|
|
+ );
|
|
|
+
|
|
|
+ const validatedFields = validationResult.checkedfields;
|
|
|
+ // вставляем в базу и сохраняем файлы
|
|
|
+ const userId = uuidv7();
|
|
|
+ await updPool.transaction(async (tr) => {
|
|
|
+ await tr.query(
|
|
|
+ sql.unsafe`
|
|
|
+ insert into usr.users
|
|
|
+ (user_id, email, password)
|
|
|
+ values
|
|
|
+ (${userId}, ${email}, ${hashPassword})`,
|
|
|
+ );
|
|
|
+
|
|
|
+ await cCustomFieldsValidateService.saveCustomFieldValuesInTransaction({
|
|
|
+ tr,
|
|
|
+ parentId: userId,
|
|
|
+ action: "userProfile",
|
|
|
+ inputFields: validatedFields,
|
|
|
+ files,
|
|
|
+ isDeleteBefore: false,
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
// токены
|
|
|
const { accessToken, refreshToken } = tokenService.generateTokens({
|
|
|
email,
|
|
@@ -132,7 +201,7 @@ class authController {
|
|
|
tokenService.setRefreshTokenInCookie(res, refreshToken);
|
|
|
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_ConfirmRegistration.res,
|
|
|
+ api.client.auth.POST_ConfirmRegistration.res,
|
|
|
res,
|
|
|
{
|
|
|
code: "registered",
|
|
@@ -147,7 +216,7 @@ class authController {
|
|
|
|
|
|
async login(req: Request, res: Response) {
|
|
|
// валидация запроса
|
|
|
- const { email, password } = api.auth.POST_Login.req.parse(req.body);
|
|
|
+ const { email, password } = api.client.auth.POST_Login.req.parse(req.body);
|
|
|
|
|
|
// поиск юзера
|
|
|
const user = await selPool.maybeOne(
|
|
@@ -169,7 +238,7 @@ class authController {
|
|
|
);
|
|
|
if (!user) {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_Login.res,
|
|
|
+ api.client.auth.POST_Login.res,
|
|
|
res,
|
|
|
{
|
|
|
code: "userNotFound",
|
|
@@ -182,7 +251,7 @@ class authController {
|
|
|
// если количество попыток превышено
|
|
|
if (user.wrongPassTries > config.PASSWORD_MAX_TRIES - 1) {
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_Login.res,
|
|
|
+ api.client.auth.POST_Login.res,
|
|
|
res,
|
|
|
{
|
|
|
code: "tooManyTries",
|
|
@@ -195,13 +264,13 @@ class authController {
|
|
|
}
|
|
|
|
|
|
// проверка пароля
|
|
|
- const isPassEquals = await bcript.compare(password, user.password);
|
|
|
+ const isPassEquals = await bcript.compare(password, user.password ?? "");
|
|
|
if (!isPassEquals) {
|
|
|
await UserAuthService.authTriesIncrement(user.userId);
|
|
|
const triesRemained = config.PASSWORD_MAX_TRIES - 1 - user.wrongPassTries;
|
|
|
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_Login.res,
|
|
|
+ api.client.auth.POST_Login.res,
|
|
|
res,
|
|
|
{
|
|
|
code: "passIsWrong",
|
|
@@ -225,7 +294,7 @@ class authController {
|
|
|
tokenService.setRefreshTokenInCookie(res, refreshToken);
|
|
|
|
|
|
RouterUtils.validAndSendResponse(
|
|
|
- api.auth.POST_Login.res,
|
|
|
+ api.client.auth.POST_Login.res,
|
|
|
res,
|
|
|
{
|
|
|
code: "success",
|
|
@@ -244,7 +313,7 @@ class authController {
|
|
|
await tokenService.removeToken(userData.userId, refreshToken);
|
|
|
res.clearCookie("refreshToken");
|
|
|
|
|
|
- RouterUtils.validAndSendResponse(api.auth.POST_Logout.res, res, {
|
|
|
+ RouterUtils.validAndSendResponse(api.client.auth.POST_Logout.res, res, {
|
|
|
code: "success",
|
|
|
});
|
|
|
}
|
|
@@ -257,9 +326,13 @@ class authController {
|
|
|
await tokenService.removeAllUserTokens(userData.userId);
|
|
|
res.clearCookie("refreshToken");
|
|
|
|
|
|
- RouterUtils.validAndSendResponse(api.auth.POST_LogoutAllDevices.res, res, {
|
|
|
- code: "success",
|
|
|
- });
|
|
|
+ RouterUtils.validAndSendResponse(
|
|
|
+ api.client.auth.POST_LogoutAllDevices.res,
|
|
|
+ res,
|
|
|
+ {
|
|
|
+ code: "success",
|
|
|
+ },
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
async refresh(req: Request, res: Response) {
|
|
@@ -286,7 +359,7 @@ class authController {
|
|
|
}),
|
|
|
)`select email from usr.users where user_id = ${userData.userId}`,
|
|
|
);
|
|
|
- if (!newUserData) {
|
|
|
+ if (!newUserData || !newUserData.email) {
|
|
|
throw ApiError.UnauthorizedError();
|
|
|
}
|
|
|
|
|
@@ -303,7 +376,7 @@ class authController {
|
|
|
|
|
|
tokenService.setRefreshTokenInCookie(res, newTokens.refreshToken);
|
|
|
|
|
|
- RouterUtils.validAndSendResponse(api.auth.POST_Refresh.res, res, {
|
|
|
+ RouterUtils.validAndSendResponse(api.client.auth.POST_Refresh.res, res, {
|
|
|
code: "success",
|
|
|
|
|
|
accessToken: newTokens.accessToken,
|