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) => new GetPaymentsUseCase(paymentRepo, output), inject: [PAYMENT_REPOSITORY_TOKEN, GET_PAYMENTS_OUTPUT_PORT_TOKEN], }, { provide: CREATE_PAYMENT_USE_CASE_TOKEN, useFactory: (paymentRepo: IPaymentRepository, output: UseCaseOutputPort) => 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) => 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) => 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) => 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) => 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) => new GetPrizesUseCase(prizeRepo, output), inject: [PRIZE_REPOSITORY_TOKEN, GET_PRIZES_OUTPUT_PORT_TOKEN], }, { provide: CREATE_PRIZE_USE_CASE_TOKEN, useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort) => new CreatePrizeUseCase(prizeRepo, output), inject: [PRIZE_REPOSITORY_TOKEN, CREATE_PRIZE_OUTPUT_PORT_TOKEN], }, { provide: AWARD_PRIZE_USE_CASE_TOKEN, useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort) => new AwardPrizeUseCase(prizeRepo, output), inject: [PRIZE_REPOSITORY_TOKEN, AWARD_PRIZE_OUTPUT_PORT_TOKEN], }, { provide: DELETE_PRIZE_USE_CASE_TOKEN, useFactory: (prizeRepo: IPrizeRepository, output: UseCaseOutputPort) => 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) => 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) => new ProcessWalletTransactionUseCase(walletRepo, transactionRepo, output), inject: [WALLET_REPOSITORY_TOKEN, TRANSACTION_REPOSITORY_TOKEN, PROCESS_WALLET_TRANSACTION_OUTPUT_PORT_TOKEN], }, ];