From e95bd8cb235df620e0e60b095405dba2b9e2c550 Mon Sep 17 00:00:00 2001 From: vergiLgood1 Date: Wed, 19 Mar 2025 06:31:07 +0700 Subject: [PATCH] defines DI Types for users repo --- .../dashboard/user-management/action.ts | 2 +- sigap-website/di/modules/users.module.ts | 179 ++++++++++++++++++ sigap-website/di/types.ts | 71 ++++++- .../users.repository.interface.ts | 4 +- .../use-cases/users/delete-user.use-case.ts | 2 +- .../users/get-user-by-email.use-case.ts | 2 +- .../users/get-user-by-username.use-case.ts | 2 +- ...sers.use-case.ts => get-users.use-case.ts} | 8 +- .../use-cases/users/unban-user.use-case.ts | 6 +- .../use-cases/users/update-user.use-case.ts | 2 +- .../repositories/users.repository.ts | 2 +- ....controller.ts => get-users.controller.ts} | 8 +- 12 files changed, 267 insertions(+), 21 deletions(-) rename sigap-website/src/application/use-cases/users/{get-list-users.use-case.ts => get-users.use-case.ts} (61%) rename sigap-website/src/interface-adapters/controllers/users/{get-list-users.controller.ts => get-users.controller.ts} (65%) diff --git a/sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts b/sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts index 51c640a..34cbbbb 100644 --- a/sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts @@ -15,7 +15,7 @@ import { createAdminClient } from "@/app/_utils/supabase/admin"; // Fetch all users export async function fetchUsers(): Promise { - // const { data, error } = await supabase.auth.admin.listUsers(); + // const { data, error } = await supabase.auth.admin.getUsers(); // if (error) { // console.error("Error fetching users:", error); diff --git a/sigap-website/di/modules/users.module.ts b/sigap-website/di/modules/users.module.ts index 40cbc71..d1e52b0 100644 --- a/sigap-website/di/modules/users.module.ts +++ b/sigap-website/di/modules/users.module.ts @@ -3,6 +3,28 @@ import { createModule } from '@evyweb/ioctopus'; import { DI_SYMBOLS } from '@/di/types'; import { UsersRepository } from '@/src/infrastructure/repositories/users.repository'; +import { getUsersUseCase } from '@/src/application/use-cases/users/get-users.use-case'; +import { getUsersController } from '@/src/interface-adapters/controllers/users/get-users.controller'; +import { banUserController } from '@/src/interface-adapters/controllers/users/ban-user.controller'; +import { banUserUseCase } from '@/src/application/use-cases/users/ban-user.use-case'; +import { unbanUserUseCase } from '@/src/application/use-cases/users/unban-user.use-case'; +import { getCurrentUserUseCase } from '@/src/application/use-cases/users/get-current-user.use-case'; +import { getUserByIdUseCase } from '@/src/application/use-cases/users/get-user-by-id.use-case'; +import { inviteUserUseCase } from '@/src/application/use-cases/users/invite-user.use-case'; +import { createUserUseCase } from '@/src/application/use-cases/users/create-user.use-case'; +import { unbanUserController } from '@/src/interface-adapters/controllers/users/unban-user.controller'; +import { getCurrentUserController } from '@/src/interface-adapters/controllers/users/get-current-user.controller'; +import { getUserByIdController } from '@/src/interface-adapters/controllers/users/get-user-by-id.controller'; +import { getUserByEmailController } from '@/src/interface-adapters/controllers/users/get-user-by-email.controller'; +import { getUserByUsernameController } from '@/src/interface-adapters/controllers/users/get-user-by-username.controller'; +import { inviteUserController } from '@/src/interface-adapters/controllers/users/invite-user.controller'; +import { createUserController } from '@/src/interface-adapters/controllers/users/create-user.controller'; +import { updateUserController } from '@/src/interface-adapters/controllers/users/update-user-controller'; +import { deleteUserController } from '@/src/interface-adapters/controllers/users/delete-user.controller'; +import { deleteUserUseCase } from '@/src/application/use-cases/users/delete-user.use-case'; +import { getUserByUsernameUseCase } from '@/src/application/use-cases/users/get-user-by-username.use-case'; +import { getUserByEmailUseCase } from '@/src/application/use-cases/users/get-user-by-email.use-case'; +import { updateUserUseCase } from '@/src/application/use-cases/users/update-user.use-case'; export function createUsersModule() { @@ -25,5 +47,162 @@ export function createUsersModule() { ]); } + // Use cases + usersModule + .bind(DI_SYMBOLS.IBanUserUseCase) + .toHigherOrderFunction(banUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IUnbanUserUseCase) + .toHigherOrderFunction(unbanUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IGetCurrentUserUseCase) + .toHigherOrderFunction(getCurrentUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUsersUseCase) + .toHigherOrderFunction(getUsersUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUserByIdUseCase) + .toHigherOrderFunction(getUserByIdUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUserByEmailUseCase) + .toHigherOrderFunction(getUserByEmailUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUserByUserNameUseCase) + .toHigherOrderFunction(getUserByUsernameUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IInviteUserUseCase) + .toHigherOrderFunction(inviteUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.ICreateUserUseCase) + .toHigherOrderFunction(createUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IUpdateUserUseCase) + .toHigherOrderFunction(updateUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + usersModule + .bind(DI_SYMBOLS.IDeleteUserUseCase) + .toHigherOrderFunction(deleteUserUseCase, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUsersRepository + ]); + + // Controllers + usersModule + .bind(DI_SYMBOLS.IBanUserController) + .toHigherOrderFunction(banUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IBanUserUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IUnbanUserController) + .toHigherOrderFunction(unbanUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUnbanUserUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IGetCurrentUserController) + .toHigherOrderFunction(getCurrentUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IGetCurrentUserUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUsersController) + .toHigherOrderFunction(getUsersController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IGetUsersUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUserByIdController) + .toHigherOrderFunction(getUserByIdController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IGetUserByIdUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUserByEmailController) + .toHigherOrderFunction(getUserByEmailController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IGetUserByEmailUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IGetUserByUserNameController) + .toHigherOrderFunction(getUserByUsernameController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IGetUserByUserNameUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IInviteUserController) + .toHigherOrderFunction(inviteUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IInviteUserUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.ICreateUserController) + .toHigherOrderFunction(createUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.ICreateUserUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IUpdateUserController) + .toHigherOrderFunction(updateUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IUpdateUserUseCase + ]); + + usersModule + .bind(DI_SYMBOLS.IDeleteUserController) + .toHigherOrderFunction(deleteUserController, [ + DI_SYMBOLS.IInstrumentationService, + DI_SYMBOLS.IDeleteUserUseCase + ]); + + return usersModule; } \ No newline at end of file diff --git a/sigap-website/di/types.ts b/sigap-website/di/types.ts index be22123..53787ca 100644 --- a/sigap-website/di/types.ts +++ b/sigap-website/di/types.ts @@ -8,10 +8,30 @@ import { ISignUpUseCase } from '@/src/application/use-cases/auth/sign-up.use-cas import { ISignOutUseCase } from '@/src/application/use-cases/auth/sign-out.use-case'; import { IUsersRepository } from '@/src/application/repositories/users.repository.interface'; import { IVerifyOtpUseCase } from '@/src/application/use-cases/auth/verify-otp.use-case'; -import { IInviteUserUseCase } from '@/src/application/use-cases/users/invite-user.use-case'; import { ISignInController } from '@/src/interface-adapters/controllers/auth/sign-in.controller'; import { ISignOutController } from '@/src/interface-adapters/controllers/auth/sign-out.controller'; import { IVerifyOtpController } from '@/src/interface-adapters/controllers/auth/verify-otp.controller'; +import { IBanUserUseCase } from '@/src/application/use-cases/users/ban-user.use-case'; +import { IUnbanUserUseCase } from '@/src/application/use-cases/users/unban-user.use-case'; +import { IGetCurrentUserUseCase } from '@/src/application/use-cases/users/get-current-user.use-case'; +import { IGetUsersUseCase } from '@/src/application/use-cases/users/get-users.use-case'; +import { IGetUserByIdUseCase } from '@/src/application/use-cases/users/get-user-by-id.use-case'; +import { IGetUserByEmailUseCase } from '@/src/application/use-cases/users/get-user-by-email.use-case'; +import { IGetUserByUsernameUseCase } from '@/src/application/use-cases/users/get-user-by-username.use-case'; +import { IInviteUserUseCase } from '@/src/application/use-cases/users/invite-user.use-case'; +import { ICreateUserUseCase } from '@/src/application/use-cases/users/create-user.use-case'; +import { IUpdateUserUseCase } from '@/src/application/use-cases/users/update-user.use-case'; +import { IDeleteUserUseCase } from '@/src/application/use-cases/users/delete-user.use-case'; +import { IBanUserController } from '@/src/interface-adapters/controllers/users/ban-user.controller'; +import { IUnbanUserController } from '@/src/interface-adapters/controllers/users/unban-user.controller'; +import { IGetCurrentUserController } from '@/src/interface-adapters/controllers/users/get-current-user.controller'; +import { IGetUserByUsernameController } from '@/src/interface-adapters/controllers/users/get-user-by-username.controller'; +import { IGetUserByIdController } from '@/src/interface-adapters/controllers/users/get-user-by-id.controller'; +import { IGetUserByEmailController } from '@/src/interface-adapters/controllers/users/get-user-by-email.controller'; +import { IInviteUserController } from '@/src/interface-adapters/controllers/users/invite-user.controller'; +import { IUpdateUserController } from '@/src/interface-adapters/controllers/users/update-user-controller'; +import { ICreateUserController } from '@/src/interface-adapters/controllers/users/create-user.controller'; +import { IDeleteUserController } from '@/src/interface-adapters/controllers/users/delete-user.controller'; export const DI_SYMBOLS = { // Services @@ -29,10 +49,34 @@ export const DI_SYMBOLS = { IVerifyOtpUseCase: Symbol.for('IVerifyOtpUseCase'), ISignOutUseCase: Symbol.for('ISignOutUseCase'), + IBanUserUseCase: Symbol.for('IBanUserUseCase'), + IUnbanUserUseCase: Symbol.for('IUnbanUserUseCase'), + IGetCurrentUserUseCase: Symbol.for('IGetCurrentUserUseCase'), + IGetUsersUseCase: Symbol.for('IGetUsersUseCase'), + IGetUserByIdUseCase: Symbol.for('IGetUserByIdUseCase'), + IGetUserByEmailUseCase: Symbol.for('IGetUserByEmailUseCase'), + IGetUserByUserNameUseCase: Symbol.for('IGetUserByUserNameUseCase'), + IInviteUserUseCase: Symbol.for('IInviteUserUseCase'), + ICreateUserUseCase: Symbol.for('ICreateUserUseCase'), + IUpdateUserUseCase: Symbol.for('IUpdateUserUseCase'), + IDeleteUserUseCase: Symbol.for('IDeleteUserUseCase'), + // Controllers ISignInController: Symbol.for('ISignInController'), ISignOutController: Symbol.for('ISignOutController'), IVerifyOtpController: Symbol.for('IVerifyOtpController'), + + IBanUserController: Symbol.for('IBanUserController'), + IUnbanUserController: Symbol.for('IUnbanUserController'), + IGetCurrentUserController: Symbol.for('IGetCurrentUserController'), + IGetUsersController: Symbol.for('IGetUsersController'), + IGetUserByIdController: Symbol.for('IGetUserByIdController'), + IGetUserByEmailController: Symbol.for('IGetUserByEmailController'), + IGetUserByUserNameController: Symbol.for('IGetUserByUserNameController'), + IInviteUserController: Symbol.for('IInviteUserController'), + ICreateUserController: Symbol.for('ICreateUserController'), + IUpdateUserController: Symbol.for('IUpdateUserController'), + IDeleteUserController: Symbol.for('IDeleteUserController'), }; export interface DI_RETURN_TYPES { @@ -51,8 +95,33 @@ export interface DI_RETURN_TYPES { IVerifyOtpUseCase: IVerifyOtpUseCase; ISignOutUseCase: ISignOutUseCase; + IBanUserUseCase: IBanUserUseCase; + IUnbanUserUseCase: IUnbanUserUseCase; + IGetCurrentUserUseCase: IGetCurrentUserUseCase; + IGetUsersUseCase: IGetUsersUseCase; + IGetUserByIdUseCase: IGetUserByIdUseCase; + IGetUserByEmailUseCase: IGetUserByEmailUseCase; + IGetUserByUserNameUseCase: IGetUserByUsernameUseCase; + IInviteUserUseCase: IInviteUserUseCase; + ICreateUserUseCase: ICreateUserUseCase; + IUpdateUserUseCase: IUpdateUserUseCase; + IDeleteUserUseCase: IDeleteUserUseCase; + // Controllers ISignInController: ISignInController; IVerifyOtpController: IVerifyOtpController; ISignOutController: ISignOutController; + + IBanUserController: IBanUserController; + IUnbanUserController: IUnbanUserController; + IGetCurrentUserController: IGetCurrentUserController; + IGetUsersController: IGetUserByUsernameController; + IGetUserByIdController: IGetUserByIdController; + IGetUserByEmailController: IGetUserByEmailController; + IGetUserByUserNameController: IGetUserByUsernameController; + IInviteUserController: IInviteUserController; + ICreateUserController: ICreateUserController; + IUpdateUserController: IUpdateUserController; + IDeleteUserController: IDeleteUserController; + } \ No newline at end of file diff --git a/sigap-website/src/application/repositories/users.repository.interface.ts b/sigap-website/src/application/repositories/users.repository.interface.ts index 07a846b..68876ac 100644 --- a/sigap-website/src/application/repositories/users.repository.interface.ts +++ b/sigap-website/src/application/repositories/users.repository.interface.ts @@ -4,7 +4,7 @@ import { CreateUser, InviteUser, UpdateUser, User, UserResponse } from "@/src/en import { ITransaction } from "@/src/entities/models/transaction.interface"; export interface IUsersRepository { - listUsers(): Promise; + getUsers(): Promise; getCurrentUser(): Promise; getUserById(id: string): Promise; getUserByUsername(username: string): Promise; @@ -394,7 +394,7 @@ export interface IUsersRepository { // } // export async function fetchUsers(): Promise { -// // const { data, error } = await supabase.auth.admin.listUsers(); +// // const { data, error } = await supabase.auth.admin.getUsers(); // // if (error) { // // console.error("Error fetching users:", error); diff --git a/sigap-website/src/application/use-cases/users/delete-user.use-case.ts b/sigap-website/src/application/use-cases/users/delete-user.use-case.ts index 97a9829..fd7d2e5 100644 --- a/sigap-website/src/application/use-cases/users/delete-user.use-case.ts +++ b/sigap-website/src/application/use-cases/users/delete-user.use-case.ts @@ -5,7 +5,7 @@ import { User } from "@/src/entities/models/users/users.model" export type IDeleteUserUseCase = ReturnType -const deleteUserUseCase = ( +export const deleteUserUseCase = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository ) => async (id: string): Promise => { diff --git a/sigap-website/src/application/use-cases/users/get-user-by-email.use-case.ts b/sigap-website/src/application/use-cases/users/get-user-by-email.use-case.ts index e6ef08a..a21a651 100644 --- a/sigap-website/src/application/use-cases/users/get-user-by-email.use-case.ts +++ b/sigap-website/src/application/use-cases/users/get-user-by-email.use-case.ts @@ -5,7 +5,7 @@ import { NotFoundError } from "@/src/entities/errors/common" export type IGetUserByEmailUseCase = ReturnType -const getUserByEmailUseCase = ( +export const getUserByEmailUseCase = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository ) => async (email: string): Promise => { diff --git a/sigap-website/src/application/use-cases/users/get-user-by-username.use-case.ts b/sigap-website/src/application/use-cases/users/get-user-by-username.use-case.ts index 35b1630..9a39328 100644 --- a/sigap-website/src/application/use-cases/users/get-user-by-username.use-case.ts +++ b/sigap-website/src/application/use-cases/users/get-user-by-username.use-case.ts @@ -5,7 +5,7 @@ import { User } from "@/src/entities/models/users/users.model" export type IGetUserByUsernameUseCase = ReturnType -const getUserByUsernameUseCase = ( +export const getUserByUsernameUseCase = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository ) => async (username: string): Promise => { diff --git a/sigap-website/src/application/use-cases/users/get-list-users.use-case.ts b/sigap-website/src/application/use-cases/users/get-users.use-case.ts similarity index 61% rename from sigap-website/src/application/use-cases/users/get-list-users.use-case.ts rename to sigap-website/src/application/use-cases/users/get-users.use-case.ts index ba68ec2..dbfd009 100644 --- a/sigap-website/src/application/use-cases/users/get-list-users.use-case.ts +++ b/sigap-website/src/application/use-cases/users/get-users.use-case.ts @@ -2,15 +2,15 @@ import { User } from "@/src/entities/models/users/users.model" import { IUsersRepository } from "../../repositories/users.repository.interface" import { IInstrumentationService } from "../../services/instrumentation.service.interface" -export type IGetListUsersUseCase = ReturnType +export type IGetUsersUseCase = ReturnType -export const getListUsersUseCase = ( +export const getUsersUseCase = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository ) => async (): Promise => { - return await instrumentationService.startSpan({ name: "getListUsers Use Case", op: "function" }, + return await instrumentationService.startSpan({ name: "getgetUsers Use Case", op: "function" }, async () => { - const users = await usersRepository.listUsers() + const users = await usersRepository.getUsers() return users } diff --git a/sigap-website/src/application/use-cases/users/unban-user.use-case.ts b/sigap-website/src/application/use-cases/users/unban-user.use-case.ts index 66d2028..a094565 100644 --- a/sigap-website/src/application/use-cases/users/unban-user.use-case.ts +++ b/sigap-website/src/application/use-cases/users/unban-user.use-case.ts @@ -5,11 +5,10 @@ import { User } from "@/src/entities/models/users/users.model" export type IUnbanUserUseCase = ReturnType -export function unbanUserUseCase( +export const unbanUserUseCase = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository -) { - return async (id: string): Promise => { +) => async (id: string): Promise => { return await instrumentationService.startSpan({ name: "unbanUser Use Case", op: "function" }, async () => { const existingUser = await usersRepository.getUserById(id) @@ -24,4 +23,3 @@ export function unbanUserUseCase( } ) } -} \ No newline at end of file diff --git a/sigap-website/src/application/use-cases/users/update-user.use-case.ts b/sigap-website/src/application/use-cases/users/update-user.use-case.ts index 8b084eb..fe3b9a8 100644 --- a/sigap-website/src/application/use-cases/users/update-user.use-case.ts +++ b/sigap-website/src/application/use-cases/users/update-user.use-case.ts @@ -5,7 +5,7 @@ import { NotFoundError } from "@/src/entities/errors/common" export type IUpdateUserUseCase = ReturnType -const updateUserUseCase = ( +export const updateUserUseCase = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository ) => async (id: string, input: UpdateUser): Promise => { diff --git a/sigap-website/src/infrastructure/repositories/users.repository.ts b/sigap-website/src/infrastructure/repositories/users.repository.ts index 4fff1ae..68ad50a 100644 --- a/sigap-website/src/infrastructure/repositories/users.repository.ts +++ b/sigap-website/src/infrastructure/repositories/users.repository.ts @@ -17,7 +17,7 @@ export class UsersRepository implements IUsersRepository { private readonly supabaseServer = createServerClient() ) { } - async listUsers(): Promise { + async getUsers(): Promise { return await this.instrumentationService.startSpan({ name: "UsersRepository > getUsers", }, async () => { diff --git a/sigap-website/src/interface-adapters/controllers/users/get-list-users.controller.ts b/sigap-website/src/interface-adapters/controllers/users/get-users.controller.ts similarity index 65% rename from sigap-website/src/interface-adapters/controllers/users/get-list-users.controller.ts rename to sigap-website/src/interface-adapters/controllers/users/get-users.controller.ts index 848609a..6f98b9c 100644 --- a/sigap-website/src/interface-adapters/controllers/users/get-list-users.controller.ts +++ b/sigap-website/src/interface-adapters/controllers/users/get-users.controller.ts @@ -1,15 +1,15 @@ import { IUsersRepository } from "@/src/application/repositories/users.repository.interface" import { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface" -export type IGetListUserController = ReturnType +export type IGetUserController = ReturnType -export const getListUsersController = +export const getUsersController = ( instrumentationService: IInstrumentationService, usersRepository: IUsersRepository ) => async () => { - return await instrumentationService.startSpan({ name: "getListUsers Controller" }, async () => { - return await usersRepository.listUsers(); + return await instrumentationService.startSpan({ name: "getgetUsers Controller" }, async () => { + return await usersRepository.getUsers(); }) } \ No newline at end of file