254 lines
12 KiB
TypeScript
254 lines
12 KiB
TypeScript
import { Provider } from '@nestjs/common';
|
|
import { PaymentsService } from './PaymentsService';
|
|
|
|
// Import core interfaces
|
|
import type { IPaymentRepository } from '@core/payments/domain/repositories/IPaymentRepository';
|
|
import type { IMembershipFeeRepository, IMemberPaymentRepository } from '@core/payments/domain/repositories/IMembershipFeeRepository';
|
|
import type { IPrizeRepository } from '@core/payments/domain/repositories/IPrizeRepository';
|
|
import type { IWalletRepository, ITransactionRepository } from '@core/payments/domain/repositories/IWalletRepository';
|
|
import type { Logger, UseCaseOutputPort } from '@core/shared/application';
|
|
|
|
// Import use cases
|
|
import { GetPaymentsUseCase } from '@core/payments/application/use-cases/GetPaymentsUseCase';
|
|
import { CreatePaymentUseCase } from '@core/payments/application/use-cases/CreatePaymentUseCase';
|
|
import { UpdatePaymentStatusUseCase } from '@core/payments/application/use-cases/UpdatePaymentStatusUseCase';
|
|
import { GetMembershipFeesUseCase } from '@core/payments/application/use-cases/GetMembershipFeesUseCase';
|
|
import { UpsertMembershipFeeUseCase } from '@core/payments/application/use-cases/UpsertMembershipFeeUseCase';
|
|
import { UpdateMemberPaymentUseCase } from '@core/payments/application/use-cases/UpdateMemberPaymentUseCase';
|
|
import { GetPrizesUseCase } from '@core/payments/application/use-cases/GetPrizesUseCase';
|
|
import { CreatePrizeUseCase } from '@core/payments/application/use-cases/CreatePrizeUseCase';
|
|
import { AwardPrizeUseCase } from '@core/payments/application/use-cases/AwardPrizeUseCase';
|
|
import { DeletePrizeUseCase } from '@core/payments/application/use-cases/DeletePrizeUseCase';
|
|
import { GetWalletUseCase } from '@core/payments/application/use-cases/GetWalletUseCase';
|
|
import { ProcessWalletTransactionUseCase } from '@core/payments/application/use-cases/ProcessWalletTransactionUseCase';
|
|
|
|
// Import concrete in-memory implementations
|
|
import { InMemoryPaymentRepository } from '@adapters/payments/persistence/inmemory/InMemoryPaymentRepository';
|
|
import { InMemoryMembershipFeeRepository, InMemoryMemberPaymentRepository } from '@adapters/payments/persistence/inmemory/InMemoryMembershipFeeRepository';
|
|
import { InMemoryPrizeRepository } from '@adapters/payments/persistence/inmemory/InMemoryPrizeRepository';
|
|
import { InMemoryWalletRepository, InMemoryTransactionRepository } from '@adapters/payments/persistence/inmemory/InMemoryWalletRepository';
|
|
import { ConsoleLogger } from '@adapters/logging/ConsoleLogger';
|
|
|
|
// Presenters
|
|
import { GetPaymentsPresenter } from './presenters/GetPaymentsPresenter';
|
|
import { CreatePaymentPresenter } from './presenters/CreatePaymentPresenter';
|
|
import { UpdatePaymentStatusPresenter } from './presenters/UpdatePaymentStatusPresenter';
|
|
import { GetMembershipFeesPresenter } from './presenters/GetMembershipFeesPresenter';
|
|
import { UpsertMembershipFeePresenter } from './presenters/UpsertMembershipFeePresenter';
|
|
import { UpdateMemberPaymentPresenter } from './presenters/UpdateMemberPaymentPresenter';
|
|
import { GetPrizesPresenter } from './presenters/GetPrizesPresenter';
|
|
import { CreatePrizePresenter } from './presenters/CreatePrizePresenter';
|
|
import { AwardPrizePresenter } from './presenters/AwardPrizePresenter';
|
|
import { DeletePrizePresenter } from './presenters/DeletePrizePresenter';
|
|
import { GetWalletPresenter } from './presenters/GetWalletPresenter';
|
|
import { ProcessWalletTransactionPresenter } from './presenters/ProcessWalletTransactionPresenter';
|
|
|
|
// Repository injection tokens
|
|
export const PAYMENT_REPOSITORY_TOKEN = 'IPaymentRepository';
|
|
export const MEMBERSHIP_FEE_REPOSITORY_TOKEN = 'IMembershipFeeRepository';
|
|
export const MEMBER_PAYMENT_REPOSITORY_TOKEN = 'IMemberPaymentRepository';
|
|
export const PRIZE_REPOSITORY_TOKEN = 'IPrizeRepository';
|
|
export const WALLET_REPOSITORY_TOKEN = 'IWalletRepository';
|
|
export const TRANSACTION_REPOSITORY_TOKEN = 'ITransactionRepository';
|
|
export const LOGGER_TOKEN = 'Logger';
|
|
|
|
// Use case injection tokens
|
|
export const GET_PAYMENTS_USE_CASE_TOKEN = 'GetPaymentsUseCase';
|
|
export const CREATE_PAYMENT_USE_CASE_TOKEN = 'CreatePaymentUseCase';
|
|
export const UPDATE_PAYMENT_STATUS_USE_CASE_TOKEN = 'UpdatePaymentStatusUseCase';
|
|
export const GET_MEMBERSHIP_FEES_USE_CASE_TOKEN = 'GetMembershipFeesUseCase';
|
|
export const UPSERT_MEMBERSHIP_FEE_USE_CASE_TOKEN = 'UpsertMembershipFeeUseCase';
|
|
export const UPDATE_MEMBER_PAYMENT_USE_CASE_TOKEN = 'UpdateMemberPaymentUseCase';
|
|
export const GET_PRIZES_USE_CASE_TOKEN = 'GetPrizesUseCase';
|
|
export const CREATE_PRIZE_USE_CASE_TOKEN = 'CreatePrizeUseCase';
|
|
export const AWARD_PRIZE_USE_CASE_TOKEN = 'AwardPrizeUseCase';
|
|
export const DELETE_PRIZE_USE_CASE_TOKEN = 'DeletePrizeUseCase';
|
|
export const GET_WALLET_USE_CASE_TOKEN = 'GetWalletUseCase';
|
|
export const PROCESS_WALLET_TRANSACTION_USE_CASE_TOKEN = 'ProcessWalletTransactionUseCase';
|
|
|
|
// Output port tokens
|
|
export const GET_PAYMENTS_OUTPUT_PORT_TOKEN = 'GetPaymentsOutputPort_TOKEN';
|
|
export const CREATE_PAYMENT_OUTPUT_PORT_TOKEN = 'CreatePaymentOutputPort_TOKEN';
|
|
export const UPDATE_PAYMENT_STATUS_OUTPUT_PORT_TOKEN = 'UpdatePaymentStatusOutputPort_TOKEN';
|
|
export const GET_MEMBERSHIP_FEES_OUTPUT_PORT_TOKEN = 'GetMembershipFeesOutputPort_TOKEN';
|
|
export const UPSERT_MEMBERSHIP_FEE_OUTPUT_PORT_TOKEN = 'UpsertMembershipFeeOutputPort_TOKEN';
|
|
export const UPDATE_MEMBER_PAYMENT_OUTPUT_PORT_TOKEN = 'UpdateMemberPaymentOutputPort_TOKEN';
|
|
export const GET_PRIZES_OUTPUT_PORT_TOKEN = 'GetPrizesOutputPort_TOKEN';
|
|
export const CREATE_PRIZE_OUTPUT_PORT_TOKEN = 'CreatePrizeOutputPort_TOKEN';
|
|
export const AWARD_PRIZE_OUTPUT_PORT_TOKEN = 'AwardPrizeOutputPort_TOKEN';
|
|
export const DELETE_PRIZE_OUTPUT_PORT_TOKEN = 'DeletePrizeOutputPort_TOKEN';
|
|
export const GET_WALLET_OUTPUT_PORT_TOKEN = 'GetWalletOutputPort_TOKEN';
|
|
export const PROCESS_WALLET_TRANSACTION_OUTPUT_PORT_TOKEN = 'ProcessWalletTransactionOutputPort_TOKEN';
|
|
|
|
export const PaymentsProviders: Provider[] = [
|
|
PaymentsService,
|
|
|
|
// Presenters
|
|
GetPaymentsPresenter,
|
|
CreatePaymentPresenter,
|
|
UpdatePaymentStatusPresenter,
|
|
GetMembershipFeesPresenter,
|
|
UpsertMembershipFeePresenter,
|
|
UpdateMemberPaymentPresenter,
|
|
GetPrizesPresenter,
|
|
CreatePrizePresenter,
|
|
AwardPrizePresenter,
|
|
DeletePrizePresenter,
|
|
GetWalletPresenter,
|
|
ProcessWalletTransactionPresenter,
|
|
|
|
// Output ports
|
|
{
|
|
provide: GET_PAYMENTS_OUTPUT_PORT_TOKEN,
|
|
useExisting: GetPaymentsPresenter,
|
|
},
|
|
{
|
|
provide: CREATE_PAYMENT_OUTPUT_PORT_TOKEN,
|
|
useExisting: CreatePaymentPresenter,
|
|
},
|
|
{
|
|
provide: UPDATE_PAYMENT_STATUS_OUTPUT_PORT_TOKEN,
|
|
useExisting: UpdatePaymentStatusPresenter,
|
|
},
|
|
{
|
|
provide: GET_MEMBERSHIP_FEES_OUTPUT_PORT_TOKEN,
|
|
useExisting: GetMembershipFeesPresenter,
|
|
},
|
|
{
|
|
provide: UPSERT_MEMBERSHIP_FEE_OUTPUT_PORT_TOKEN,
|
|
useExisting: UpsertMembershipFeePresenter,
|
|
},
|
|
{
|
|
provide: UPDATE_MEMBER_PAYMENT_OUTPUT_PORT_TOKEN,
|
|
useExisting: UpdateMemberPaymentPresenter,
|
|
},
|
|
{
|
|
provide: GET_PRIZES_OUTPUT_PORT_TOKEN,
|
|
useExisting: GetPrizesPresenter,
|
|
},
|
|
{
|
|
provide: CREATE_PRIZE_OUTPUT_PORT_TOKEN,
|
|
useExisting: CreatePrizePresenter,
|
|
},
|
|
{
|
|
provide: AWARD_PRIZE_OUTPUT_PORT_TOKEN,
|
|
useExisting: AwardPrizePresenter,
|
|
},
|
|
{
|
|
provide: DELETE_PRIZE_OUTPUT_PORT_TOKEN,
|
|
useExisting: DeletePrizePresenter,
|
|
},
|
|
{
|
|
provide: GET_WALLET_OUTPUT_PORT_TOKEN,
|
|
useExisting: GetWalletPresenter,
|
|
},
|
|
{
|
|
provide: PROCESS_WALLET_TRANSACTION_OUTPUT_PORT_TOKEN,
|
|
useExisting: ProcessWalletTransactionPresenter,
|
|
},
|
|
|
|
// Logger
|
|
{
|
|
provide: LOGGER_TOKEN,
|
|
useClass: ConsoleLogger,
|
|
},
|
|
|
|
// Repositories (repositories are injected into use cases, NOT into services)
|
|
{
|
|
provide: PAYMENT_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryPaymentRepository(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: MEMBERSHIP_FEE_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryMembershipFeeRepository(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: MEMBER_PAYMENT_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryMemberPaymentRepository(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: PRIZE_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryPrizeRepository(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: WALLET_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryWalletRepository(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
{
|
|
provide: TRANSACTION_REPOSITORY_TOKEN,
|
|
useFactory: (logger: Logger) => new InMemoryTransactionRepository(logger),
|
|
inject: [LOGGER_TOKEN],
|
|
},
|
|
|
|
// Use cases (use cases receive repositories, services receive use cases)
|
|
{
|
|
provide: GET_PAYMENTS_USE_CASE_TOKEN,
|
|
useFactory: (paymentRepo: IPaymentRepository, output: UseCaseOutputPort<any>) => new GetPaymentsUseCase(paymentRepo, output),
|
|
inject: [PAYMENT_REPOSITORY_TOKEN, GET_PAYMENTS_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: CREATE_PAYMENT_USE_CASE_TOKEN,
|
|
useFactory: (paymentRepo: IPaymentRepository, output: UseCaseOutputPort<any>) => new CreatePaymentUseCase(paymentRepo, output),
|
|
inject: [PAYMENT_REPOSITORY_TOKEN, CREATE_PAYMENT_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: UPDATE_PAYMENT_STATUS_USE_CASE_TOKEN,
|
|
useFactory: (paymentRepo: IPaymentRepository, output: UseCaseOutputPort<any>) => new UpdatePaymentStatusUseCase(paymentRepo, output),
|
|
inject: [PAYMENT_REPOSITORY_TOKEN, UPDATE_PAYMENT_STATUS_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_MEMBERSHIP_FEES_USE_CASE_TOKEN,
|
|
useFactory: (membershipFeeRepo: IMembershipFeeRepository, memberPaymentRepo: IMemberPaymentRepository, output: UseCaseOutputPort<any>) =>
|
|
new GetMembershipFeesUseCase(membershipFeeRepo, memberPaymentRepo, output),
|
|
inject: [MEMBERSHIP_FEE_REPOSITORY_TOKEN, MEMBER_PAYMENT_REPOSITORY_TOKEN, GET_MEMBERSHIP_FEES_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: UPSERT_MEMBERSHIP_FEE_USE_CASE_TOKEN,
|
|
useFactory: (membershipFeeRepo: IMembershipFeeRepository, output: UseCaseOutputPort<any>) => new UpsertMembershipFeeUseCase(membershipFeeRepo, output),
|
|
inject: [MEMBERSHIP_FEE_REPOSITORY_TOKEN, UPSERT_MEMBERSHIP_FEE_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: UPDATE_MEMBER_PAYMENT_USE_CASE_TOKEN,
|
|
useFactory: (membershipFeeRepo: IMembershipFeeRepository, memberPaymentRepo: IMemberPaymentRepository, output: UseCaseOutputPort<any>) =>
|
|
new UpdateMemberPaymentUseCase(membershipFeeRepo, memberPaymentRepo, output),
|
|
inject: [MEMBERSHIP_FEE_REPOSITORY_TOKEN, MEMBER_PAYMENT_REPOSITORY_TOKEN, UPDATE_MEMBER_PAYMENT_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_PRIZES_USE_CASE_TOKEN,
|
|
useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort<any>) => new GetPrizesUseCase(prizeRepo, output),
|
|
inject: [PRIZE_REPOSITORY_TOKEN, GET_PRIZES_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: CREATE_PRIZE_USE_CASE_TOKEN,
|
|
useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort<any>) => new CreatePrizeUseCase(prizeRepo, output),
|
|
inject: [PRIZE_REPOSITORY_TOKEN, CREATE_PRIZE_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: AWARD_PRIZE_USE_CASE_TOKEN,
|
|
useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort<any>) => new AwardPrizeUseCase(prizeRepo, output),
|
|
inject: [PRIZE_REPOSITORY_TOKEN, AWARD_PRIZE_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: DELETE_PRIZE_USE_CASE_TOKEN,
|
|
useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort<any>) => new DeletePrizeUseCase(prizeRepo, output),
|
|
inject: [PRIZE_REPOSITORY_TOKEN, DELETE_PRIZE_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: GET_WALLET_USE_CASE_TOKEN,
|
|
useFactory: (walletRepo: IWalletRepository, transactionRepo: ITransactionRepository, output: UseCaseOutputPort<any>) =>
|
|
new GetWalletUseCase(walletRepo, transactionRepo, output),
|
|
inject: [WALLET_REPOSITORY_TOKEN, TRANSACTION_REPOSITORY_TOKEN, GET_WALLET_OUTPUT_PORT_TOKEN],
|
|
},
|
|
{
|
|
provide: PROCESS_WALLET_TRANSACTION_USE_CASE_TOKEN,
|
|
useFactory: (walletRepo: IWalletRepository, transactionRepo: ITransactionRepository, output: UseCaseOutputPort<any>) =>
|
|
new ProcessWalletTransactionUseCase(walletRepo, transactionRepo, output),
|
|
inject: [WALLET_REPOSITORY_TOKEN, TRANSACTION_REPOSITORY_TOKEN, PROCESS_WALLET_TRANSACTION_OUTPUT_PORT_TOKEN],
|
|
},
|
|
];
|