31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { IUseCase } from '../../core/application/IUseCase';
|
|
import { Result } from '../../core/domain/Result';
|
|
import { DomainError, NotFoundError, ValidationError } from '../../core/domain/DomainError';
|
|
import { IListRepository } from '../domain/IListRepository';
|
|
import { ListItem } from '../domain/ListItem';
|
|
import { ToggleListItemDto } from './dtos/ListDtos';
|
|
|
|
export class ToggleListItemUseCase implements IUseCase<ToggleListItemDto, ListItem> {
|
|
constructor(private readonly listRepository: IListRepository) {}
|
|
|
|
public async execute(dto: ToggleListItemDto): Promise<Result<ListItem, DomainError>> {
|
|
if (!dto.itemId) {
|
|
return Result.fail(new ValidationError('Item ID is required'));
|
|
}
|
|
|
|
const item = await this.listRepository.findItemById(dto.itemId);
|
|
if (!item) {
|
|
return Result.fail(new NotFoundError(`Item with ID ${dto.itemId} not found`));
|
|
}
|
|
|
|
if (dto.status) {
|
|
item.updateStatus(dto.status);
|
|
} else {
|
|
item.toggleCompleted();
|
|
}
|
|
|
|
await this.listRepository.saveItem(item);
|
|
return Result.ok(item);
|
|
}
|
|
}
|