From 9bc1b592d080204344b137151da0240ee3f177cc Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Thu, 17 Jul 2025 23:20:00 +0700 Subject: [PATCH] :triangular_flag_on_post: create basic flow for fetching user data --- .../http/userHeader/query/parseArrayQuery.ts | 11 +++++++ .../controller/getUserByEmail.controller.ts | 3 +- .../read/findUserByEmail.repository.ts | 30 ++++++++++++++++++- .../user/schemas/getUserOptions.schema.ts | 18 +++++------ .../services/http/getUserByEmail.service.ts | 8 ++++- 5 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 src/helpers/http/userHeader/query/parseArrayQuery.ts diff --git a/src/helpers/http/userHeader/query/parseArrayQuery.ts b/src/helpers/http/userHeader/query/parseArrayQuery.ts new file mode 100644 index 0000000..b3ee6ff --- /dev/null +++ b/src/helpers/http/userHeader/query/parseArrayQuery.ts @@ -0,0 +1,11 @@ +import { Context } from "elysia"; + +export const parseArrayQuery = ( + query: Context["query"], + key: string +): T[] => { + const raw = query[key]; + if (!raw) return []; + + return raw.split(",").map((s) => s.trim()) as T[]; +}; diff --git a/src/modules/user/controller/getUserByEmail.controller.ts b/src/modules/user/controller/getUserByEmail.controller.ts index 4f7b63c..19f22bd 100644 --- a/src/modules/user/controller/getUserByEmail.controller.ts +++ b/src/modules/user/controller/getUserByEmail.controller.ts @@ -4,11 +4,12 @@ import { mainErrorHandler } from "../../../helpers/error/handler"; import { getUserByEmailService } from "../services/http/getUserByEmail.service"; import { returnReadResponse } from "../../../helpers/callback/httpResponse"; import { getUserOptionsSchema } from "../schemas/getUserOptions.schema"; +import { getUserDataOptions } from "../user.types"; export const getUserByEmailController = async (ctx: Context) => { try { const params = getUserByIdSchema.parse(ctx.params); - const options = getUserOptionsSchema.parse(ctx.query); + const options = getUserOptionsSchema.parse(ctx.query) as getUserDataOptions; const getUserByEmail = await getUserByEmailService(params.email, options); return returnReadResponse(ctx.set, 200, "User data found", getUserByEmail); diff --git a/src/modules/user/repositories/read/findUserByEmail.repository.ts b/src/modules/user/repositories/read/findUserByEmail.repository.ts index 322eacd..684a5ad 100644 --- a/src/modules/user/repositories/read/findUserByEmail.repository.ts +++ b/src/modules/user/repositories/read/findUserByEmail.repository.ts @@ -9,6 +9,34 @@ export const findUserByEmailRepository = async ( where: { email, }, - omit: {}, + select: { + id: options.verbosity?.includes("full"), + name: ["full", "basic"].some((level) => + options.verbosity?.includes(level) + ), + username: ["full", "basic"].some((level) => + options.verbosity?.includes(level) + ), + email: options.verbosity?.includes("full"), + password: options.verbosity?.includes("full"), + birthDate: options.verbosity?.includes("full"), + gender: options.verbosity?.includes("full"), + phoneCC: options.verbosity?.includes("full"), + phoneNumber: options.verbosity?.includes("full"), + bioProfile: ["full", "basic"].some((level) => + options.verbosity?.includes(level) + ), + avatar: ["full", "basic"].some((level) => + options.verbosity?.includes(level) + ), + commentBackground: ["full", "basic"].some((level) => + options.verbosity?.includes(level) + ), + preferenceId: options.verbosity?.includes("full"), + verifiedAt: options.verbosity?.includes("full"), + disabledAt: options.verbosity?.includes("full"), + createdAt: options.verbosity?.includes("full"), + updatedAt: options.verbosity?.includes("full"), + }, }); }; diff --git a/src/modules/user/schemas/getUserOptions.schema.ts b/src/modules/user/schemas/getUserOptions.schema.ts index 6450518..30b460e 100644 --- a/src/modules/user/schemas/getUserOptions.schema.ts +++ b/src/modules/user/schemas/getUserOptions.schema.ts @@ -1,9 +1,6 @@ import z from "zod"; -const includeEnum = z.enum( - ["preference", "roles"], - "option: include value didn't match with enum types" -); +const includeOptions = ["preference", "roles"] as const; export const getUserOptionsSchema = z.object({ verbosity: z @@ -12,9 +9,12 @@ export const getUserOptionsSchema = z.object({ "option: verbosity value didn't match with enum types" ) .optional(), - include: z.preprocess((val) => { - if (Array.isArray(val)) return val; - if (typeof val === "string") return [val]; - return []; - }, z.array(includeEnum).optional()), + include: z + .string() + .optional() + .transform((val) => val?.split(",") ?? []) + .refine( + (arr) => arr.every((val) => includeOptions.includes(val.trim() as any)), + "option: include value didn't match with enum types" + ), }); diff --git a/src/modules/user/services/http/getUserByEmail.service.ts b/src/modules/user/services/http/getUserByEmail.service.ts index 4ff5636..634129a 100644 --- a/src/modules/user/services/http/getUserByEmail.service.ts +++ b/src/modules/user/services/http/getUserByEmail.service.ts @@ -1,8 +1,14 @@ +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { findUserByEmailRepository } from "../../repositories/read/findUserByEmail.repository"; import { getUserDataOptions } from "../../user.types"; export const getUserByEmailService = async ( email: string, options: getUserDataOptions ) => { - return email; + try { + return await findUserByEmailRepository(email, options); + } catch (error) { + ErrorForwarder(error); + } };