feat: restructure into XFlow monorepo with Nuxt 4, Modular Onion Monolith, Android client, and Desktop CLI
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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<AddListItemDto, ListItem> {
|
||||
constructor(private readonly listRepository: IListRepository) {}
|
||||
|
||||
public async execute(dto: AddListItemDto): Promise<Result<ListItem, DomainError>> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user