From 5c6e072622dbd6228a6fb49953d600bfa29f262e Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Sun, 20 Jul 2025 15:06:38 +0700 Subject: [PATCH] :necktie: add include option on find user repository add include option for spicify which associated data that want to retrive along with user data response --- .gitlab-ci.yml | 8 ++++++-- .../read/findUserByEmail.repository.ts | 15 ++++++++++++++- .../repositories/read/findUserById.repository.ts | 15 ++++++++++++++- .../read/findUserByUsername.repository.ts | 15 ++++++++++++++- .../user/services/internal/findUser.service.ts | 2 +- src/modules/user/user.types.ts | 3 ++- 6 files changed, 51 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82bbf1b..6af74a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,9 +12,11 @@ build_app: - bun i - bun run route:sync - bun build --compile --minify-whitespace --minify-syntax --target bun --outfile "server-compiled" ./src/index.ts + - echo $CI_JOB_ID > build_job_id.txt artifacts: paths: - server-compiled + - build_job_id.txt expire_in: 1 hour rules: - if: $CI_COMMIT_TAG @@ -26,7 +28,9 @@ create_release: - job: build_app artifacts: true script: - - echo "Creating release and uploading server-compiled... (link:\ ${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/server-compiled)" + - echo "Creating release and uploading server-compiled..." + - export BUILD_JOB_ID=$(cat build_job_id.txt) + - echo "Using BUILD_JOB_ID=$BUILD_JOB_ID" release: name: "Release $CI_COMMIT_TAG" tag_name: "$CI_COMMIT_TAG" @@ -34,6 +38,6 @@ create_release: assets: links: - name: "server-compiled" - url: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/server-compiled" + url: "${CI_PROJECT_URL}/-/jobs/${BUILD_JOB_ID}/artifacts/raw/server-compiled" rules: - if: $CI_COMMIT_TAG diff --git a/src/modules/user/repositories/read/findUserByEmail.repository.ts b/src/modules/user/repositories/read/findUserByEmail.repository.ts index e9dd52b..aba52a1 100644 --- a/src/modules/user/repositories/read/findUserByEmail.repository.ts +++ b/src/modules/user/repositories/read/findUserByEmail.repository.ts @@ -1,9 +1,22 @@ import { userModel } from "../../user.model"; +import { + getUserDataIncludeOptions, + getUserDataOptions, +} from "../../user.types"; -export const findUserByEmailRepository = async (email: string) => { +export const findUserByEmailRepository = async ( + email: string, + include?: getUserDataOptions["include"] +) => { return await userModel.findUnique({ where: { email, }, + include: include + ? (Object.fromEntries(include.map((key) => [key, true])) as Record< + getUserDataIncludeOptions, + true + >) + : undefined, }); }; diff --git a/src/modules/user/repositories/read/findUserById.repository.ts b/src/modules/user/repositories/read/findUserById.repository.ts index 220acb2..1832436 100644 --- a/src/modules/user/repositories/read/findUserById.repository.ts +++ b/src/modules/user/repositories/read/findUserById.repository.ts @@ -1,9 +1,22 @@ import { userModel } from "../../user.model"; +import { + getUserDataIncludeOptions, + getUserDataOptions, +} from "../../user.types"; -export const findUserByIdRepository = async (id: string) => { +export const findUserByIdRepository = async ( + id: string, + include?: getUserDataOptions["include"] +) => { return await userModel.findUnique({ where: { id, }, + include: include + ? (Object.fromEntries(include.map((key) => [key, true])) as Record< + getUserDataIncludeOptions, + true + >) + : undefined, }); }; diff --git a/src/modules/user/repositories/read/findUserByUsername.repository.ts b/src/modules/user/repositories/read/findUserByUsername.repository.ts index 22825b5..e016c55 100644 --- a/src/modules/user/repositories/read/findUserByUsername.repository.ts +++ b/src/modules/user/repositories/read/findUserByUsername.repository.ts @@ -1,9 +1,22 @@ import { userModel } from "../../user.model"; +import { + getUserDataIncludeOptions, + getUserDataOptions, +} from "../../user.types"; -export const findUserByUsernameRepository = async (username: string) => { +export const findUserByUsernameRepository = async ( + username: string, + include?: getUserDataOptions["include"] +) => { return await userModel.findUnique({ where: { username, }, + include: include + ? (Object.fromEntries(include.map((key) => [key, true])) as Record< + getUserDataIncludeOptions, + true + >) + : undefined, }); }; diff --git a/src/modules/user/services/internal/findUser.service.ts b/src/modules/user/services/internal/findUser.service.ts index 08de269..b91265a 100644 --- a/src/modules/user/services/internal/findUser.service.ts +++ b/src/modules/user/services/internal/findUser.service.ts @@ -19,7 +19,7 @@ export const findUserService = async (payload: getUserDataService) => { if (!repoFn) throw new AppError(503, "Repository handler not found"); // Retrieving user data using the associated repository, if user not found return 404 response - const userData = await repoFn(payload.identifier); + const userData = await repoFn(payload.identifier, payload.options.include); if (!userData) throw new AppError(404, "User not found"); // Define verbosity levels diff --git a/src/modules/user/user.types.ts b/src/modules/user/user.types.ts index 4bcff91..59b7898 100644 --- a/src/modules/user/user.types.ts +++ b/src/modules/user/user.types.ts @@ -5,8 +5,9 @@ export interface getUserDataService { } export interface getUserDataOptions { verbosity: "exists" | "basic" | "full"; - include?: ("preference" | "roles")[]; + include?: getUserDataIncludeOptions[]; } +export type getUserDataIncludeOptions = "preference" | "roles"; export interface createUserViaRegisterInput { name: string;