From e60bf0fd3ea389bdee7a537d36791b6ec4477245 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Sun, 20 Jul 2025 22:21:48 +0700 Subject: [PATCH] :necktie: create boilerplate for user role module add a few boilerplate including get by id and name for user role module --- .../createUserViaRegister.controller.ts | 0 .../getUserByEmail.controller.ts | 0 .../getUserById.controller.ts | 0 .../getUserByUsername.controller.ts | 0 src/modules/user/index.ts | 8 +++---- .../controllers/getUserRoleById.controller.ts | 13 +++++++++++ .../getUserRoleByName.controller.ts | 13 +++++++++++ src/modules/userRole/index.ts | 7 ++++++ .../findUserRoleById.repository.ts | 9 ++++++++ .../findUserRoleByName.repository.ts | 9 ++++++++ .../schemas/getUserRoleById.schema.ts | 5 +++++ .../schemas/getUserRoleByName.schema.ts | 5 +++++ .../services/http/findUserRoleById.service.ts | 13 +++++++++++ .../http/findUserRoleByName.service.ts | 13 +++++++++++ .../services/internal/findUserRole.service.ts | 22 +++++++++++++++++++ src/modules/userRole/userRole.model.ts | 3 +++ src/modules/userRole/userRole.types.ts | 4 ++++ 17 files changed, 120 insertions(+), 4 deletions(-) rename src/modules/user/{controller => controllers}/createUserViaRegister.controller.ts (100%) rename src/modules/user/{controller => controllers}/getUserByEmail.controller.ts (100%) rename src/modules/user/{controller => controllers}/getUserById.controller.ts (100%) rename src/modules/user/{controller => controllers}/getUserByUsername.controller.ts (100%) create mode 100644 src/modules/userRole/controllers/getUserRoleById.controller.ts create mode 100644 src/modules/userRole/controllers/getUserRoleByName.controller.ts create mode 100644 src/modules/userRole/index.ts create mode 100644 src/modules/userRole/repositories/findUserRoleById.repository.ts create mode 100644 src/modules/userRole/repositories/findUserRoleByName.repository.ts create mode 100644 src/modules/userRole/schemas/getUserRoleById.schema.ts create mode 100644 src/modules/userRole/schemas/getUserRoleByName.schema.ts create mode 100644 src/modules/userRole/services/http/findUserRoleById.service.ts create mode 100644 src/modules/userRole/services/http/findUserRoleByName.service.ts create mode 100644 src/modules/userRole/services/internal/findUserRole.service.ts create mode 100644 src/modules/userRole/userRole.model.ts create mode 100644 src/modules/userRole/userRole.types.ts diff --git a/src/modules/user/controller/createUserViaRegister.controller.ts b/src/modules/user/controllers/createUserViaRegister.controller.ts similarity index 100% rename from src/modules/user/controller/createUserViaRegister.controller.ts rename to src/modules/user/controllers/createUserViaRegister.controller.ts diff --git a/src/modules/user/controller/getUserByEmail.controller.ts b/src/modules/user/controllers/getUserByEmail.controller.ts similarity index 100% rename from src/modules/user/controller/getUserByEmail.controller.ts rename to src/modules/user/controllers/getUserByEmail.controller.ts diff --git a/src/modules/user/controller/getUserById.controller.ts b/src/modules/user/controllers/getUserById.controller.ts similarity index 100% rename from src/modules/user/controller/getUserById.controller.ts rename to src/modules/user/controllers/getUserById.controller.ts diff --git a/src/modules/user/controller/getUserByUsername.controller.ts b/src/modules/user/controllers/getUserByUsername.controller.ts similarity index 100% rename from src/modules/user/controller/getUserByUsername.controller.ts rename to src/modules/user/controllers/getUserByUsername.controller.ts diff --git a/src/modules/user/index.ts b/src/modules/user/index.ts index 5e8f23c..9ccdd5a 100644 --- a/src/modules/user/index.ts +++ b/src/modules/user/index.ts @@ -1,8 +1,8 @@ import Elysia from "elysia"; -import { createUserViaRegisterController } from "./controller/createUserViaRegister.controller"; -import { getUserByEmailController } from "./controller/getUserByEmail.controller"; -import { getUserByUsernameController } from "./controller/getUserByUsername.controller"; -import { getUserByIdController } from "./controller/getUserById.controller"; +import { createUserViaRegisterController } from "./controllers/createUserViaRegister.controller"; +import { getUserByEmailController } from "./controllers/getUserByEmail.controller"; +import { getUserByUsernameController } from "./controllers/getUserByUsername.controller"; +import { getUserByIdController } from "./controllers/getUserById.controller"; export const userModule = new Elysia({ prefix: "/users" }) .post("/", createUserViaRegisterController) diff --git a/src/modules/userRole/controllers/getUserRoleById.controller.ts b/src/modules/userRole/controllers/getUserRoleById.controller.ts new file mode 100644 index 0000000..f05e747 --- /dev/null +++ b/src/modules/userRole/controllers/getUserRoleById.controller.ts @@ -0,0 +1,13 @@ +import { Context } from "elysia"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { getUserRoleByIdSchema } from "../schemas/getUserRoleById.schema"; +import { findUserRoleByIdService } from "../services/http/findUserRoleById.service"; + +export const getUserRoleByIdController = async (ctx: Context) => { + try { + const params = getUserRoleByIdSchema.parse(ctx.params); + return await findUserRoleByIdService(params.id); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/userRole/controllers/getUserRoleByName.controller.ts b/src/modules/userRole/controllers/getUserRoleByName.controller.ts new file mode 100644 index 0000000..d816104 --- /dev/null +++ b/src/modules/userRole/controllers/getUserRoleByName.controller.ts @@ -0,0 +1,13 @@ +import { Context } from "elysia"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { getUserRoleByNameSchema } from "../schemas/getUserRoleByName.schema"; +import { findUserRoleByNameService } from "../services/http/findUserRoleByName.service"; + +export const getUserRoleByNameController = async (ctx: Context) => { + try { + const params = getUserRoleByNameSchema.parse(ctx.params); + return await findUserRoleByNameService(params.name); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/userRole/index.ts b/src/modules/userRole/index.ts new file mode 100644 index 0000000..72ca896 --- /dev/null +++ b/src/modules/userRole/index.ts @@ -0,0 +1,7 @@ +import Elysia from "elysia"; +import { getUserRoleByNameController } from "./controllers/getUserRoleByName.controller"; +import { getUserRoleByIdController } from "./controllers/getUserRoleById.controller"; + +export const userRoleModule = new Elysia({ prefix: "/users/roles" }) + .get("/n/:name", getUserRoleByNameController) + .get("/id/:id", getUserRoleByIdController); diff --git a/src/modules/userRole/repositories/findUserRoleById.repository.ts b/src/modules/userRole/repositories/findUserRoleById.repository.ts new file mode 100644 index 0000000..6a0e125 --- /dev/null +++ b/src/modules/userRole/repositories/findUserRoleById.repository.ts @@ -0,0 +1,9 @@ +import { userRoleModel } from "../userRole.model"; + +export const findUserRoleByIdRepository = async (id: string) => { + return await userRoleModel.findUnique({ + where: { + id, + }, + }); +}; diff --git a/src/modules/userRole/repositories/findUserRoleByName.repository.ts b/src/modules/userRole/repositories/findUserRoleByName.repository.ts new file mode 100644 index 0000000..1a2c518 --- /dev/null +++ b/src/modules/userRole/repositories/findUserRoleByName.repository.ts @@ -0,0 +1,9 @@ +import { userRoleModel } from "../userRole.model"; + +export const findUserRoleByNameRepository = async (name: string) => { + return await userRoleModel.findUnique({ + where: { + name, + }, + }); +}; diff --git a/src/modules/userRole/schemas/getUserRoleById.schema.ts b/src/modules/userRole/schemas/getUserRoleById.schema.ts new file mode 100644 index 0000000..84289b6 --- /dev/null +++ b/src/modules/userRole/schemas/getUserRoleById.schema.ts @@ -0,0 +1,5 @@ +import z from "zod"; + +export const getUserRoleByIdSchema = z.object({ + id: z.string(), +}); diff --git a/src/modules/userRole/schemas/getUserRoleByName.schema.ts b/src/modules/userRole/schemas/getUserRoleByName.schema.ts new file mode 100644 index 0000000..46b6b70 --- /dev/null +++ b/src/modules/userRole/schemas/getUserRoleByName.schema.ts @@ -0,0 +1,5 @@ +import z from "zod"; + +export const getUserRoleByNameSchema = z.object({ + name: z.string(), +}); diff --git a/src/modules/userRole/services/http/findUserRoleById.service.ts b/src/modules/userRole/services/http/findUserRoleById.service.ts new file mode 100644 index 0000000..fb6caed --- /dev/null +++ b/src/modules/userRole/services/http/findUserRoleById.service.ts @@ -0,0 +1,13 @@ +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { findUserRoleService } from "../internal/findUserRole.service"; + +export const findUserRoleByIdService = async (id: string) => { + try { + return await findUserRoleService({ + identifier: id, + query_target: "id", + }); + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userRole/services/http/findUserRoleByName.service.ts b/src/modules/userRole/services/http/findUserRoleByName.service.ts new file mode 100644 index 0000000..5db6e05 --- /dev/null +++ b/src/modules/userRole/services/http/findUserRoleByName.service.ts @@ -0,0 +1,13 @@ +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { findUserRoleService } from "../internal/findUserRole.service"; + +export const findUserRoleByNameService = async (name: string) => { + try { + return await findUserRoleService({ + identifier: name, + query_target: "name", + }); + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userRole/services/internal/findUserRole.service.ts b/src/modules/userRole/services/internal/findUserRole.service.ts new file mode 100644 index 0000000..07f5b22 --- /dev/null +++ b/src/modules/userRole/services/internal/findUserRole.service.ts @@ -0,0 +1,22 @@ +import { AppError } from "../../../../helpers/error/instances/app"; +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { findUserRoleByIdRepository } from "../../repositories/findUserRoleById.repository"; +import { findUserRoleByNameRepository } from "../../repositories/findUserRoleByName.repository"; +import { findUserRolePayload } from "../../userRole.types"; + +export const findUserRoleService = async (payload: findUserRolePayload) => { + try { + const repositoryMap = { + id: findUserRoleByIdRepository, + name: findUserRoleByNameRepository, + }; + + const repoFn = repositoryMap[payload.query_target]; + if (!repoFn) throw new AppError(503, "Repository handler not found"); + + const userRoleData = await repoFn(payload.identifier); + if (userRoleData) throw new AppError(404, "User role not found"); + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userRole/userRole.model.ts b/src/modules/userRole/userRole.model.ts new file mode 100644 index 0000000..8b2d986 --- /dev/null +++ b/src/modules/userRole/userRole.model.ts @@ -0,0 +1,3 @@ +import { prisma } from "../../utils/databases/prisma/connection"; + +export const userRoleModel = prisma.userRole; diff --git a/src/modules/userRole/userRole.types.ts b/src/modules/userRole/userRole.types.ts new file mode 100644 index 0000000..0919d18 --- /dev/null +++ b/src/modules/userRole/userRole.types.ts @@ -0,0 +1,4 @@ +export interface findUserRolePayload { + identifier: string; + query_target: "id" | "name"; +}