Files
gridpilot.gg/core/racing/application/use-cases/RejectSponsorshipRequestUseCase.ts
2026-01-16 18:21:06 +01:00

100 lines
3.0 KiB
TypeScript

/**
* Use Case: RejectSponsorshipRequestUseCase
*
* Allows an entity owner to reject a sponsorship request.
*/
import type { Logger } from '@core/shared/domain/Logger';
import { Result } from '@core/shared/domain/Result';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import { SponsorshipRequestRepository } from '../../domain/repositories/SponsorshipRequestRepository';
export interface RejectSponsorshipRequestInput {
requestId: string;
respondedBy: string;
reason?: string;
}
export type RejectSponsorshipRequestResult = {
requestId: string;
status: 'rejected';
respondedAt: Date;
rejectionReason: string | undefined;
};
export type RejectSponsorshipRequestErrorCode =
| 'SPONSORSHIP_REQUEST_NOT_FOUND'
| 'SPONSORSHIP_REQUEST_NOT_PENDING'
| 'REPOSITORY_ERROR';
export class RejectSponsorshipRequestUseCase {
constructor(
private readonly sponsorshipRequestRepo: SponsorshipRequestRepository,
private readonly logger: Logger,
) {}
async execute(
input: RejectSponsorshipRequestInput,
): Promise<
Result<RejectSponsorshipRequestResult, ApplicationErrorCode<RejectSponsorshipRequestErrorCode, { message: string }>>
> {
const { requestId, respondedBy, reason } = input;
this.logger.debug('Executing RejectSponsorshipRequestUseCase', {
requestId,
respondedBy,
});
try {
const request = await this.sponsorshipRequestRepo.findById(requestId);
if (!request) {
this.logger.warn('Sponsorship request not found', { requestId, respondedBy });
return Result.err({
code: 'SPONSORSHIP_REQUEST_NOT_FOUND',
details: { message: 'Sponsorship request not found' },
});
}
if (!request.isPending()) {
this.logger.warn('Sponsorship request is not pending', {
requestId,
respondedBy,
status: request.status,
});
return Result.err({
code: 'SPONSORSHIP_REQUEST_NOT_PENDING',
details: { message: 'Sponsorship request is not pending' },
});
}
const rejectedRequest = request.reject(respondedBy, reason);
await this.sponsorshipRequestRepo.update(rejectedRequest);
const result: RejectSponsorshipRequestResult = {
requestId: rejectedRequest.id,
status: 'rejected',
respondedAt: rejectedRequest.respondedAt ?? new Date(),
rejectionReason: rejectedRequest.rejectionReason,
};
this.logger.info('Sponsorship request rejected successfully', {
requestId,
respondedBy,
});
return Result.ok(result);
} catch (error) {
const err = error instanceof Error ? error : new Error('Unknown error');
this.logger.error('Failed to reject sponsorship request', err, {
requestId,
respondedBy,
});
return Result.err({
code: 'REPOSITORY_ERROR',
details: { message: err.message ?? 'Failed to reject sponsorship request' },
});
}
}
}