Coverage for src / local_deep_research / database / models / auth.py: 100%
18 statements
« prev ^ index » next coverage.py v7.12.0, created at 2026-01-11 00:51 +0000
« prev ^ index » next coverage.py v7.12.0, created at 2026-01-11 00:51 +0000
1"""
2Authentication models for managing users.
3Only stores username and metadata - passwords are never stored.
4Each user gets their own encrypted database file.
5"""
7from datetime import datetime, UTC
8from functools import partial
10from sqlalchemy import Column, Integer, String
11from sqlalchemy_utc import UtcDateTime
13from ...config.paths import get_user_database_filename
14from .base import Base
17class User(Base):
18 """
19 User model - stored in a central auth database.
20 Passwords are NEVER stored - they are used to decrypt individual user databases.
21 """
23 __tablename__ = "users"
25 id = Column(Integer, primary_key=True)
26 username = Column(String(80), unique=True, nullable=False, index=True)
27 created_at = Column(UtcDateTime, default=partial(datetime.now, UTC))
28 last_login = Column(UtcDateTime)
30 # Metadata only - no sensitive data
31 database_version = Column(Integer, default=1)
33 def __repr__(self):
34 return f"<User {self.username}>"
36 @property
37 def database_path(self):
38 """Path to this user's encrypted database file."""
39 return get_user_database_filename(self.username)