apac-ops-bot/backend/app/models/user.py
SamoilenkoVadym a8151fbe66 Add comprehensive backend test suite and Phase 1 foundation
Backend Tests:
- Add pytest configuration with async support (conftest.py)
- Add model tests: User, Conversation, Message, TokenUsage, Session, UserMemory
- Add configuration tests: Settings validation and environment variables
- Add API tests: Health endpoint and future endpoint stubs
- Add database tests: Connection, transactions, query execution

Phase 1 Foundation:
- FastAPI application structure with main.py
- SQLAlchemy async models for all entities
- Alembic migrations setup
- Configuration management via Pydantic Settings
- Logging system (English only)
- Docker multi-stage builds for backend
- Docker Compose orchestration (PostgreSQL, Redis, backend)
- Frontend React + TypeScript structure
- Dark & Gold theme CSS implementation
- Environment configuration examples

All code and comments in English as per requirements.
Tests cover model relationships, cascade deletes, and constraints.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-27 14:24:59 +00:00

46 lines
1.8 KiB
Python

"""
User model for storing user information from Azure AD
"""
from sqlalchemy import Column, String, Boolean, DateTime, JSON
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import uuid
from app.database import Base
class User(Base):
"""
User model representing application users authenticated via Azure AD
"""
__tablename__ = "users"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
azure_ad_id = Column(String(255), unique=True, nullable=False, index=True)
email = Column(String(255), unique=True, nullable=False, index=True)
display_name = Column(String(255))
given_name = Column(String(100))
surname = Column(String(100))
role = Column(String(50), default="user", nullable=False) # user, admin, superadmin
is_active = Column(Boolean, default=True, nullable=False)
# Timestamps
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
last_login_at = Column(DateTime(timezone=True))
# JSON fields for flexible data storage
preferences = Column(JSON, default=dict, nullable=False) # UI preferences
metadata = Column(JSON, default=dict, nullable=False) # Additional metadata
# Relationships
conversations = relationship("Conversation", back_populates="user", cascade="all, delete-orphan")
sessions = relationship("Session", back_populates="user", cascade="all, delete-orphan")
token_usage = relationship("TokenUsage", back_populates="user")
memories = relationship("UserMemory", back_populates="user", cascade="all, delete-orphan")
def __repr__(self):
return f"<User {self.email}>"