Files
roa2web-service-auto/.claude/rules/backend-patterns.md
Marius Mutu 9008876b16 chore: Remove obsolete microservices directories and update all references
- Delete data-entry-app/ (1.6GB), reports-app/ (447MB), .auto-build-data/
- Saved ~1.4GB disk space (64% reduction: 2.2GB → 845MB)

Updated references across 38 files:
- .claude/rules/ paths: backend/modules/, src/modules/
- .claude/commands/validate.md: all validation paths
- docs/ (13 files): data-entry, telegram, README, CLAUDE.md
- scripts/ (3 files): backup-secrets, restore-secrets, test-docker
- security/ (2 files): git_cleanup, SECURITY_PROCEDURES
- deployment/ & shared/: updated all stale comments

All paths now reflect ultrathin monolith architecture:
- Backend: backend/modules/{reports,data_entry,telegram}/
- Frontend: src/modules/{reports,data-entry}/
- Shared: shared/{auth,database,routes}/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-30 12:08:20 +02:00

45 lines
1.2 KiB
Markdown

---
paths: backend/modules/**/*.py
---
# Backend Patterns
## Router Factory Pattern
Use shared router factories instead of custom implementations:
```python
from shared.routes.companies import create_companies_router
from shared.routes.calendar import create_calendar_router
companies_router = create_companies_router(oracle_pool, cache_decorator=cached)
app.include_router(companies_router, prefix="/api/companies")
```
## Database Queries
- All queries use parameterized Oracle queries (no SQL injection)
- Schema lookup: `SELECT SCHEMA FROM CONTAFIN_ORACLE.V_NOM_FIRME`
- Company access: Join V_NOM_FIRME with VDEF_UTIL_FIRME
## Caching (Reports Module)
- Use `@cached` decorator from `app/cache/decorators`
- Place logic in services, not routers
- Cache schema lookups (24h TTL)
- Cache user data (10-30 min TTL)
## Error Handling
```python
try:
# Business logic
except HTTPException:
raise # Re-raise HTTP exceptions
except Exception as e:
logger.error(...)
raise HTTPException(500, "Internal error")
```
## Oracle Pool Pattern
```python
async with oracle_pool.get_connection() as connection:
with connection.cursor() as cursor:
cursor.execute(query, params)
```