"""Live account permissions. Invite access uses the existing users column.""" from .db import _connect FEATURES = ("stats", "requests", "new_requests", "issues", "invites") def permissions(user: dict) -> dict[str, bool]: if user.get("role") == "admin": return dict.fromkeys(FEATURES, True) values = dict.fromkeys(FEATURES, True) values["invites"] = bool(user.get("invite_management_enabled", False)) with _connect() as conn: rows = conn.execute("""SELECT p.feature, p.enabled FROM user_feature_permissions p JOIN users u ON u.id = p.user_id WHERE u.username = ? COLLATE NOCASE""", (user.get("username", ""),)).fetchall() values.update({key: bool(enabled) for key, enabled in rows if key in FEATURES and key != "invites"}) return values def update_permissions(changes: dict[str, bool], username: str | None = None) -> int: if not changes or any(key not in FEATURES or type(value) is not bool for key, value in changes.items()): raise ValueError("Choose valid features with true or false values") with _connect() as conn: conn.execute("BEGIN IMMEDIATE") users = conn.execute("SELECT id FROM users WHERE role != 'admin'" + (" AND username = ? COLLATE NOCASE" if username is not None else ""), (username,) if username is not None else ()).fetchall() for (user_id,) in users: for feature, enabled in changes.items(): if feature == "invites": conn.execute("UPDATE users SET invite_management_enabled = ? WHERE id = ?", (int(enabled), user_id)) else: conn.execute("""INSERT INTO user_feature_permissions(user_id, feature, enabled) VALUES (?, ?, ?) ON CONFLICT(user_id, feature) DO UPDATE SET enabled = excluded.enabled""", (user_id, feature, int(enabled))) return len(users)