diff --git a/app/db/repositories.py b/app/db/repositories.py index 7344573..bb1f79d 100644 --- a/app/db/repositories.py +++ b/app/db/repositories.py @@ -67,26 +67,31 @@ class UserRepository: 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 + return [self._build_dashboard_row(user) for user in self.list_all()] + + def dashboard_row(self, user_id: int) -> UserDashboardRow | None: + user = self.get(user_id) + if user is None: + return None + return self._build_dashboard_row(user) + + def _build_dashboard_row(self, user: SyncUser) -> UserDashboardRow: + 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) + ) + return 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, + ) def dashboard_summary(self, *, since: datetime) -> DashboardSummary: rider_total = self.session.scalar(select(func.count()).select_from(SyncUser)) or 0 diff --git a/tests/db/test_repositories.py b/tests/db/test_repositories.py index 3348c89..2b212b5 100644 --- a/tests/db/test_repositories.py +++ b/tests/db/test_repositories.py @@ -207,3 +207,19 @@ def test_dashboard_summary_success_rate_is_none_without_finished_runs_in_window( summary = user_repository.dashboard_summary(since=datetime.now(timezone.utc) - timedelta(days=7)) assert summary.success_rate_recent is None + + +def test_dashboard_row_returns_row_for_known_user(user_repository) -> None: + user = _make_user(user_repository, "Alex") + + row = user_repository.dashboard_row(user.id) + + assert row is not None + assert row.id == user.id + assert row.name == "Alex" + + +def test_dashboard_row_returns_none_for_unknown_user(user_repository) -> None: + row = user_repository.dashboard_row(999) + + assert row is None