diff --git a/app/api/routers/users.py b/app/api/routers/users.py index 1b12496..1325f3e 100644 --- a/app/api/routers/users.py +++ b/app/api/routers/users.py @@ -30,6 +30,7 @@ def _user_response(user: models.User) -> dict: "role_id": user.role_id, "role_name": user.role_name, "agent_id": user.agent.agent_id if user.agent else None, + "discord_user_id": user.discord_user_id, "created_at": user.created_at, } return data @@ -114,6 +115,7 @@ def create_user( username=user.username, email=user.email, full_name=user.full_name, + discord_user_id=user.discord_user_id, hashed_password=hashed_password, is_admin=False, is_active=True, @@ -202,6 +204,9 @@ def update_user( raise HTTPException(status_code=400, detail="You cannot deactivate your own account") user.is_active = payload.is_active + if payload.discord_user_id is not None: + user.discord_user_id = payload.discord_user_id or None + db.commit() db.refresh(user) return _user_response(user) diff --git a/app/main.py b/app/main.py index 09a45de..e8a34eb 100644 --- a/app/main.py +++ b/app/main.py @@ -271,6 +271,9 @@ def _migrate_schema(): db.execute(text("ALTER TABLE users ADD COLUMN role_id INTEGER NULL")) _ensure_fk(db, "users", "role_id", "roles", "id", "fk_users_role_id") + if _has_table(db, "users") and not _has_column(db, "users", "discord_user_id"): + db.execute(text("ALTER TABLE users ADD COLUMN discord_user_id VARCHAR(32) NULL")) + # --- monitored_servers.api_key for heartbeat v2 --- if _has_table(db, "monitored_servers") and not _has_column(db, "monitored_servers", "api_key"): db.execute(text("ALTER TABLE monitored_servers ADD COLUMN api_key VARCHAR(64) NULL")) diff --git a/app/models/models.py b/app/models/models.py index b790154..8e05ca1 100644 --- a/app/models/models.py +++ b/app/models/models.py @@ -72,6 +72,7 @@ class User(Base): email = Column(String(100), unique=True, nullable=False) hashed_password = Column(String(255), nullable=True) full_name = Column(String(100), nullable=True) + discord_user_id = Column(String(32), nullable=True) is_active = Column(Boolean, default=True) is_admin = Column(Boolean, default=False) role_id = Column(Integer, ForeignKey("roles.id"), nullable=True) diff --git a/app/schemas/schemas.py b/app/schemas/schemas.py index ef8e8e1..cec1e59 100644 --- a/app/schemas/schemas.py +++ b/app/schemas/schemas.py @@ -171,6 +171,7 @@ class UserBase(BaseModel): class UserCreate(UserBase): password: Optional[str] = None role_id: Optional[int] = None + discord_user_id: Optional[str] = None # Agent binding (both must be provided or both omitted) agent_id: Optional[str] = None claw_identifier: Optional[str] = None @@ -182,6 +183,7 @@ class UserUpdate(BaseModel): password: Optional[str] = None role_id: Optional[int] = None is_active: Optional[bool] = None + discord_user_id: Optional[str] = None class UserResponse(UserBase): @@ -191,6 +193,7 @@ class UserResponse(UserBase): role_id: Optional[int] = None role_name: Optional[str] = None agent_id: Optional[str] = None + discord_user_id: Optional[str] = None created_at: datetime class Config: