Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Org Structure API

HTTP API организационной структуры на Go: net/http, GORM, PostgreSQL, goose migrations, Docker Compose.

Запуск

docker-compose up --build

API будет доступен на http://localhost:8080.

Проверка:

curl http://localhost:8080/health

Структура

cmd/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

API

Создать подразделение:

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 ./...

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages