Luca Sacchi Ricciardi
2fdd9d16fd
feat(security): T12 implement AES-256 encryption service
...
- Add EncryptionService with AES-256-GCM via cryptography.fernet
- Implement PBKDF2HMAC key derivation with SHA256 (100k iterations)
- Deterministic salt derived from master_key for consistency
- Methods: encrypt(), decrypt() with proper error handling
- 12 comprehensive tests with 100% coverage
- Handle InvalidToken, TypeError edge cases
2026-04-07 12:03:45 +02:00
Luca Sacchi Ricciardi
66074a430d
docs(progress): update progress after Database & Models phase completion
...
- T06-T11: 6/6 tasks completed (100% of Database & Models phase)
- Overall progress: 15% (11/74 tasks)
- All tests passing: 73 tests, 100% coverage
- Alembic migrations functional (upgrade/downgrade verified)
2026-04-07 11:16:07 +02:00
Luca Sacchi Ricciardi
abe9fc166b
feat(migrations): T11 setup Alembic and initial schema migration
...
- Initialize Alembic with alembic init alembic
- Configure alembic.ini to use DATABASE_URL from environment
- Configure alembic/env.py to import Base and models metadata
- Generate initial migration: c92fc544a483_initial_schema
- Migration creates all 4 tables: users, api_keys, api_tokens, usage_stats
- Migration includes all indexes, constraints, and foreign keys
- Test upgrade/downgrade cycle works correctly
Alembic commands:
- alembic upgrade head
- alembic downgrade -1
- alembic revision --autogenerate -m 'message'
Tests: 13 migration tests pass
2026-04-07 11:14:45 +02:00
Luca Sacchi Ricciardi
ea198e8b0d
feat(models): T07-T10 create SQLAlchemy models for User, ApiKey, UsageStats, ApiToken
...
- Add User model with email unique constraint and relationships
- Add ApiKey model with encrypted key storage and user relationship
- Add UsageStats model with unique constraint (api_key_id, date, model)
- Add ApiToken model with token_hash indexing
- Configure all cascade delete relationships
- Add 49 comprehensive tests with 95% coverage
Models:
- User: id, email, password_hash, created_at, updated_at, is_active
- ApiKey: id, user_id, name, key_encrypted, is_active, created_at, last_used_at
- UsageStats: id, api_key_id, date, model, requests_count, tokens_input, tokens_output, cost
- ApiToken: id, user_id, token_hash, name, created_at, last_used_at, is_active
Tests: 49 passed, coverage 95%
2026-04-07 11:09:12 +02:00
Luca Sacchi Ricciardi
60d9228d91
feat(db): T06 create database connection and session management
...
- Add database.py with SQLAlchemy engine and session
- Implement get_db() for FastAPI dependency injection
- Implement init_db() for table creation
- Use SQLAlchemy 2.0 declarative_base() syntax
- Add comprehensive tests with 100% coverage
Tests: 11 passed, 100% coverage
2026-04-07 10:53:13 +02:00
Luca Sacchi Ricciardi
28fde3627e
feat(setup): T05 configure pytest with coverage
...
- Create pytest.ini with:
- Test discovery configuration (testpaths, python_files)
- Asyncio mode settings
- Coverage configuration (>=90% requirement)
- Custom markers (unit, integration, e2e, slow)
- Update conftest.py with:
- pytest_asyncio plugin
- Shared fixtures (project_root, src_path, temp_dir, mock_env_vars)
- Path configuration for imports
- Add test_pytest_config.py with 12 unit tests
- All tests passing (12/12)
Refs: T05
Completes setup phase T01-T05
2026-04-07 09:55:12 +02:00
Luca Sacchi Ricciardi
aece120017
feat(setup): T04 setup configuration files
...
- Create config.py with Pydantic Settings (SettingsConfigDict v2)
- Add all required configuration fields with defaults
- Create .env.example template with all environment variables
- Implement get_settings() with @lru_cache for performance
- Add test_configuration.py with 13 unit tests
- All tests passing (13/13)
Refs: T04
2026-04-07 09:52:33 +02:00
Luca Sacchi Ricciardi
715536033b
feat(setup): T03 create requirements.txt with dependencies
...
- Add requirements.txt with all core dependencies:
- FastAPI 0.104.1, uvicorn 0.24.0
- SQLAlchemy 2.0.23, Alembic 1.12.1
- Pydantic 2.5.0, pydantic-settings 2.1.0
- python-jose 3.3.0, passlib 1.7.4, cryptography 41.0.7
- httpx 0.25.2, pytest 7.4.3, pytest-asyncio 0.21.1, pytest-cov 4.1.0
- Add test_requirements.py with 15 unit tests
- All tests passing (15/15)
Refs: T03
2026-04-07 09:48:15 +02:00
Luca Sacchi Ricciardi
3f0f77cc23
feat(setup): T02 initialize virtual environment and gitignore
...
- Create comprehensive .gitignore with Python, venv, DB exclusions
- Add test_virtual_env_setup.py with 6 unit tests
- Verify Python 3.13.5 compatibility (>= 3.11 required)
- All tests passing (6/6)
Refs: T02
2026-04-07 09:46:21 +02:00
Luca Sacchi Ricciardi
75f40acb17
feat(setup): T01 create project directory structure
...
- Create src/openrouter_monitor/ package structure
- Create models/, routers/, services/, utils/ subpackages
- Create tests/unit/ and tests/integration/ structure
- Create alembic/, docs/, scripts/ directories
- Add test_project_structure.py with 13 unit tests
- All tests passing (13/13)
Refs: T01
2026-04-07 09:44:41 +02:00