REST API для хранения и раздачи документов с кэшированием и простым управлением сессиями.
- Регистрация пользователя (через админ-токен)
- Аутентификация и сессии (in-memory)
- Загрузка документов (файл или JSON), список, получение по id, удаление
- Кэширование ответов в памяти для ускорения повторных запросов
- Документация Swagger и статическая раздача JSON спецификации
- Go 1.22+
- PostgreSQL 13+
Настройки читаются из файла .enb в корне проекта:
Пример .enb:
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=postgres
DB_NAME=astra
ADMIN_TOKEN=changeme
AUTO_MIGRATE=true
Поля:
- DB_* — параметры подключения к БД
- ADMIN_TOKEN — токен, требуемый для регистрации пользователей
- AUTO_MIGRATE — если
true, миграции применяются при старте
- База данных (локально через docker-compose):
docker-compose up -d- Приложение:
go run ./cmdПри AUTO_MIGRATE=true миграции из каталога ./migrations применятся автоматически.
internal/repository— доступ к данным (Postgres, sqlx)interface.go— интерфейсы репозиториев (UserRepositoryInterface,DocumentRepositoryInterface)user.go,document.go— реализации
internal/service— бизнес-логикаinterface.go— интерфейсы сервисов (AuthServiceInterface,DocsServiceInterface,SessionServiceInterface)auth.go,docs.go,session.go— реализации
internal/handler— HTTP-обработчикиinternal/middleware— middleware (логирование запросов, проверка авторизации)internal/cache— простой in-memory кэш с TTL и инвалидациейcmd/main.go— точка входа, DI, роутинг
Аутентификация:
- POST
/api/register— регистрация- body:
{ "login": string, "pswd": string, "token": string }(token = ADMIN_TOKEN) - 200:
{ "response": { "login": string } }
- body:
- POST
/api/auth— логин- body:
{ "login": string, "pswd": string } - 200:
{ "response": { "token": string } }
- body:
- DELETE
/api/auth/{token}— логаут- 200:
{ "response": { "<token>": true } }
- 200:
Документы (требуется токен):
- POST
/api/docs— загрузка- form-data:
token,meta(json c описанием: name, file, public, mime, grants[]),file(опционально),json(опционально) - 200:
{ "data": { "id": string, "file": string, "json": any|null } }
- form-data:
- GET|HEAD
/api/docs— список- query:
token,login(опц.),limit(опц.) - 200:
{ "data": { "docs": Document[] } }
- query:
- GET|HEAD
/api/docs/{id}— получить по id- query:
token - 200: если
file=true— отдаётся файл, иначе JSON из поляjson_data
- query:
- DELETE
/api/docs/{id}— удалить по id- query:
token - 200:
{ "response": { "<id>": true } }
- query:
Формат ошибки:
{"response":{"<id>":true}}Файлы миграций: ./migrations/*.sql
Применение на старте управляется AUTO_MIGRATE. Для ручного применения можно использовать goose.
Статика доступна по:
/docs/— каталог со swagger.json/swagger/— Swagger UI
Файл: .github/workflows/ci.yml
- checkout, setup-go 1.22.x, cache
go build ./...,go vet ./...,go test ./...
cmd/
main.go
internal/
cache/
config/
handler/
middleware/
model/
repository/
interface.go
user.go
document.go
service/
interface.go
auth.go
docs.go
session.go
migrations/
docs/
uploads/