import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { IFeedRepository } from '../../domain/repositories/IFeedRepository'; import type { FeedItemDTO } from '../dto/FeedItemDTO'; import type { FeedItem } from '../../domain/types/FeedItem'; import type { IUserFeedPresenter, UserFeedViewModel, } from '../presenters/ISocialPresenters'; export interface GetUserFeedParams { driverId: string; limit?: number; } export class GetUserFeedUseCase implements AsyncUseCase { constructor( private readonly feedRepository: IFeedRepository, public readonly presenter: IUserFeedPresenter, ) {} async execute(params: GetUserFeedParams): Promise { const { driverId, limit } = params; const items = await this.feedRepository.getFeedForDriver(driverId, limit); const dtoItems = items.map(mapFeedItemToDTO); const viewModel: UserFeedViewModel = { items: dtoItems, }; this.presenter.present(viewModel); } } function mapFeedItemToDTO(item: FeedItem): FeedItemDTO { const mappedType = (item.type as string).replace(/-/g, '_') as FeedItemDTO['type']; const dto: FeedItemDTO = { id: item.id, timestamp: item.timestamp instanceof Date ? item.timestamp.toISOString() : new Date(item.timestamp).toISOString(), type: mappedType, headline: item.headline, }; if (item.actorFriendId !== undefined) dto.actorFriendId = item.actorFriendId; if (item.actorDriverId !== undefined) dto.actorDriverId = item.actorDriverId; if (item.leagueId !== undefined) dto.leagueId = item.leagueId; if (item.raceId !== undefined) dto.raceId = item.raceId; if (item.teamId !== undefined) dto.teamId = item.teamId; if (item.position !== undefined) dto.position = item.position; if (item.body !== undefined) dto.body = item.body; if (item.ctaLabel !== undefined) dto.ctaLabel = item.ctaLabel; if (item.ctaHref !== undefined) dto.ctaHref = item.ctaHref; return dto; }