import { IUseCase } from '../../../core/application/IUseCase'; import { Result } from '../../../core/domain/Result'; import { DomainError, ValidationError } from '../../../core/domain/DomainError'; import { IListRepository } from '../domain/IListRepository'; import { NoteList } from '../domain/NoteList'; import { ListItem } from '../domain/ListItem'; import { AddListItemDto } from './dtos/ListDtos'; export class AddListItemUseCase implements IUseCase { constructor(private readonly listRepository: IListRepository) {} public async execute(dto: AddListItemDto): Promise> { if (!dto.title || dto.title.trim().length === 0) { return Result.fail(new ValidationError('Item title is required')); } if (!dto.ownerId) { return Result.fail(new ValidationError('Owner ID is required')); } let targetList: NoteList | null = null; if (dto.listId) { targetList = await this.listRepository.findListById(dto.listId); } else if (dto.listTitle) { targetList = await this.listRepository.findListByTitleAndOwner(dto.listTitle.trim(), dto.ownerId); } // Если список не найден по названию (например, первая запись фильма), создаем список автоматически if (!targetList) { const listTitle = dto.listTitle?.trim() || 'Общий список'; const category = dto.category || (listTitle.toLowerCase().includes('фильм') ? 'movies' : 'general'); targetList = new NoteList({ id: `list-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`, title: listTitle, category: category, description: `Автоматически создан для ${listTitle}`, ownerId: dto.ownerId, createdAt: new Date(), updatedAt: new Date(), items: [] }); await this.listRepository.saveList(targetList); } const newItem = new ListItem({ id: `item-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`, listId: targetList.id, title: dto.title.trim(), description: dto.description || '', isCompleted: false, status: targetList.category === 'movies' ? 'want_to_watch' : 'todo', priority: dto.priority || 'normal', metadata: dto.metadata || {}, dueDate: null, createdAt: new Date(), updatedAt: new Date() }); await this.listRepository.saveItem(newItem); targetList.addItem(newItem); return Result.ok(newItem); } }