69 lines
1.7 KiB
D
69 lines
1.7 KiB
D
|
module d_webservice_example.business.todo_service;
|
||
|
|
||
|
import aermicioi.aedi : autowired, component;
|
||
|
import d_webservice_example.model.todo : Todo;
|
||
|
import std.uuid : UUID, randomUUID;
|
||
|
|
||
|
@component class TodoService
|
||
|
{
|
||
|
import d_webservice_example.data.todo_update_do : TodoUpdateDO;
|
||
|
|
||
|
private:
|
||
|
TodoRepository todoRepository;
|
||
|
|
||
|
public:
|
||
|
|
||
|
@autowired this(TodoRepository todoRepository) @safe
|
||
|
{
|
||
|
this.todoRepository = todoRepository;
|
||
|
}
|
||
|
|
||
|
Todo createTodo(Todo newTodo) @safe
|
||
|
{
|
||
|
immutable todo = Todo(newTodo.title, newTodo.content, randomUUID());
|
||
|
return todoRepository.save(todo);
|
||
|
}
|
||
|
|
||
|
Todo[] getAllTodos() @safe
|
||
|
{
|
||
|
return todoRepository.findAll();
|
||
|
}
|
||
|
|
||
|
Todo getTodoByUuid(const UUID uuid) @safe
|
||
|
{
|
||
|
import std.exception : enforce;
|
||
|
import vibe.http.common : HTTPStatus, HTTPStatusException;
|
||
|
|
||
|
immutable maybeTodo = todoRepository.findByUuid(uuid);
|
||
|
enforce(!maybeTodo.isNull, new HTTPStatusException(HTTPStatus.NotFound));
|
||
|
return maybeTodo.get;
|
||
|
}
|
||
|
|
||
|
Todo updateTodo(UUID uuid, const TodoUpdateDO todoUpdate) @safe
|
||
|
{
|
||
|
auto todo = getTodoByUuid(uuid);
|
||
|
if (todoUpdate.title != null)
|
||
|
todo.title = todoUpdate.title;
|
||
|
if (todoUpdate.content != null)
|
||
|
todo.content = todoUpdate.content;
|
||
|
|
||
|
return todoRepository.save(todo);
|
||
|
}
|
||
|
|
||
|
void deleteTodo(UUID uuid) @safe
|
||
|
{
|
||
|
immutable todo = getTodoByUuid(uuid);
|
||
|
todoRepository.remove(todo);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
interface TodoRepository
|
||
|
{
|
||
|
import std.typecons : Nullable;
|
||
|
|
||
|
Todo save(Todo todo) @safe;
|
||
|
bool remove(Todo todo) @safe;
|
||
|
Nullable!Todo findByUuid(UUID uuid) @safe;
|
||
|
Todo[] findAll() @safe;
|
||
|
}
|