Skip to content

Commit

Permalink
feat(api): Add endpoints for disable and activate all users (#1442)
Browse files Browse the repository at this point in the history
  • Loading branch information
ImMohammad20000 authored Nov 20, 2024
1 parent 33f4ef9 commit 496d29b
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
41 changes: 41 additions & 0 deletions app/db/crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,47 @@ def reset_all_users_data_usage(db: Session, admin: Optional[Admin] = None):
db.commit()


def disable_all_active_users(db: Session, admin: Optional[Admin] = None):
"""
Disable all active users or users under a specific admin.
Args:
db (Session): Database session.
admin (Optional[Admin]): Admin to filter users by, if any.
"""
query = db.query(User).filter(User.status.in_((UserStatus.active, UserStatus.on_hold)))
if admin:
query = query.filter(User.admin == admin)

query.update({User.status: UserStatus.disabled}, synchronize_session=False)

db.commit()


def activate_all_disabled_users(db: Session, admin: Optional[Admin] = None):
"""
Activate all disabled users or users under a specific admin.
Args:
db (Session): Database session.
admin (Optional[Admin]): Admin to filter users by, if any.
"""
query_for_active_users = db.query(User).filter(User.status == UserStatus.disabled)
query_for_on_hold_users = db.query(User).filter(
and_(
User.status == UserStatus.disabled, User.expire.is_(
None), User.on_hold_expire_duration.isnot(None), User.online_at.is_(None)
))
if admin:
query_for_active_users = query_for_active_users.filter(User.admin == admin)
query_for_on_hold_users = query_for_on_hold_users.filter(User.admin == admin)

query_for_on_hold_users.update({User.status: UserStatus.on_hold}, synchronize_session=False)
query_for_active_users.update({User.status: UserStatus.active}, synchronize_session=False)

db.commit()


def autodelete_expired_users(db: Session,
include_limited_users: bool = False) -> List[User]:
"""
Expand Down
31 changes: 31 additions & 0 deletions app/routers/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.exc import IntegrityError

from app import xray
from app.db import Session, crud, get_db
from app.dependencies import get_admin_by_username, validate_admin
from app.models.admin import Admin, AdminCreate, AdminModify, Token
Expand Down Expand Up @@ -133,6 +134,36 @@ def get_admins(
return crud.get_admins(db, offset, limit, username)


@router.post("/admin/{username}/users/disable", responses={403: responses._403, 404: responses._404})
def disable_all_active_users(
dbadmin: Admin = Depends(get_admin_by_username),
db: Session = Depends(get_db), admin: Admin = Depends(Admin.check_sudo_admin)
):
"""Disable all active users under a specific admin"""
crud.disable_all_active_users(db=db, admin=dbadmin)
startup_config = xray.config.include_db_users()
xray.core.restart(startup_config)
for node_id, node in list(xray.nodes.items()):
if node.connected:
xray.operations.restart_node(node_id, startup_config)
return {"detail": "Users successfully disabled"}


@router.post("/admin/{username}/users/activate", responses={403: responses._403, 404: responses._404})
def activate_all_disabled_users(
dbadmin: Admin = Depends(get_admin_by_username),
db: Session = Depends(get_db), admin: Admin = Depends(Admin.check_sudo_admin)
):
"""Activate all disabled users under a specific admin"""
crud.activate_all_disabled_users(db=db, admin=dbadmin)
startup_config = xray.config.include_db_users()
xray.core.restart(startup_config)
for node_id, node in list(xray.nodes.items()):
if node.connected:
xray.operations.restart_node(node_id, startup_config)
return {"detail": "Users successfully activated"}


@router.post(
"/admin/usage/reset/{username}",
response_model=Admin,
Expand Down

0 comments on commit 496d29b

Please sign in to comment.