import type { Logger } from '@core/shared/application'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { TeamMembership, TeamMembershipStatus, TeamRole, TeamJoinRequest, } from '../../domain/types/TeamMembership'; import type { ApproveTeamJoinRequestCommandDTO } from '../dto/TeamCommandAndQueryDTO'; import type { AsyncUseCase } from '@core/shared/application'; export class ApproveTeamJoinRequestUseCase implements AsyncUseCase { constructor( private readonly membershipRepository: ITeamMembershipRepository, private readonly logger: Logger, ) {} async execute(command: ApproveTeamJoinRequestCommandDTO): Promise { const { requestId } = command; this.logger.debug( `Attempting to approve team join request with ID: ${requestId}`, ); // There is no repository method to look up a single request by ID, try { // There is no repository method to look up a single request by ID, // so we rely on the repository implementation to surface all relevant // requests via getJoinRequests and search by ID here. const allRequests: TeamJoinRequest[] = await this.membershipRepository.getJoinRequests( // For the in-memory fake used in tests, the teamId argument is ignored // and all requests are returned.' '' as string, ); const request = allRequests.find((r) => r.id === requestId); if (!request) { this.logger.warn(`Team join request with ID ${requestId} not found`); throw new Error('Join request not found'); } const membership: TeamMembership = { teamId: request.teamId, driverId: request.driverId, role: 'driver' as TeamRole, status: 'active' as TeamMembershipStatus, joinedAt: new Date(), }; await this.membershipRepository.saveMembership(membership); this.logger.info( `Team membership created for driver ${request.driverId} in team ${request.teamId} from request ${requestId}`, ); await this.membershipRepository.removeJoinRequest(requestId); this.logger.info(`Team join request with ID ${requestId} removed`); } catch (error) { this.logger.error(`Failed to approve team join request ${requestId}:`, error); throw error; } } }