d-webservice-example/source/d_webservice_example/business/todo_service.d
2018-12-18 22:18:06 +01:00

68 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;
}