diff --git a/src/business-logic/core/users/create-user/create-account/data/dto/createAccountDTO.ts b/src/business-logic/core/users/create-user/create-account/data/dto/createAccountDTO.ts index a075008..fdc699d 100644 --- a/src/business-logic/core/users/create-user/create-account/data/dto/createAccountDTO.ts +++ b/src/business-logic/core/users/create-user/create-account/data/dto/createAccountDTO.ts @@ -1,8 +1,6 @@ -import { CreateAccountDTOReturnType, INewUserDTO } from './protocols'; +import { CreateAccountDTOReturnType, INewUserData } from './protocols'; -const createAccountDTO = ( - newUser: INewUserDTO -): CreateAccountDTOReturnType => ({ +const createAccountDTO = (newUser: INewUserData): CreateAccountDTOReturnType => ({ enabled: true, firstName: newUser.firstname, lastName: newUser.lastname, diff --git a/src/business-logic/core/users/create-user/create-account/data/dto/protocols.ts b/src/business-logic/core/users/create-user/create-account/data/dto/protocols.ts index 46f35e4..1c74a3b 100644 --- a/src/business-logic/core/users/create-user/create-account/data/dto/protocols.ts +++ b/src/business-logic/core/users/create-user/create-account/data/dto/protocols.ts @@ -1,4 +1,4 @@ -export interface INewUserDTO { +export interface INewUserData { firstname: string; lastname: string; phonenumber: string; diff --git a/src/business-logic/core/users/create-user/create-account/data/repository/ICreateAcountRepo.ts b/src/business-logic/core/users/create-user/create-account/data/repository/ICreateAcountRepo.ts index 50805de..2a81155 100644 --- a/src/business-logic/core/users/create-user/create-account/data/repository/ICreateAcountRepo.ts +++ b/src/business-logic/core/users/create-user/create-account/data/repository/ICreateAcountRepo.ts @@ -1,8 +1,8 @@ -import { INewUserDTO } from '../dto/protocols'; +import { INewUserData } from '../dto/protocols'; import { CreateAccountROReturnType } from '../response-object/protocols'; interface ICreateAcountRepo { - execute: (newUser: INewUserDTO) => Promise; + execute: (newUser: INewUserData) => Promise; } export default ICreateAcountRepo; diff --git a/src/business-logic/core/users/create-user/create-account/data/repository/createAcountRepo.ts b/src/business-logic/core/users/create-user/create-account/data/repository/createAcountRepo.ts index 248d115..f089659 100644 --- a/src/business-logic/core/users/create-user/create-account/data/repository/createAcountRepo.ts +++ b/src/business-logic/core/users/create-user/create-account/data/repository/createAcountRepo.ts @@ -1,5 +1,5 @@ import createAccountDTO from '../dto/createAccountDTO'; -import { INewUserDTO } from '../dto/protocols'; +import { INewUserData } from '../dto/protocols'; import createAcountRO from '../response-object/createAcountRO'; import { CreateAccountROReturnType } from '../response-object/protocols'; import ICreateAcountRepo from './ICreateAcountRepo'; @@ -12,14 +12,13 @@ export default class CreateAccountRepo implements ICreateAcountRepo { this.httpHandler = httpHandler; } - execute: (newUser: INewUserDTO) => Promise = - async (newUser: INewUserDTO) => { - // call dto - const dto = createAccountDTO(newUser); - // call - const newAccountResponse = await this.httpHandler(dto); - // call response object - const newAccount = createAcountRO(newAccountResponse); - return newAccount; - }; + execute: (newUser: INewUserData) => Promise = async (newUser: INewUserData) => { + // call dto + const dto = createAccountDTO(newUser); + // call + const newAccountResponse = await this.httpHandler(dto); + // call response object + const newAccount = createAcountRO(newAccountResponse); + return newAccount; + }; } diff --git a/src/business-logic/core/users/create-user/create-account/data/repository/protocols.ts b/src/business-logic/core/users/create-user/create-account/data/repository/protocols.ts index 19a5be3..e904070 100644 --- a/src/business-logic/core/users/create-user/create-account/data/repository/protocols.ts +++ b/src/business-logic/core/users/create-user/create-account/data/repository/protocols.ts @@ -1,6 +1,4 @@ import { CreateAccountDTOReturnType } from '../dto/protocols'; import { CreateAcountResponseApi } from '../response-object/protocols'; -export type HttpHandler = ( - newUser: CreateAccountDTOReturnType -) => Promise; +export type HttpHandler = (newUser: CreateAccountDTOReturnType) => Promise; diff --git a/src/business-logic/core/users/create-user/create-account/data/response-object/createAcountRO.ts b/src/business-logic/core/users/create-user/create-account/data/response-object/createAcountRO.ts index ac9bbb8..66c809c 100644 --- a/src/business-logic/core/users/create-user/create-account/data/response-object/createAcountRO.ts +++ b/src/business-logic/core/users/create-user/create-account/data/response-object/createAcountRO.ts @@ -1,11 +1,6 @@ -import { - CreateAccountROReturnType, - CreateAcountResponseApi, -} from './protocols'; +import { CreateAccountROReturnType, CreateAcountResponseApi } from './protocols'; -const createAcountRO = ( - apiResponse: CreateAcountResponseApi -): CreateAccountROReturnType => ({ +const createAcountRO = (apiResponse: CreateAcountResponseApi): CreateAccountROReturnType => ({ accountId: apiResponse.id, phonenumber: apiResponse.username, }); diff --git a/src/business-logic/core/users/create-user/create-profile/data/dto/createProfileDTO.ts b/src/business-logic/core/users/create-user/create-profile/data/dto/createProfileDTO.ts new file mode 100644 index 0000000..82ad6d3 --- /dev/null +++ b/src/business-logic/core/users/create-user/create-profile/data/dto/createProfileDTO.ts @@ -0,0 +1,9 @@ +import { CreateProfileDtoType, ICreateNewProfileData } from './protocols'; + +const createProfileDTO: CreateProfileDtoType = (userAccount: ICreateNewProfileData) => ({ + account_id: userAccount.accountId, + first_name: userAccount.firstname, + last_name: userAccount.lastname, +}); + +export default createProfileDTO; diff --git a/src/business-logic/core/users/create-user/create-profile/data/dto/protocols.ts b/src/business-logic/core/users/create-user/create-profile/data/dto/protocols.ts new file mode 100644 index 0000000..544a493 --- /dev/null +++ b/src/business-logic/core/users/create-user/create-profile/data/dto/protocols.ts @@ -0,0 +1,12 @@ +import { INewUserData } from '../../../create-account/data/dto/protocols'; +import { CreateAccountROReturnType } from '../../../create-account/data/response-object/protocols'; + +export type ICreateNewProfileData = CreateAccountROReturnType & INewUserData; + +export type CreateProfileDtoReturnType = { + account_id: string; + first_name: string; + last_name: string; +}; + +export type CreateProfileDtoType = (userAccount: ICreateNewProfileData) => CreateProfileDtoReturnType; diff --git a/src/business-logic/core/users/create-user/create-profile/data/repository/CreateRepositoryRepo.ts b/src/business-logic/core/users/create-user/create-profile/data/repository/CreateRepositoryRepo.ts new file mode 100644 index 0000000..698d85d --- /dev/null +++ b/src/business-logic/core/users/create-user/create-profile/data/repository/CreateRepositoryRepo.ts @@ -0,0 +1,22 @@ +/* eslint-disable no-useless-constructor */ +import RepositoryHandler from '~/driven/utils/helpers/repository-handler/repositoryHandler'; +import { CreateProfileDtoReturnType, ICreateNewProfileData } from '../dto/protocols'; +import createProfileDTO from '../dto/createProfileDTO'; +import ICreateProfileRepo from './ICreateProfileRepo'; +import { HttpHandler } from './protocols'; + +export default class CreateProfileRepo + extends RepositoryHandler + implements ICreateProfileRepo +{ + constructor(httpHandler: HttpHandler) { + super(httpHandler); + } + + async execute(accountData: ICreateNewProfileData) { + // create data in dto + const dto = createProfileDTO(accountData); + // call main http handler + return await this.httpHandler(dto); + } +} diff --git a/src/business-logic/core/users/create-user/create-profile/data/repository/ICreateProfileRepo.ts b/src/business-logic/core/users/create-user/create-profile/data/repository/ICreateProfileRepo.ts new file mode 100644 index 0000000..fd73452 --- /dev/null +++ b/src/business-logic/core/users/create-user/create-profile/data/repository/ICreateProfileRepo.ts @@ -0,0 +1,5 @@ +import { ICreateNewProfileData } from '../dto/protocols'; + +export default interface ICreateProfileRepo { + execute: (accountData: ICreateNewProfileData) => Promise; +} diff --git a/src/business-logic/core/users/create-user/create-profile/data/repository/protocols.ts b/src/business-logic/core/users/create-user/create-profile/data/repository/protocols.ts new file mode 100644 index 0000000..7ae431e --- /dev/null +++ b/src/business-logic/core/users/create-user/create-profile/data/repository/protocols.ts @@ -0,0 +1,3 @@ +import { CreateProfileDtoReturnType } from '../dto/protocols'; + +export type HttpHandler = (newUser: CreateProfileDtoReturnType) => Promise; diff --git a/src/business-logic/core/users/create-user/data/repository/ICreateUserRepo.ts b/src/business-logic/core/users/create-user/data/repository/ICreateUserRepo.ts deleted file mode 100644 index eaac72a..0000000 --- a/src/business-logic/core/users/create-user/data/repository/ICreateUserRepo.ts +++ /dev/null @@ -1,5 +0,0 @@ -import UsersModel from '../../../common/data/model/usersModel'; - -type ICreateUserRepo = () => Promise; - -export default ICreateUserRepo; diff --git a/src/business-logic/core/users/create-user/data/repository/createUserRepo.ts b/src/business-logic/core/users/create-user/data/repository/createUserRepo.ts deleted file mode 100644 index 91903f9..0000000 --- a/src/business-logic/core/users/create-user/data/repository/createUserRepo.ts +++ /dev/null @@ -1,7 +0,0 @@ -import ICreateUserRepo from './ICreateUserRepo'; - -const creatUserRepo = () => { - -}; - -export default creatUserRepo; diff --git a/src/business-logic/core/users/create-user/index.ts b/src/business-logic/core/users/create-user/index.ts new file mode 100644 index 0000000..aa10a7d --- /dev/null +++ b/src/business-logic/core/users/create-user/index.ts @@ -0,0 +1,3 @@ +import createUserInfra from './infra/createUserInfra'; + +export default createUserInfra; diff --git a/src/business-logic/core/users/create-user/infra/createUserInfra.ts b/src/business-logic/core/users/create-user/infra/createUserInfra.ts new file mode 100644 index 0000000..8b1a472 --- /dev/null +++ b/src/business-logic/core/users/create-user/infra/createUserInfra.ts @@ -0,0 +1,29 @@ +import CreateAccountRepo from '../create-account/data/repository/createAcountRepo'; +import { HttpHandler as HttpAccountHandler } from '../create-account/data/repository/protocols'; +import CreateProfileRepo from '../create-profile/data/repository/CreateRepositoryRepo'; +import { HttpHandler as HttpProfileHandler } from '../create-profile/data/repository/protocols'; +import CreateUserUsecase from '../usecase/createUserUsecase'; + +class createUserInfra { + private httpAccountHandler: HttpAccountHandler; + + private httpProfileHandler: HttpProfileHandler; + + constructor(httpAccountHandler: HttpAccountHandler, httpProfileHandler: HttpProfileHandler) { + this.httpAccountHandler = httpAccountHandler; + this.httpProfileHandler = httpProfileHandler; + } + + execute() { + // make account repositroy ready + const accountRepository = new CreateAccountRepo(this.httpAccountHandler); + // make profile repository ready + const profileRepository = new CreateProfileRepo(this.httpProfileHandler); + // make usecase ready + const usecase = new CreateUserUsecase(accountRepository, profileRepository); + // return prepared method to call and create user + return usecase; + } +} + +export default createUserInfra; diff --git a/src/business-logic/core/users/create-user/ports.ts b/src/business-logic/core/users/create-user/ports.ts new file mode 100644 index 0000000..5103545 --- /dev/null +++ b/src/business-logic/core/users/create-user/ports.ts @@ -0,0 +1,7 @@ +import { HttpHandler as HttpProfileHandler } from './create-profile/data/repository/protocols'; +import { HttpHandler as HttpAccountHandler } from './create-account/data/repository/protocols'; + +export default interface createUserPort { + httpAccountHandler: HttpAccountHandler; + httpProfileHandler: HttpProfileHandler; +} diff --git a/src/business-logic/core/users/create-user/usecase/createUserUsecase.ts b/src/business-logic/core/users/create-user/usecase/createUserUsecase.ts index 29dee5f..aad7d6a 100644 --- a/src/business-logic/core/users/create-user/usecase/createUserUsecase.ts +++ b/src/business-logic/core/users/create-user/usecase/createUserUsecase.ts @@ -1,14 +1,27 @@ -import ICreateUserRepo from '../data/repository/ICreateUserRepo'; +import { INewUserData } from '../create-account/data/dto/protocols'; +import ICreateAcountRepo from '../create-account/data/repository/ICreateAcountRepo'; +import ICreateProfileRepo from '../create-profile/data/repository/ICreateProfileRepo'; export default class CreateUserUsecase { - private accountRepository: ICreateUserRepo; + private accountRepository: ICreateAcountRepo; - constructor(repository: ICreateUserRepo) { - this.repository = repository; + private profileRepository: ICreateProfileRepo; + + constructor(accountRepository: ICreateAcountRepo, profileRepository: ICreateProfileRepo) { + this.accountRepository = accountRepository; + this.profileRepository = profileRepository; } - async execute() { + async execute(newUser: INewUserData) { // create acount + const newAccountResponse = await this.accountRepository.execute(newUser); + const newProfileData = { + ...newAccountResponse, + ...newUser, + }; // create profile by account ID + const newProfileResponse = await this.profileRepository.execute(newProfileData); + + return newProfileResponse; } } diff --git a/src/driven/utils/helpers/repository-handler/repositoryHandler.ts b/src/driven/utils/helpers/repository-handler/repositoryHandler.ts new file mode 100644 index 0000000..163b4d7 --- /dev/null +++ b/src/driven/utils/helpers/repository-handler/repositoryHandler.ts @@ -0,0 +1,9 @@ +type HttpHandler = (newUser: NewDataToAdd) => Promise; + +export default class RepositoryHandler { + protected httpHandler: HttpHandler; + + constructor(httpHandler: HttpHandler) { + this.httpHandler = httpHandler; + } +}