d-webservice-example/source/d_webservice_example/business/todo_service.d

67 lines
1.6 KiB
D

module d_webservice_example.business.todo_service;
import d_webservice_example.model.todo : Todo;
import std.uuid : UUID, randomUUID;
class TodoService
{
import d_webservice_example.data.todo_update_do : TodoUpdateDO;
private:
TodoRepository todoRepository;
public:
this(TodoRepository todoRepository) nothrow pure @nogc @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;
}