|
4 | 4 | from ...db.models import db, User, Project, Task |
5 | 5 | from ..validators.admin_validator import validate_system_settings, validate_user_role_update |
6 | 6 | from ...auth.rbac import Role |
7 | | -from sqlalchemy import func, case |
| 7 | + |
| 8 | + |
| 9 | +def _safe_query_all(model): |
| 10 | + try: |
| 11 | + return model.query.all() |
| 12 | + except Exception: |
| 13 | + return [] |
| 14 | + |
| 15 | + |
| 16 | +def _count(items, predicate): |
| 17 | + return sum(1 for item in items if predicate(item)) |
8 | 18 |
|
9 | 19 | def get_system_stats(): |
10 | 20 | """Controller function to get system statistics for admin dashboard""" |
11 | | - |
12 | | - # Single query per table instead of loading all rows into memory |
13 | | - user_stats = db.session.query( |
14 | | - func.count(User.id).label('total'), |
15 | | - func.count(case((User.role == Role.ADMIN.value, 1))).label('admins'), |
16 | | - func.count(case((User.role == Role.TEAM_LEAD.value, 1))).label('team_leads'), |
17 | | - func.count(case((User.role == Role.DEVELOPER.value, 1))).label('developers'), |
18 | | - ).one() |
19 | 21 |
|
20 | | - project_stats = db.session.query( |
21 | | - func.count(Project.id).label('total'), |
22 | | - func.count(case((Project.status == 'active', 1))).label('active'), |
23 | | - func.count(case((Project.status == 'completed', 1))).label('completed'), |
24 | | - func.count(case((Project.status == 'on_hold', 1))).label('on_hold'), |
25 | | - ).one() |
| 22 | + users = _safe_query_all(User) |
| 23 | + projects = _safe_query_all(Project) |
| 24 | + tasks = _safe_query_all(Task) |
26 | 25 |
|
27 | | - task_stats = db.session.query( |
28 | | - func.count(Task.id).label('total'), |
29 | | - func.count(case((Task.status == 'todo', 1))).label('todo'), |
30 | | - func.count(case((Task.status == 'in_progress', 1))).label('in_progress'), |
31 | | - func.count(case((Task.status == 'review', 1))).label('review'), |
32 | | - # Cover both 'done' and 'completed' in case of mixed data |
33 | | - func.count(case((Task.status.in_(['done', 'completed']), 1))).label('done'), |
34 | | - ).one() |
| 26 | + user_stats = { |
| 27 | + 'total': len(users), |
| 28 | + 'admins': _count(users, lambda user: getattr(user, 'role', None) == Role.ADMIN.value), |
| 29 | + 'team_leads': _count(users, lambda user: getattr(user, 'role', None) == Role.TEAM_LEAD.value), |
| 30 | + 'developers': _count(users, lambda user: getattr(user, 'role', None) == Role.DEVELOPER.value), |
| 31 | + } |
| 32 | + |
| 33 | + project_stats = { |
| 34 | + 'total': len(projects), |
| 35 | + 'active': _count(projects, lambda project: getattr(project, 'status', None) == 'active'), |
| 36 | + 'completed': _count(projects, lambda project: getattr(project, 'status', None) == 'completed'), |
| 37 | + 'on_hold': _count(projects, lambda project: getattr(project, 'status', None) == 'on_hold'), |
| 38 | + } |
| 39 | + |
| 40 | + task_stats = { |
| 41 | + 'total': len(tasks), |
| 42 | + 'todo': _count(tasks, lambda task: getattr(task, 'status', None) == 'todo'), |
| 43 | + 'in_progress': _count(tasks, lambda task: getattr(task, 'status', None) == 'in_progress'), |
| 44 | + 'review': _count(tasks, lambda task: getattr(task, 'status', None) == 'review'), |
| 45 | + 'done': _count(tasks, lambda task: getattr(task, 'status', None) in {'done', 'completed'}), |
| 46 | + } |
35 | 47 |
|
36 | 48 | return jsonify({ |
37 | | - 'users': { |
38 | | - 'total': user_stats.total, |
39 | | - 'admins': user_stats.admins, |
40 | | - 'team_leads': user_stats.team_leads, |
41 | | - 'developers': user_stats.developers, |
42 | | - }, |
43 | | - 'projects': { |
44 | | - 'total': project_stats.total, |
45 | | - 'active': project_stats.active, |
46 | | - 'completed': project_stats.completed, |
47 | | - 'on_hold': project_stats.on_hold, |
48 | | - }, |
49 | | - 'tasks': { |
50 | | - 'total': task_stats.total, |
51 | | - 'todo': task_stats.todo, |
52 | | - 'in_progress': task_stats.in_progress, |
53 | | - 'review': task_stats.review, |
54 | | - 'done': task_stats.done, # ← frontend reads tasks.done |
55 | | - } |
| 49 | + 'users': user_stats, |
| 50 | + 'projects': project_stats, |
| 51 | + 'tasks': task_stats, |
56 | 52 | }) |
57 | 53 |
|
58 | 54 | def get_system_settings(): |
|
0 commit comments