apac-ops-bot/backend/app/models/user_memory.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

56 lines
1.8 KiB
Python

"""
UserMemory model for storing long-term user memory across conversations
"""
from sqlalchemy import Column, String, Text, Numeric, DateTime, JSON, ForeignKey, UniqueConstraint
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import uuid
from app.database import Base
class UserMemory(Base):
"""
UserMemory model for storing important user information across conversations
This enables the bot to remember user preferences, frequently asked questions,
and important context from previous interactions.
"""
__tablename__ = "user_memory"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
user_id = Column(
UUID(as_uuid=True),
ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
index=True
)
# Memory key-value pair
memory_key = Column(String(255), nullable=False, index=True) # Category or topic
memory_value = Column(Text, nullable=False)
# Importance score (0.0 to 1.0)
importance_score = Column(Numeric(3, 2), default=0.5, 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_accessed_at = Column(DateTime(timezone=True), server_default=func.now())
# JSON field for additional metadata
metadata = Column(JSON, default=dict, nullable=False)
# Relationships
user = relationship("User", back_populates="memories")
# Constraints
__table_args__ = (
UniqueConstraint("user_id", "memory_key", name="uq_user_memory_key"),
)
def __repr__(self):
return f"<UserMemory {self.id} - {self.memory_key}>"