T01: core infrastructure + auth + multi-tenant + RLS

- 10 models: tenants, users, user_tenants, roles, sessions, audit_log, deletion_log, notifications, password_reset_tokens, api_tokens
- Session-based auth (Redis + PostgreSQL audit trail)
- Multi-tenant with ORM-level filtering + PostgreSQL RLS (set_config)
- RBAC with roles/permissions + field-level permissions
- CSRF protection via Origin header validation
- Auth rate limiting (Redis counters with TTL)
- CORS with explicit origins (no wildcard)
- Health endpoint (no auth required)
- Notification service + audit log middleware
- 29 tests, 26 ACs, all passing
- Coverage: 62% (infrastructure modules pending coverage in later tasks)
This commit is contained in:
leocrm-bot
2026-06-29 00:10:10 +02:00
parent 6520e88d53
commit 3ab4925783
137 changed files with 3866 additions and 10195 deletions
+24 -18
View File
@@ -1,30 +1,36 @@
"""Common Pydantic schemas: pagination."""
"""Common schemas for pagination, errors, etc."""
from __future__ import annotations
from typing import Generic, TypeVar
from pydantic import BaseModel, ConfigDict, Field
T = TypeVar("T")
from pydantic import BaseModel
class PaginationParams(BaseModel):
"""Standard pagination query params."""
skip: int = Field(default=0, ge=0)
limit: int = Field(default=20, ge=1, le=100)
class ErrorResponse(BaseModel):
detail: str
code: str | None = None
fields: dict[str, str] | None = None
class PaginatedResponse(BaseModel, Generic[T]):
"""Generic paginated response."""
class HealthResponse(BaseModel):
status: str
version: str
model_config = ConfigDict(from_attributes=True)
items: list[T] # type: ignore[valid-type]
class NotificationResponse(BaseModel):
id: str
type: str
title: str
body: str | None = None
read_at: str | None = None
created_at: str | None = None
class NotificationListResponse(BaseModel):
items: list[NotificationResponse]
total: int
skip: int
limit: int
page: int
page_size: int
__all__ = ["PaginatedResponse", "PaginationParams"]
class UnreadCountResponse(BaseModel):
count: int