HTTP API организационной структуры на Go: net/http, GORM, PostgreSQL, goose migrations, Docker Compose.
docker-compose up --buildAPI будет доступен на http://localhost:8080.
Проверка:
curl http://localhost:8080/healthcmd/app/main.go точка входа
configs/local_config.yml конфигурация приложения через viper
internal/runner сборка зависимостей и graceful shutdown
internal/router маршруты и middleware логирования
internal/api HTTP handlers
internal/config загрузка конфигурации
internal/database подключение PostgreSQL
internal/model GORM модели
internal/repository работа с БД
internal/service бизнес-логика
pkg logger и обработка ошибок
migrations goose SQL migrations
Создать подразделение:
curl -X POST http://localhost:8080/departments/ \
-H 'Content-Type: application/json' \
-d '{"name":"Engineering"}'Создать дочернее подразделение:
curl -X POST http://localhost:8080/departments/ \
-H 'Content-Type: application/json' \
-d '{"name":"Backend","parent_id":1}'Создать сотрудника:
curl -X POST http://localhost:8080/departments/2/employees/ \
-H 'Content-Type: application/json' \
-d '{"full_name":"Ivan Petrov","position":"Go Developer","hired_at":"2026-05-21"}'Получить подразделение с поддеревом:
curl 'http://localhost:8080/departments/1?depth=3&include_employees=true'Переименовать или переместить подразделение:
curl -X PATCH http://localhost:8080/departments/2 \
-H 'Content-Type: application/json' \
-d '{"name":"Platform Backend","parent_id":null}'Удалить каскадно:
curl -X DELETE 'http://localhost:8080/departments/1?mode=cascade'Удалить с переводом сотрудников:
curl -X DELETE 'http://localhost:8080/departments/2?mode=reassign&reassign_to_department_id=1'- Названия подразделений, ФИО и должности триммятся и валидируются на длину
1..200. - Название подразделения уникально в рамках одного parent.
- Нельзя создать сотрудника в несуществующем подразделении.
- Нельзя назначить подразделение родителем самому себе.
- Нельзя переместить подразделение внутрь собственного поддерева.
GET /departments/{id}строит дерево доdepth <= 5пакетными запросами по уровням, без классического N+1.DELETE mode=cascadeопирается наON DELETE CASCADEв PostgreSQL.DELETE mode=reassignпереводит сотрудников удаляемого поддерева в указанный отдел и удаляет поддерево в одной транзакции.
go test ./...