/** * Application Use Case: CreateSponsorUseCase * * Creates a new sponsor. */ import type { ISponsorRepository } from '../../domain/repositories/ISponsorRepository'; import type { ICreateSponsorPresenter, CreateSponsorResultDTO, CreateSponsorViewModel, } from '../presenters/ICreateSponsorPresenter'; import type { UseCase } from '@core/shared/application/UseCase'; export interface CreateSponsorInput { name: string; contactEmail: string; websiteUrl?: string; logoUrl?: string; } export class CreateSponsorUseCase implements UseCase { constructor( private readonly sponsorRepository: ISponsorRepository, ) {} async execute( input: CreateSponsorInput, presenter: ICreateSponsorPresenter, ): Promise { presenter.reset(); const id = `sponsor-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const sponsor = Sponsor.create({ id, name: input.name, contactEmail: input.contactEmail, ...(input.websiteUrl !== undefined ? { websiteUrl: input.websiteUrl } : {}), ...(input.logoUrl !== undefined ? { logoUrl: input.logoUrl } : {}), } as unknown); await this.sponsorRepository.create(sponsor); const dto: CreateSponsorResultDTO = { sponsor: { id: sponsor.id, name: sponsor.name, contactEmail: sponsor.contactEmail, websiteUrl: sponsor.websiteUrl, logoUrl: sponsor.logoUrl, createdAt: sponsor.createdAt, }, }; presenter.present(dto); } }