--- name: project-map description: Complete module inventory of the Auth API project with file paths, dependencies, and architecture overview. Load this first in any new session. license: MIT --- ## What This Project Is A **multi-tenant authentication and authorization REST API** in Go 1.23+, using Gin, PostgreSQL (GORM), and Redis. It provides user registration, login, OAuth2 social login, TOTP/email/SMS/backup-email 2FA, WebAuthn/passkeys, magic links, RBAC, session management, OIDC provider, webhooks, brute-force protection, GeoIP IP rules, health/metrics, and a full admin interface (JSON API + HTMX GUI). ## Architecture **Pattern:** Repository -> Service -> Handler (Clean Architecture) **Key design decisions:** - Concrete struct dependency injection (no interface-based DI containers) - Function-type callbacks between modules to avoid import cycles (e.g., `RoleLookupFunc`, `AssignDefaultRoleFunc`) - Multi-tenancy: **Tenant -> Application -> User** hierarchy - Every user is scoped to an `AppID` (UUID), with default app `00000000-0000-0000-0000-000000000001` ## Entry Point - `cmd/api/main.go` -- Dependency injection, route setup, server startup ## Domain Modules (internal/) ### internal/admin/ (11 files) Tenant/app CRUD, OAuth provider configuration, email management, API key management, admin account authentication, 2FA for admin accounts, system settings (env -> DB -> default resolution), dashboard stats, HTMX GUI handler. | File | Purpose | |------|---------| | `gui_handler.go` | HTMX admin GUI (4976 lines, largest file) | | `handler.go` | Admin JSON REST API (1146 lines) | | `repository.go` | Data access for tenants, apps, OAuth, users, API keys, logs (952 lines) | | `account_service.go` | Admin auth, sessions, 2FA, CSRF, password ops | | `account_repository.go` | AdminAccount GORM queries | | `dashboard_service.go` | Dashboard stats aggregation (PostgreSQL + Redis) | | `settings_service.go` | System settings with 3-tier resolution (env > DB > default) | | `settings_repository.go` | SystemSetting GORM queries with upsert | | `apikey_util.go` | API key generation (SHA-256 hash, prefix/suffix) | | `apikey_util_test.go` | Tests for API key utilities | | `account_service_test.go` | Tests for admin account service | ### internal/user/ (5 files) Registration, login (with self-healing role assignment), password reset, magic link auth, email change with verification, profile management. | File | Purpose | |------|---------| | `handler.go` | User HTTP handlers | | `service.go` | User business logic | | `repository.go` | User GORM queries | | `handler_test.go` | Handler tests | | `service_test.go` | Service tests | ### internal/social/ (4 files) Google, Facebook, GitHub OAuth2 flows. Supports account linking and direct social login/registration. | File | Purpose | |------|---------| | `handler.go` | OAuth2 HTTP handlers (login, callback, link) | | `service.go` | OAuth2 business logic | | `repository.go` | SocialAccount GORM queries | | `oauth_state.go` | OAuth state parameter encoding (appID, provider, action, HMAC) | ### internal/twofa/ (3 files) TOTP (authenticator apps), email-based 2FA codes, SMS 2FA (Twilio), backup email 2FA, recovery codes, trusted devices. | File | Purpose | |------|---------| | `handler.go` | 2FA HTTP handlers (TOTP, email, SMS, backup email, trusted devices, phone management) | | `service.go` | 2FA business logic (TOTP + email + SMS + backup email codes, trusted device validation) | | `trusted_device_repository.go` | TrustedDevice GORM queries | ### internal/webauthn/ (5 files) Full WebAuthn support for users and admin accounts. | File | Purpose | |------|---------| | `handler.go` | Passkey HTTP handlers | | `service.go` | WebAuthn ceremony logic | | `repository.go` | WebAuthnCredential GORM queries | | `config.go` | Relying party configuration | | `user_adapter.go` | Adapts User/AdminAccount to WebAuthn user interface | ### internal/session/ (2 files) Redis-backed sessions with refresh token rotation, multi-device tracking. | File | Purpose | |------|---------| | `service.go` | Session lifecycle (create, refresh, revoke, list) | | `handler.go` | Session API endpoints | ### internal/rbac/ (3 files) Roles per-application, permissions as `resource:action`, Redis-cached authorization. | File | Purpose | |------|---------| | `service.go` | RBAC logic with Redis caching | | `repository.go` | Role/Permission/UserRole GORM queries | | `handler.go` | RBAC API endpoints | ### internal/email/ (8 files) Multi-layered email system: Service -> VariableResolver + Renderer + Sender. | File | Purpose | |------|---------| | `service.go` | Orchestrator (send pipeline, template/SMTP resolution) | | `resolver.go` | Variable resolution pipeline (4 layers) | | `renderer.go` | Three template engines (go_template, placeholder, raw_html) | | `sender.go` | SMTP sending via gopkg.in/mail.v2 | | `types.go` | Constants, structs, variable registry | | `defaults.go` | 7 hardcoded default email templates | | `repository.go` | Email types, templates, server configs GORM queries | | `email_integration_test.go` | Integration tests | ### internal/log/ (6 files) Async channel-based logging with anomaly detection. | File | Purpose | |------|---------| | `service.go` | Async log service (buffered channel, background worker) | | `anomaly.go` | Anomaly detection (new IP, new UA, unusual time) | | `cleanup.go` | Scheduled log retention/cleanup | | `query_service.go` | Filtered, paginated log querying | | `handler.go` | Log API endpoints | | `repository.go` | ActivityLog GORM queries | ### internal/middleware/ (13 files) | File | Purpose | |------|---------| | `auth.go` | JWT auth + token blacklist checking | | `admin_auth.go` | Admin API Key auth (static env + DB-backed) | | `app_api_key.go` | Per-app API Key auth | | `gui_auth.go` | Admin GUI cookie session auth | | `csrf.go` | CSRF protection for GUI | | `app_id.go` | X-App-ID header extraction | | `app_route_guard.go` | Cross-app URL parameter validation | | `rate_limit.go` | Redis + in-memory fallback rate limiting | | `cors.go` | CORS configuration | | `security_headers.go` | CSP, HSTS, X-Frame-Options | | `auth_test.go` | Auth middleware tests | | `rate_limit_test.go` | Rate limit tests | | `security_headers_test.go` | Security header tests | ### Other internal packages | Package | File | Purpose | |---------|------|---------| | `internal/oidc/` | 7 files | Full OIDC provider: discovery, authorize, token, userinfo, introspect, revoke, end_session, JWKS, RS256 id_token signing | | `internal/webhook/` | 3 files | Webhook endpoint registry, async delivery dispatcher, retry queue, HMAC-SHA256 signing | | `internal/bruteforce/` | 2 files | Account lockout, progressive login delays, CAPTCHA trigger threshold | | `internal/geoip/` | 3 files | MaxMind GeoLite2 service, IP rule repository, IP rule evaluator (CIDR/country per app) | | `internal/health/` | 1 file | `GET /health` liveness, `GET /metrics` Prometheus, `PrometheusMiddleware`, `MetricsSummary` | | `internal/sms/` | 3 files | SMS sender interface, Twilio implementation, config loader | | `internal/database/` | `db.go` | PostgreSQL connection + GORM auto-migration | | `internal/redis/` | `redis.go` | Redis connection + token blacklisting + session helpers | | `internal/config/` | `logging.go` | Logging configuration | | `internal/util/` | `client_info.go`, `frontend_url.go` | Client info extraction, frontend URL resolution | ## Shared Packages (pkg/) | Package | Files | Purpose | |---------|-------|---------| | `pkg/models/` | 17+ model files | GORM models: User, Tenant, Application, Role, Permission, UserRole, AdminAccount, SocialAccount, WebAuthnCredential, ActivityLog, ApiKey, ApiKeyUsage, EmailType, EmailTemplate, EmailServerConfig, OAuthProviderConfig, SystemSetting, SchemaMigration, OIDCClient, OIDCAuthCode, WebhookEndpoint, WebhookDelivery, IPRule, TrustedDevice | | `pkg/dto/` | 7+ files | Request/response DTOs: auth, admin, session, RBAC, WebAuthn, email, activity_log, oidc, webhook, geoip | | `pkg/errors/` | `errors.go`, `errors_test.go` | AppError type with 6 HTTP status code mappings | | `pkg/jwt/` | `jwt.go`, `jwt_test.go` | JWT Claims (UserID, AppID, SessionID, TokenType, Roles), generate/parse | ## Web Package (web/) | File | Purpose | |------|---------| | `renderer.go` | HTML template renderer (embedded templates, funcMap) | | `context_keys.go` | Shared context keys, SessionValidator/ApiKeyValidator interfaces, cookie helpers | | `static/embed.go` | Embedded static files (CSS/JS) | ## Dependencies Between Modules ``` main.go wires everything: user.Service depends on: user.Repository, email.Service, rbac.Service (via callbacks), session.Service, webhook.Service, sms.Sender social.Service depends on: user.Repository, social.Repository, rbac.Service (via callbacks), session.Service, webhook.Service twofa.Service depends on: user.Repository, email.Service, sms.Sender, trusted_device.Repository twofa.Handler depends on: rbac.Service (via callbacks), session.Service, trusted_device.Repository webauthn.Service depends on: webauthn.Repository, user.Repository webauthn.Handler depends on: rbac.Service (via callbacks), session.Service, webhook.Service oidc.Service depends on: oidc.Repository, rbac.Service (GetUserRoleNames) webhook.Service depends on: webhook.Repository bruteforce.Service depends on: database.DB (Redis-less, PostgreSQL counters) geoip.IPRuleEvaluator depends on: geoip.IPRuleRepository, geoip.Service health.Handler depends on: database.DB, redis.Rdb, SMTP address rbac.Service depends on: rbac.Repository session.Service depends on: Redis email.Service depends on: email.Repository, VariableResolver, Renderer, Sender log.Service depends on: log.Repository, AnomalyDetector admin.Handler depends on: admin.Repository, email.Service, trusted_device.Repository admin.GUIHandler depends on: AccountService, DashboardService, admin.Repository, SettingsService, email.Service, rbac.Service, webauthn.Service, webhook.Service, oidc.Service, health.Handler, trusted_device.Repository ``` ## When To Use This Skill Load this skill at the start of any session to understand the project structure. For domain-specific deep dives, also load the relevant skill: `route-map`, `data-model`, `auth-flows`, `email-system`, or `admin-gui`.