Files
gridpilot.gg/core/social/application/use-cases/GetUserFeedUseCase.ts
2026-01-16 19:46:49 +01:00

71 lines
1.9 KiB
TypeScript

import type { Logger } from '@core/shared/domain/Logger';
import { Result } from '@core/shared/domain/Result';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import { FeedRepository } from '../../domain/repositories/FeedRepository';
import type { FeedItem } from '../../domain/types/FeedItem';
export interface GetUserFeedParams {
driverId: string;
limit?: number;
}
export type GetUserFeedInput = GetUserFeedParams;
export interface GetUserFeedResult {
items: FeedItem[];
}
export type GetUserFeedErrorCode = 'REPOSITORY_ERROR';
export type GetUserFeedApplicationError = ApplicationErrorCode<
GetUserFeedErrorCode,
{ message: string }
>;
export class GetUserFeedUseCase {
constructor(
private readonly feedRepository: FeedRepository,
private readonly logger: Logger,
) {}
async execute(
input: GetUserFeedInput,
): Promise<Result<GetUserFeedResult, GetUserFeedApplicationError>> {
const { driverId, limit } = input;
this.logger.debug('GetUserFeedUseCase.execute started', { driverId, limit });
try {
const items = await this.feedRepository.getFeedForDriver(driverId, limit);
this.logger.info('GetUserFeedUseCase.execute succeeded', {
driverId,
itemCount: items.length,
});
if (items.length === 0) {
this.logger.warn(`No feed items found for driverId: ${driverId}`);
}
const result: GetUserFeedResult = {
items,
};
return Result.ok(result);
} catch (error) {
const err = error instanceof Error ? error : new Error(String(error));
this.logger.error(
'GetUserFeedUseCase.execute failed',
err,
{ input },
);
return Result.err({
code: 'REPOSITORY_ERROR',
details: {
message: err.message,
},
} as GetUserFeedApplicationError);
}
}
}