👔 add include option on find user repository

add include option for spicify which associated data that want to retrive along with user data response
This commit is contained in:
Rafi Arrafif
2025-07-20 15:06:38 +07:00
parent 6de6028a40
commit 5c6e072622
6 changed files with 51 additions and 7 deletions

View File

@ -12,9 +12,11 @@ build_app:
- bun i - bun i
- bun run route:sync - bun run route:sync
- bun build --compile --minify-whitespace --minify-syntax --target bun --outfile "server-compiled" ./src/index.ts - bun build --compile --minify-whitespace --minify-syntax --target bun --outfile "server-compiled" ./src/index.ts
- echo $CI_JOB_ID > build_job_id.txt
artifacts: artifacts:
paths: paths:
- server-compiled - server-compiled
- build_job_id.txt
expire_in: 1 hour expire_in: 1 hour
rules: rules:
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG
@ -26,7 +28,9 @@ create_release:
- job: build_app - job: build_app
artifacts: true artifacts: true
script: 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: release:
name: "Release $CI_COMMIT_TAG" name: "Release $CI_COMMIT_TAG"
tag_name: "$CI_COMMIT_TAG" tag_name: "$CI_COMMIT_TAG"
@ -34,6 +38,6 @@ create_release:
assets: assets:
links: links:
- name: "server-compiled" - 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: rules:
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG

View File

@ -1,9 +1,22 @@
import { userModel } from "../../user.model"; 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({ return await userModel.findUnique({
where: { where: {
email, email,
}, },
include: include
? (Object.fromEntries(include.map((key) => [key, true])) as Record<
getUserDataIncludeOptions,
true
>)
: undefined,
}); });
}; };

View File

@ -1,9 +1,22 @@
import { userModel } from "../../user.model"; 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({ return await userModel.findUnique({
where: { where: {
id, id,
}, },
include: include
? (Object.fromEntries(include.map((key) => [key, true])) as Record<
getUserDataIncludeOptions,
true
>)
: undefined,
}); });
}; };

View File

@ -1,9 +1,22 @@
import { userModel } from "../../user.model"; 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({ return await userModel.findUnique({
where: { where: {
username, username,
}, },
include: include
? (Object.fromEntries(include.map((key) => [key, true])) as Record<
getUserDataIncludeOptions,
true
>)
: undefined,
}); });
}; };

View File

@ -19,7 +19,7 @@ export const findUserService = async (payload: getUserDataService) => {
if (!repoFn) throw new AppError(503, "Repository handler not found"); if (!repoFn) throw new AppError(503, "Repository handler not found");
// Retrieving user data using the associated repository, if user not found return 404 response // 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"); if (!userData) throw new AppError(404, "User not found");
// Define verbosity levels // Define verbosity levels

View File

@ -5,8 +5,9 @@ export interface getUserDataService {
} }
export interface getUserDataOptions { export interface getUserDataOptions {
verbosity: "exists" | "basic" | "full"; verbosity: "exists" | "basic" | "full";
include?: ("preference" | "roles")[]; include?: getUserDataIncludeOptions[];
} }
export type getUserDataIncludeOptions = "preference" | "roles";
export interface createUserViaRegisterInput { export interface createUserViaRegisterInput {
name: string; name: string;