This issue is already resolved in main. config.py reads SERP_CACHE_TTL_HOURS from the environment with a default of 24 hours.
This issue is already resolved in main. tests/test_auth.py (303 lines) has 17 comprehensive tests covering: registration (first user admin, subsequent user, duplicate email), login (valid/invalid…
This issue is already resolved in main. No print() calls remain in analyzer.py, serp_api.py, or llm.py. All modules use logging.getLogger(__name__) for structured logging.
This issue is already resolved in main. config.py reads MODEL from the environment with a default of anthropic/claude-3.5-sonnet. llm.py uses config.model and the API also supports…
This issue is already resolved in main. api.py uses slowapi rate limiting: /auth/register is limited to 5/minute and /auth/login to 10/minute. The Limiter is configured with `get_remote_a…
This issue is already resolved in main. auth.py uses a module-level singleton _db_client initialized via init_db_client() at startup and accessed via get_db_client(). The DatabaseClient…
This issue is already resolved in main. Job state is persisted in PostgreSQL via database.py methods: create_job(), update_job(), list_jobs(), and mark_stale_jobs_failed(). The in-memory…
This issue is already resolved in main. auth.py implements check_jwt_secret() which raises RuntimeError when JWT_SECRET equals the default value and APP_ENV is not development. The…
This issue is already resolved in main. config.py reads CORS_ORIGINS from the environment (comma-separated), and api.py passes config.cors_origins to the CORS middleware. Defaults to…
This issue is already resolved in main. docker-compose.yml uses ${POSTGRES_USER}, ${POSTGRES_PASSWORD}, and ${POSTGRES_DB} environment variable substitution throughout. No hardcoded…