defines DI Types for users repo

This commit is contained in:
vergiLgood1 2025-03-19 06:31:07 +07:00
parent 4750f0055e
commit e95bd8cb23
12 changed files with 267 additions and 21 deletions

View File

@ -15,7 +15,7 @@ import { createAdminClient } from "@/app/_utils/supabase/admin";
// Fetch all users // Fetch all users
export async function fetchUsers(): Promise<User[]> { export async function fetchUsers(): Promise<User[]> {
// const { data, error } = await supabase.auth.admin.listUsers(); // const { data, error } = await supabase.auth.admin.getUsers();
// if (error) { // if (error) {
// console.error("Error fetching users:", error); // console.error("Error fetching users:", error);

View File

@ -3,6 +3,28 @@ import { createModule } from '@evyweb/ioctopus';
import { DI_SYMBOLS } from '@/di/types'; import { DI_SYMBOLS } from '@/di/types';
import { UsersRepository } from '@/src/infrastructure/repositories/users.repository'; 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() { 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; return usersModule;
} }

View File

@ -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 { ISignOutUseCase } from '@/src/application/use-cases/auth/sign-out.use-case';
import { IUsersRepository } from '@/src/application/repositories/users.repository.interface'; import { IUsersRepository } from '@/src/application/repositories/users.repository.interface';
import { IVerifyOtpUseCase } from '@/src/application/use-cases/auth/verify-otp.use-case'; 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 { ISignInController } from '@/src/interface-adapters/controllers/auth/sign-in.controller';
import { ISignOutController } from '@/src/interface-adapters/controllers/auth/sign-out.controller'; import { ISignOutController } from '@/src/interface-adapters/controllers/auth/sign-out.controller';
import { IVerifyOtpController } from '@/src/interface-adapters/controllers/auth/verify-otp.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 = { export const DI_SYMBOLS = {
// Services // Services
@ -29,10 +49,34 @@ export const DI_SYMBOLS = {
IVerifyOtpUseCase: Symbol.for('IVerifyOtpUseCase'), IVerifyOtpUseCase: Symbol.for('IVerifyOtpUseCase'),
ISignOutUseCase: Symbol.for('ISignOutUseCase'), 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 // Controllers
ISignInController: Symbol.for('ISignInController'), ISignInController: Symbol.for('ISignInController'),
ISignOutController: Symbol.for('ISignOutController'), ISignOutController: Symbol.for('ISignOutController'),
IVerifyOtpController: Symbol.for('IVerifyOtpController'), 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 { export interface DI_RETURN_TYPES {
@ -51,8 +95,33 @@ export interface DI_RETURN_TYPES {
IVerifyOtpUseCase: IVerifyOtpUseCase; IVerifyOtpUseCase: IVerifyOtpUseCase;
ISignOutUseCase: ISignOutUseCase; 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 // Controllers
ISignInController: ISignInController; ISignInController: ISignInController;
IVerifyOtpController: IVerifyOtpController; IVerifyOtpController: IVerifyOtpController;
ISignOutController: ISignOutController; ISignOutController: ISignOutController;
IBanUserController: IBanUserController;
IUnbanUserController: IUnbanUserController;
IGetCurrentUserController: IGetCurrentUserController;
IGetUsersController: IGetUserByUsernameController;
IGetUserByIdController: IGetUserByIdController;
IGetUserByEmailController: IGetUserByEmailController;
IGetUserByUserNameController: IGetUserByUsernameController;
IInviteUserController: IInviteUserController;
ICreateUserController: ICreateUserController;
IUpdateUserController: IUpdateUserController;
IDeleteUserController: IDeleteUserController;
} }

View File

@ -4,7 +4,7 @@ import { CreateUser, InviteUser, UpdateUser, User, UserResponse } from "@/src/en
import { ITransaction } from "@/src/entities/models/transaction.interface"; import { ITransaction } from "@/src/entities/models/transaction.interface";
export interface IUsersRepository { export interface IUsersRepository {
listUsers(): Promise<User[]>; getUsers(): Promise<User[]>;
getCurrentUser(): Promise<User>; getCurrentUser(): Promise<User>;
getUserById(id: string): Promise<User | undefined>; getUserById(id: string): Promise<User | undefined>;
getUserByUsername(username: string): Promise<User | undefined>; getUserByUsername(username: string): Promise<User | undefined>;
@ -394,7 +394,7 @@ export interface IUsersRepository {
// } // }
// export async function fetchUsers(): Promise<User[]> { // export async function fetchUsers(): Promise<User[]> {
// // const { data, error } = await supabase.auth.admin.listUsers(); // // const { data, error } = await supabase.auth.admin.getUsers();
// // if (error) { // // if (error) {
// // console.error("Error fetching users:", error); // // console.error("Error fetching users:", error);

View File

@ -5,7 +5,7 @@ import { User } from "@/src/entities/models/users/users.model"
export type IDeleteUserUseCase = ReturnType<typeof deleteUserUseCase> export type IDeleteUserUseCase = ReturnType<typeof deleteUserUseCase>
const deleteUserUseCase = ( export const deleteUserUseCase = (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) => async (id: string): Promise<User> => { ) => async (id: string): Promise<User> => {

View File

@ -5,7 +5,7 @@ import { NotFoundError } from "@/src/entities/errors/common"
export type IGetUserByEmailUseCase = ReturnType<typeof getUserByEmailUseCase> export type IGetUserByEmailUseCase = ReturnType<typeof getUserByEmailUseCase>
const getUserByEmailUseCase = ( export const getUserByEmailUseCase = (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) => async (email: string): Promise<User> => { ) => async (email: string): Promise<User> => {

View File

@ -5,7 +5,7 @@ import { User } from "@/src/entities/models/users/users.model"
export type IGetUserByUsernameUseCase = ReturnType<typeof getUserByUsernameUseCase> export type IGetUserByUsernameUseCase = ReturnType<typeof getUserByUsernameUseCase>
const getUserByUsernameUseCase = ( export const getUserByUsernameUseCase = (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) => async (username: string): Promise<User> => { ) => async (username: string): Promise<User> => {

View File

@ -2,15 +2,15 @@ import { User } from "@/src/entities/models/users/users.model"
import { IUsersRepository } from "../../repositories/users.repository.interface" import { IUsersRepository } from "../../repositories/users.repository.interface"
import { IInstrumentationService } from "../../services/instrumentation.service.interface" import { IInstrumentationService } from "../../services/instrumentation.service.interface"
export type IGetListUsersUseCase = ReturnType<typeof getListUsersUseCase> export type IGetUsersUseCase = ReturnType<typeof getUsersUseCase>
export const getListUsersUseCase = ( export const getUsersUseCase = (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) => async (): Promise<User[]> => { ) => async (): Promise<User[]> => {
return await instrumentationService.startSpan({ name: "getListUsers Use Case", op: "function" }, return await instrumentationService.startSpan({ name: "getgetUsers Use Case", op: "function" },
async () => { async () => {
const users = await usersRepository.listUsers() const users = await usersRepository.getUsers()
return users return users
} }

View File

@ -5,11 +5,10 @@ import { User } from "@/src/entities/models/users/users.model"
export type IUnbanUserUseCase = ReturnType<typeof unbanUserUseCase> export type IUnbanUserUseCase = ReturnType<typeof unbanUserUseCase>
export function unbanUserUseCase( export const unbanUserUseCase = (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) { ) => async (id: string): Promise<User> => {
return async (id: string): Promise<User> => {
return await instrumentationService.startSpan({ name: "unbanUser Use Case", op: "function" }, return await instrumentationService.startSpan({ name: "unbanUser Use Case", op: "function" },
async () => { async () => {
const existingUser = await usersRepository.getUserById(id) const existingUser = await usersRepository.getUserById(id)
@ -24,4 +23,3 @@ export function unbanUserUseCase(
} }
) )
} }
}

View File

@ -5,7 +5,7 @@ import { NotFoundError } from "@/src/entities/errors/common"
export type IUpdateUserUseCase = ReturnType<typeof updateUserUseCase> export type IUpdateUserUseCase = ReturnType<typeof updateUserUseCase>
const updateUserUseCase = ( export const updateUserUseCase = (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) => async (id: string, input: UpdateUser): Promise<User> => { ) => async (id: string, input: UpdateUser): Promise<User> => {

View File

@ -17,7 +17,7 @@ export class UsersRepository implements IUsersRepository {
private readonly supabaseServer = createServerClient() private readonly supabaseServer = createServerClient()
) { } ) { }
async listUsers(): Promise<User[]> { async getUsers(): Promise<User[]> {
return await this.instrumentationService.startSpan({ return await this.instrumentationService.startSpan({
name: "UsersRepository > getUsers", name: "UsersRepository > getUsers",
}, async () => { }, async () => {

View File

@ -1,15 +1,15 @@
import { IUsersRepository } from "@/src/application/repositories/users.repository.interface" import { IUsersRepository } from "@/src/application/repositories/users.repository.interface"
import { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface" import { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface"
export type IGetListUserController = ReturnType<typeof getListUsersController> export type IGetUserController = ReturnType<typeof getUsersController>
export const getListUsersController = export const getUsersController =
( (
instrumentationService: IInstrumentationService, instrumentationService: IInstrumentationService,
usersRepository: IUsersRepository usersRepository: IUsersRepository
) => ) =>
async () => { async () => {
return await instrumentationService.startSpan({ name: "getListUsers Controller" }, async () => { return await instrumentationService.startSpan({ name: "getgetUsers Controller" }, async () => {
return await usersRepository.listUsers(); return await usersRepository.getUsers();
}) })
} }