5.2 KiB
5.2 KiB
YalArba (ЯлАрба) — Tourist Aggregator
Generated: 2026-06-12
Commit: 165d5a5
Branch: main
OVERVIEW
Go REST API backend (chi router + GORM + PostgreSQL) with docker-compose orchestration. SPA frontend via Nginx reverse proxy + Certbot. Goose for DB migrations. JWT auth via HttpOnly cookies.
STRUCTURE
./
├── api/ # Go backend service
│ ├── cmd/main.go # Entry point
│ ├── src/
│ │ ├── configs/ # Server + DB config structs
│ │ ├── initializers/ # Chi routing + GORM DB init
│ │ ├── models/ # GORM models (User, Essence, Contact, Point)
│ │ ├── rt/ # Route handlers grouped by domain
│ │ │ ├── auth/ # Login, Register, JWT middleware
│ │ │ ├── admin/ # Admin-only endpoints
│ │ │ ├── prf/ # Profile (stub)
│ │ │ └── srch/ # Search (stub)
│ │ └── storages/psql/ # Global *gorm.DB var
│ └── Dockerfile
├── migrator/ # Goose migration runner
│ └── migrations/ # Timestamped SQL migrations
├── spa/ # Nginx + static HTML landing + certbot
│ ├── index.html # Landing page (Russian)
│ └── data/nginx/ # Nginx config
├── docker-compose.yaml # services: db, api, migrator, spa, certbot
├── Makefile # build, run, clean, test
└── .env # Environment variables (DO NOT COMMIT)
WHERE TO LOOK
| Task | Location | Notes |
|---|---|---|
| Add API route | api/src/initializers/Routing.go + api/src/rt/ |
Register handler in Routing.go; create handler in rt/ subdir |
| Add DB model | api/src/models/ |
GORM struct with json + gorm tags; UUID PKs |
| Add migration | migrator/migrations/ |
Goose format: timestamp_description.sql |
| Auth logic | api/src/rt/auth/ |
JWT in HttpOnly cookie; claims in request context |
| DB access | api/src/storages/psql/psql.go |
Global PSQL_GORM_DB *gorm.DB |
| Config/env vars | .env → os.Getenv() in code |
Config structs in api/src/configs/ |
CODE MAP
| Symbol | Type | Location | Role |
|---|---|---|---|
main |
func | api/cmd/main.go:16 |
Entry: calls InitChiRouting + InitDBconnection |
InitChiRouting |
func | api/src/initializers/Routing.go:21 |
Sets up chi router, middlewares, all routes |
InitDBconnection |
func | api/src/initializers/PGQL_DB.go:14 |
GORM Postgres connection, sets psql.PSQL_GORM_DB |
PSQL_GORM_DB |
var | api/src/storages/psql/psql.go:5 |
Global DB handle |
Login |
func | api/src/rt/auth/Login.go:21 |
Validates creds, issues JWT cookie |
Register |
func | api/src/rt/auth/Registr.go:54 |
Validates input, hashes password, creates user |
AuthMiddleware |
func | api/src/rt/auth/authMiddleware.go:11 |
JWT cookie validation middleware |
AuthAdminMiddleware |
func | api/src/rt/auth/authAdminMiddlware.go:11 |
JWT + role=admin check |
User |
struct | api/src/models/user.go:5 |
GORM model: id, name, email, password, phone, role |
Claims |
struct | api/src/models/authDataStructs.go:15 |
JWT claims: email, phone, role |
CONVENTIONS
- Naming: Go package names are short abbreviations (auth, prf, srch, admin). File names in PascalCase.
- DB: GORM with UUID PKs (
AutoIncrement:false). Goose for migrations with timestamp prefixes. - Auth: JWT stored in HttpOnly/Secure/SameSite cookie. Role stored in claims. Context key is
"email". - Config: All config via
os.Getenv(), no config files..envloaded by docker-compose. - Logging:
log/slogstructured logging. - Errors:
http.Error()for simple errors. JSON-encodedvalidationErrorstruct for validation. - Password: bcrypt cost 14. Max password length 72 (bcrypt limit).
- Role defaults: Empty role on registration → "user".
ANTI-PATTERNS (THIS PROJECT)
os.Exit(2)on DB failure — kills entire process, no graceful shutdown- Duplicate JWT parsing logic between
authMiddleware.goandauthAdminMiddlware.go authAdminMiddlware.gohas typo in filename ("Middlware")AuthUserMiddleware.goin prf/ is a dead stub (always 401)- Global mutable state (
PSQL_GORM_DB, package-leveljwtKey) - HTTPS enforced on JWT cookies but HTTP port 80 exposed — mismatch in dev
AGENTS.mdin.gitignorebecause it previously contained secrets — credentials belong in.envonly
COMMANDS
make # docker compose up (default)
make build # docker compose build
make run # docker compose up
make clean # docker builder prune
make test # go test ./api/src/auth/... -v
make tc # go test -cover
NOTES
.envcontains real secrets — never commit. The.gitignoreentry forAGENTS.mdwas added because it previously held credentials. Remove that.gitignoreline once this file is clean.ProfileandSearchhandlers are stubs (empty bodies).- Docker services depend on each other: db → api → migrator → spa+certbot.
- Goose migration
GOOSE_DBSTRINGin.envmust match PG credentials.