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