瀏覽代碼

getUserEventData

Vadim 3 月之前
父節點
當前提交
134236718c

+ 8 - 3
src/api/v_0.1.0/client/client-users-api.ts

@@ -2,11 +2,16 @@ 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) }),
+  GET_UserEventData = {
+    res: z.object({
+      code: z.enum(["success"]),
+      userData: z.array(
+        CustomField.extend({ userValue: z.string().nullable() }),
+      ),
+    }),
   };
 
-  POST_UserData = {
+  PATCH_UserEventData = {
     req: {
       userData: z.array(
         z.object({ fieldId: z.string().uuid(), value: z.string() }),

+ 17 - 24
src/api/v_0.1.0/types/pe-types.ts

@@ -1,32 +1,25 @@
 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 FieldTypeCode = z.enum([
+  "string",
+  "number",
+  "checkbox",
+  "audio",
+  "date",
 ]);
+export const Validator = z.object({
+  fieldType: z.string(),
+  code: z.string(),
+  name: z.string(),
+  value: z.string(),
+});
 
 export const CustomField = z.object({
-  fieldId: z.string().uuid(),
+  fieldDefinitionId: z.string().uuid(),
+  code: z.string().nullable(),
+  fieldTypeCode: FieldTypeCode,
   title: z.string(),
-  typeCode: FieldTypeCode,
-  options: z.array(z.string()),
-  mask: z.string(),
+  mask: z.string().nullable(),
+  options: z.array(z.string()).nullable(),
   validators: z.array(Validator),
 });

+ 70 - 0
src/modules/client/users/c-users-controller.ts

@@ -0,0 +1,70 @@
+// db
+import { selPool } from "#db";
+import { DbSchema } from "#db-schema";
+import { sql } from "slonik";
+
+// api
+import { api } from "#api";
+
+// other
+import { z } from "zod";
+
+import { RouterUtils } from "#utils/router-utils.js";
+
+import { Request, Response } from "express";
+import sessionService from "#modules/users/auth/services/session-service.js";
+import { Validator } from "#api/v_0.1.0/types/pe-types.js";
+
+class ClientUsersController {
+  async getUserEventData(
+    req: Request,
+    res: Response,
+    // next: NextFunction
+  ) {
+    const event = await sessionService.getCurrentEventFromReq(req);
+    const user = sessionService.getUserFromReq(req);
+
+    const userData = await selPool.any(sql.type(
+      z.object({
+        fieldDefinitionId: DbSchema.cf.customFieldDefinitions.fieldDefinitionId,
+        code: DbSchema.cf.customFieldDefinitions.code,
+        fieldTypeCode: DbSchema.cf.fieldTypes.code,
+        title: DbSchema.cf.customFieldDefinitions.title,
+        mask: DbSchema.cf.customFieldDefinitions.mask,
+        options: DbSchema.cf.customFieldDefinitions.options,
+        validators: z.array(Validator),
+        userValue: DbSchema.ev.userEventFieldValues.value,
+      }),
+    )`
+      select
+        uef.field_definition_id as "fieldDefinitionId",
+        cfwv.code,
+        cfwv.field_type_code as "fieldTypeCode",
+        cfwv.title,
+        cfwv.mask,
+        cfwv."options",
+        cfwv.validators,
+        uefv.value as "userValue"
+      from
+        ev.user_event_fields uef
+      join cf.custom_fields_with_validators cfwv on
+        uef.field_definition_id = cfwv.field_definition_id
+      left join ev.user_event_field_values uefv on
+        uef.field_definition_id = uefv.field_definition_id
+        and uefv.user_id = ${user.userId}
+      where
+        uef.event_id = ${event.eventId}
+    `);
+
+    RouterUtils.validAndSendResponse(
+      api.client.users.GET_UserEventData.res,
+      res,
+      {
+        code: "success",
+        userData: [...userData],
+      },
+    );
+  }
+}
+
+export const clientUsersController = new ClientUsersController();

+ 16 - 0
src/modules/client/users/c-users-router.ts

@@ -0,0 +1,16 @@
+import { RouterUtils } from "#utils/router-utils.js";
+
+import express from "express";
+import { clientUsersController } from "./c-users-controller.js";
+const router = express.Router();
+export default router;
+
+router.post(
+  "/userEventData",
+  RouterUtils.asyncHandler(clientUsersController.getUserEventData),
+);
+
+// router.get(
+//   "/event/:eventId",
+//   RouterUtils.asyncHandler(EventController.getEvent),
+// );