feat: add operational sync controls
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import and_, or_, select
|
||||
@@ -7,6 +8,18 @@ from sqlalchemy.orm import Session
|
||||
from app.db.models import Activity, ActivityStatus, SyncRun, SyncRunStatus, SyncUser, utcnow
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class UserDashboardRow:
|
||||
id: int
|
||||
name: str
|
||||
enabled: bool
|
||||
health_state: str
|
||||
action_reason: str | None
|
||||
last_sync_at: datetime | None
|
||||
last_activity_name: str | None
|
||||
last_activity_status: str | None
|
||||
|
||||
|
||||
class UserRepository:
|
||||
def __init__(self, session: Session) -> None:
|
||||
self.session = session
|
||||
@@ -32,6 +45,28 @@ class UserRepository:
|
||||
self.session.commit()
|
||||
return user
|
||||
|
||||
def dashboard_rows(self) -> list[UserDashboardRow]:
|
||||
users = self.list_all()
|
||||
rows = []
|
||||
for user in users:
|
||||
last_run = self.session.scalar(
|
||||
select(SyncRun).where(SyncRun.user_id == user.id).order_by(SyncRun.started_at.desc()).limit(1)
|
||||
)
|
||||
last_activity = self.session.scalar(
|
||||
select(Activity).where(Activity.user_id == user.id).order_by(Activity.created_at.desc()).limit(1)
|
||||
)
|
||||
rows.append(UserDashboardRow(
|
||||
id=user.id,
|
||||
name=user.name,
|
||||
enabled=user.enabled,
|
||||
health_state=user.health_state.value,
|
||||
action_reason=user.action_reason,
|
||||
last_sync_at=last_run.finished_at if last_run else None,
|
||||
last_activity_name=last_activity.activity_name if last_activity else None,
|
||||
last_activity_status=last_activity.status.value if last_activity else None,
|
||||
))
|
||||
return rows
|
||||
|
||||
|
||||
class ActivityRepository:
|
||||
def __init__(self, session: Session) -> None:
|
||||
|
||||
Reference in New Issue
Block a user