Эх сурвалжийг харах

Изменеа структура api

Vadim 4 сар өмнө
parent
commit
0d78b18796

+ 1 - 1
package.json

@@ -6,7 +6,7 @@
   "type": "module",
   "imports": {
     "#*": "./src/*",
-    "#api": "./src/api/api.ts",
+    "#api": "./src/api/v_0.1.0/api.ts",
     "#db": "./src/db/db.ts",
     "#db-schema": "./src/db/db-schema.ts",
     "#exceptions": "./src/exceptions/",

+ 12 - 0
src/api/v_0.1.0/api.ts

@@ -0,0 +1,12 @@
+import { authApi } from "./shared/auth-api.js";
+import { clientPartEntitiesApi } from "./client/client-pe-api.js";
+import { clientUsersApi } from "./client/client-users-api.js";
+
+export const api = {
+  auth: authApi,
+  admin: {},
+  client: {
+    pe: clientPartEntitiesApi,
+    users: clientUsersApi,
+  },
+};

+ 46 - 0
src/api/v_0.1.0/client/client-pe-api.ts

@@ -0,0 +1,46 @@
+import { CustomField } from "#api/v_0.1.0/types/pe-types.js";
+import { z } from "zod";
+
+class ClientPartEntitiesApi {
+  GET_PartEntities = {
+    res: z.object({
+      code: z.enum(["success"]),
+      partEntities: z.array(
+        z.object({ peId: z.string().uuid(), name: z.string() }),
+      ),
+    }),
+  };
+
+  GET_PeCreateTypeData = {
+    res: z.object({
+      code: z.enum(["success"]),
+      peType: z.object({
+        peTypeId: z.string().uuid(),
+        code: z.string(),
+        fields: z.array(CustomField),
+      }),
+    }),
+  };
+
+  GET_PartEntity = {
+    req: z.object({
+      peId: z.string().uuid(),
+    }),
+    res: z.object({
+      peId: z.string().uuid(),
+      name: z.string(),
+      members: z.array(
+        z.object({
+          memberId: z.string(),
+          userId: z.string().uuid(),
+          email: z.string().email(),
+          firstName: z.string(),
+          lastName: z.string(),
+          patronymic: z.string(),
+        }),
+      ),
+    }),
+  };
+}
+
+export const clientPartEntitiesApi = new ClientPartEntitiesApi();

+ 18 - 0
src/api/v_0.1.0/client/client-users-api.ts

@@ -0,0 +1,18 @@
+import { CustomField } from "#api/v_0.1.0/types/pe-types.js";
+import { z } from "zod";
+
+class ClientUsersApi {
+  GET_RequiredUserData = {
+    res: z.object({ code: z.enum(["success"]), fields: z.array(CustomField) }),
+  };
+
+  POST_UserData = {
+    req: {
+      userData: z.array(
+        z.object({ fieldId: z.string().uuid(), value: z.string() }),
+      ),
+    },
+  };
+}
+
+export const clientUsersApi = new ClientUsersApi();

+ 2 - 76
src/api/api.ts → src/api/v_0.1.0/shared/auth-api.ts

@@ -1,6 +1,6 @@
 import { z } from "zod";
 
-class authApi {
+class AuthApi {
   // /auth/registration
   POST_Registration = {
     req: z.object({
@@ -109,78 +109,4 @@ class authApi {
     }),
   };
 }
-export const AuthApi = new authApi();
-
-class partEntitiesApi {
-  GET_PartEntities = {
-    res: z.object({
-      code: z.enum(["success"]),
-      partEntities: z.array(
-        z.object({ peId: z.string().uuid(), name: z.string() }),
-      ),
-    }),
-  };
-
-  FieldTypeCode = z.enum(["text", "number", "checkbox", "audio"]);
-  Validator = z.discriminatedUnion("fieldType", [
-    z.object({
-      fieldType: z.literal("text"),
-      code: z.enum(["max", "min"]),
-      name: z.string(),
-      value: z.string(),
-    }),
-    z.object({
-      fieldType: z.literal("number"),
-      code: z.enum(["max", "min"]),
-      name: z.string(),
-      value: z.string(),
-    }),
-    z.object({
-      fieldType: z.literal("checkbox"),
-      code: z.literal("required"),
-      name: z.string(),
-      value: z.string(),
-    }),
-  ]);
-
-  CustomField = z.object({
-    fieldId: z.string().uuid(),
-    title: z.string(),
-    typeCode: this.FieldTypeCode,
-    options: z.array(z.string()),
-    mask: z.string(),
-    validators: z.array(this.Validator),
-  });
-
-  GET_PeCreateTypeData = {
-    res: z.object({
-      code: z.enum(["success"]),
-      peType: z.object({
-        peTypeId: z.string().uuid(),
-        code: z.string(),
-        fields: z.array(this.CustomField),
-      }),
-    }),
-  };
-
-  GET_PartEntity = {
-    req: z.object({
-      peId: z.string().uuid(),
-    }),
-    res: z.object({
-      peId: z.string().uuid(),
-      name: z.string(),
-      members: z.array(
-        z.object({
-          memberId: z.string(),
-          userId: z.string().uuid(),
-          email: z.string().email(),
-          firstName: z.string(),
-          lastName: z.string(),
-          patronymic: z.string(),
-        }),
-      ),
-    }),
-  };
-}
-export const PartEntitiesApi = new partEntitiesApi();
+export const authApi = new AuthApi();

+ 32 - 0
src/api/v_0.1.0/types/pe-types.ts

@@ -0,0 +1,32 @@
+import { z } from "zod";
+
+export const FieldTypeCode = z.enum(["text", "number", "checkbox", "audio"]);
+export const Validator = z.discriminatedUnion("fieldType", [
+  z.object({
+    fieldType: z.literal("text"),
+    code: z.enum(["max", "min"]),
+    name: z.string(),
+    value: z.string(),
+  }),
+  z.object({
+    fieldType: z.literal("number"),
+    code: z.enum(["max", "min"]),
+    name: z.string(),
+    value: z.string(),
+  }),
+  z.object({
+    fieldType: z.literal("checkbox"),
+    code: z.literal("required"),
+    name: z.string(),
+    value: z.string(),
+  }),
+]);
+
+export const CustomField = z.object({
+  fieldId: z.string().uuid(),
+  title: z.string(),
+  typeCode: FieldTypeCode,
+  options: z.array(z.string()),
+  mask: z.string(),
+  validators: z.array(Validator),
+});

+ 18 - 18
src/modules/users/auth/routers/auth-controller.ts

@@ -4,7 +4,7 @@ import { DbSchema } from "#db-schema";
 import { sql } from "slonik";
 
 // api
-import { AuthApi } from "#api";
+import { api } from "#api";
 
 // error
 import { ApiError } from "#exceptions/api-error.js";
@@ -29,14 +29,14 @@ class authController {
     // next: NextFunction
   ) {
     // валидация запроса
-    const { email } = AuthApi.POST_Registration.req.parse(req.body);
+    const { email } = api.auth.POST_Registration.req.parse(req.body);
 
     const isUserExist = await UserAuthService.checkUserExistByEmail(email);
 
     // если пользователь уже зарегистрирован
     if (isUserExist) {
       RouterUtils.validAndSendResponse(
-        AuthApi.POST_Registration.res,
+        api.auth.POST_Registration.res,
         res,
         { code: "alreadyExists" },
         400,
@@ -51,7 +51,7 @@ class authController {
       await ConfirmPinsService.sendConfirmPin(transactionId, email);
     } catch {
       RouterUtils.validAndSendResponse(
-        AuthApi.POST_Registration.res,
+        api.auth.POST_Registration.res,
         res,
         { code: "pinIsNotSent" },
         400,
@@ -59,7 +59,7 @@ class authController {
       return;
     }
 
-    RouterUtils.validAndSendResponse(AuthApi.POST_Registration.res, res, {
+    RouterUtils.validAndSendResponse(api.auth.POST_Registration.res, res, {
       code: "pinIsSent",
       transactionId: transactionId,
     });
@@ -68,7 +68,7 @@ class authController {
   async confirmRegistration(req: Request, res: Response) {
     // валидация запроса
     const { password, transactionId, confirmPin } =
-      AuthApi.POST_ConfirmRegistration.req.parse(req.body);
+      api.auth.POST_ConfirmRegistration.req.parse(req.body);
 
     // проверка пина
     const pinInfo = await ConfirmPinsService.checkConfirmPin(
@@ -79,7 +79,7 @@ class authController {
     switch (pinInfo.status) {
       case "rotten": {
         RouterUtils.validAndSendResponse(
-          AuthApi.POST_ConfirmRegistration.res,
+          api.auth.POST_ConfirmRegistration.res,
           res,
           { code: "pinIsRotten" },
           400,
@@ -88,7 +88,7 @@ class authController {
       }
       case "tooManyTries": {
         RouterUtils.validAndSendResponse(
-          AuthApi.POST_ConfirmRegistration.res,
+          api.auth.POST_ConfirmRegistration.res,
           res,
           { code: "tooManyTries" },
           400,
@@ -97,7 +97,7 @@ class authController {
       }
       case "wrong": {
         RouterUtils.validAndSendResponse(
-          AuthApi.POST_ConfirmRegistration.res,
+          api.auth.POST_ConfirmRegistration.res,
           res,
           {
             code: "pinIsWrong",
@@ -132,7 +132,7 @@ class authController {
     tokenService.setRefreshTokenInCookie(res, refreshToken);
 
     RouterUtils.validAndSendResponse(
-      AuthApi.POST_ConfirmRegistration.res,
+      api.auth.POST_ConfirmRegistration.res,
       res,
       {
         code: "registered",
@@ -147,7 +147,7 @@ class authController {
 
   async login(req: Request, res: Response) {
     // валидация запроса
-    const { email, password } = AuthApi.POST_Login.req.parse(req.body);
+    const { email, password } = api.auth.POST_Login.req.parse(req.body);
 
     // поиск юзера
     const user = await selPool.maybeOne(
@@ -169,7 +169,7 @@ class authController {
     );
     if (!user) {
       RouterUtils.validAndSendResponse(
-        AuthApi.POST_Login.res,
+        api.auth.POST_Login.res,
         res,
         {
           code: "userNotFound",
@@ -182,7 +182,7 @@ class authController {
     // если количество попыток превышено
     if (user.wrongPassTries > config.PASSWORD_MAX_TRIES - 1) {
       RouterUtils.validAndSendResponse(
-        AuthApi.POST_Login.res,
+        api.auth.POST_Login.res,
         res,
         {
           code: "tooManyTries",
@@ -201,7 +201,7 @@ class authController {
       const triesRemained = config.PASSWORD_MAX_TRIES - 1 - user.wrongPassTries;
 
       RouterUtils.validAndSendResponse(
-        AuthApi.POST_Login.res,
+        api.auth.POST_Login.res,
         res,
         {
           code: "passIsWrong",
@@ -225,7 +225,7 @@ class authController {
     tokenService.setRefreshTokenInCookie(res, refreshToken);
 
     RouterUtils.validAndSendResponse(
-      AuthApi.POST_Login.res,
+      api.auth.POST_Login.res,
       res,
       {
         code: "success",
@@ -244,7 +244,7 @@ class authController {
     await tokenService.removeToken(userData.userId, refreshToken);
     res.clearCookie("refreshToken");
 
-    RouterUtils.validAndSendResponse(AuthApi.POST_Logout.res, res, {
+    RouterUtils.validAndSendResponse(api.auth.POST_Logout.res, res, {
       code: "success",
     });
   }
@@ -257,7 +257,7 @@ class authController {
     await tokenService.removeAllUserTokens(userData.userId);
     res.clearCookie("refreshToken");
 
-    RouterUtils.validAndSendResponse(AuthApi.POST_LogoutAllDevices.res, res, {
+    RouterUtils.validAndSendResponse(api.auth.POST_LogoutAllDevices.res, res, {
       code: "success",
     });
   }
@@ -301,7 +301,7 @@ class authController {
       newTokens.refreshToken,
     );
 
-    RouterUtils.validAndSendResponse(AuthApi.POST_Refresh.res, res, {
+    RouterUtils.validAndSendResponse(api.auth.POST_Refresh.res, res, {
       code: "success",
 
       accessToken: newTokens.accessToken,