Техническое задание (Go-реализация)
git clone https://github.com/aaa2ppp/org-tree-api.git
cd org-tree-apiПример всех используемых переменных окружения находится в файле dot.env.example.
Скопируйте его и отредактируйте под свои нужды:
cp dot.env.example .env
# Сгенерировать случайный пароль для базы данных
echo -e "\nDB_PASSWORD='$(head -c16 /dev/urandom | base64)'" >> .env# Загрузить переменные окружения
. dev-env
# Установить зависимости и проверить утилиты (при необходимости будут установлены)
make deps check-tools
# Запустить приложение
make run# Запустить приложение в контейнере
make docker-runПо умолчанию Swagger доступен на http://localhost:8080/swagger/
# Удалить контейнеры и том базы данных
make docker-down-volumes
# Удалит локально собранные бинарники и временные файлы
make cleanВсе доступные команды make можно посмотреть, выполнив:
make help-
Допустимый диапазон идентификаторов:
1..2147483647Особые значения (для внутреннего использования):
-1— Виртуальный корень (содержит все подразделения верхнего уровня)0—undefinedиспользуется вMoveDepartmentRequest(PATCH /departments/{department_id})
-
Вывод подразделений верхнего уровня
Добавлена ручкаGET /departments- возвращает массив подразделений верхнего уровня, в остальном аналогиченGET /departments/{department_id}. -
Parent ID для корневых подразделений.
ТЗ неявно предполагает для подразделений верхнего уровняparent_id = null(или отсутствие поля).
Предложение: использоватьparent_id = -1для обозначения корневого узла. Это позволит отказаться отnullв API, упростит валидацию запросов и соответствует внутренней модели сервиса. -
Сортировка в
GET /departments/{department_id}.
ТЗ указывает: "еслиinclude_employees=true, сортировка поcreated_atилиfull_name", но не регламентирует порядок выводаchildren.Добавлен параметр
sort_by, который определяет порядок сортировки подотделов и сотрудников. -
Параметр
depthвGET /departments/{department_id}.
ТЗ: "depth: int (по умолчанию 1, максимум 5) — глубина вложенных подразделений в ответе".
Уточнение определения.
В реализации используется общепринятое определение:
Глубина узла — количество ребер (шагов) от корневого узла до рассматриваемого узла.
При таком подходеdepth=1(значение по умолчанию) означает вывод самого узла и всех его прямых потомков.
Замечание: возможно, заказчик подразумевал другое поведение (например,depth=1— только узел, без потомков). -
Перемещение дочених подразделений в
DELETE /departments/{department_id}.
ТЗ: еслиmode = reassign"сотрудников перевести вreassign_to_department_id", но не указано, что делать с дочерними подразделениями.
Реализовано перемещение дочерних подразделений вreassign_to_department_idаналогично сотрудникам. -
Хранилище в памяти
Для целей тестирования реализована возможность хранение данных в памяти. Чтобы получить самодостаточный бинарник, для которого не требуется база данных, сервер должен быть собран с тегом сборки-tags memstor.
ВАЖНО: Массовые операции не поддерживают откат. При обнаружении конфликта сбойная операция будет выполнена частично с сохранением целостности дерева. В случае паники целостность не гарантируется.