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