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

78 lines
2 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.business.todo_notification_service : TodoNotificationService;
import d_webservice_example.data.todo_update_do : TodoUpdateDO;
import vibe.core.log : logInfo;
private:
TodoRepository todoRepository;
public:
this(TodoRepository todoRepository) nothrow pure @nogc @safe
{
this.todoRepository = todoRepository;
}
Todo createTodo(const Todo newTodo) @safe
{
immutable createdTodo = todoRepository.save(Todo(newTodo.title,
newTodo.content, randomUUID));
logInfo("Created todo %s", createdTodo);
return createdTodo;
}
Todo[] getAllTodos() @safe
{
return todoRepository.findAll;
}
Todo getTodoByUuid(const UUID uuid) @safe
{
import std.exception : enforce;
import vibe.http.common : HTTPStatus, HTTPStatusException;
import optional.optional : orElse;
immutable todo = todoRepository.findByUuid(uuid).orElse!(function Todo() {
throw new HTTPStatusException(HTTPStatus.NotFound);
});
return todo;
}
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;
immutable updatedTodo = todoRepository.save(todo);
logInfo("Updated todo %s", updatedTodo);
return updatedTodo;
}
Todo deleteTodo(UUID uuid) @safe
{
immutable todo = getTodoByUuid(uuid);
todoRepository.remove(todo);
logInfo("Deleted todo %s", todo);
return todo;
}
}
interface TodoRepository
{
import optional.optional : Optional;
Todo save(Todo todo) @safe;
bool remove(Todo todo) @safe;
Optional!Todo findByUuid(UUID uuid) @safe;
Todo[] findAll() @safe;
}