mirror of
https://github.com/System-End/nephthys.git
synced 2026-04-19 19:45:12 +00:00
add stats api
This commit is contained in:
parent
411cdae42e
commit
5ca375d649
2 changed files with 91 additions and 0 deletions
89
nephthys/api/stats.py
Normal file
89
nephthys/api/stats.py
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
from datetime import datetime
|
||||
from datetime import timedelta
|
||||
from datetime import timezone
|
||||
|
||||
from starlette.requests import Request
|
||||
from starlette.responses import JSONResponse
|
||||
|
||||
from nephthys.utils.env import env
|
||||
from prisma.enums import TicketStatus
|
||||
|
||||
|
||||
async def stats(req: Request):
|
||||
tickets = await env.db.ticket.find_many() or []
|
||||
total_open = len([t for t in tickets if t.status == TicketStatus.OPEN])
|
||||
total_in_progress = len(
|
||||
[t for t in tickets if t.status == TicketStatus.IN_PROGRESS]
|
||||
)
|
||||
total_closed = len([t for t in tickets if t.status == TicketStatus.CLOSED])
|
||||
total = len(tickets)
|
||||
|
||||
users_with_closed_tickets = await env.db.user.find_many(
|
||||
include={"closedTickets": {}}, where={"helper": True}
|
||||
)
|
||||
|
||||
# Sort the users by the count of their closed tickets in descending order
|
||||
sorted_users = sorted(
|
||||
users_with_closed_tickets,
|
||||
key=lambda user: len(user.closedTickets or []),
|
||||
reverse=True,
|
||||
)
|
||||
|
||||
total_top_3_users = sorted_users[:3]
|
||||
|
||||
prev_day_tickets = await env.db.ticket.find_many(
|
||||
where={"createdAt": {"gte": datetime.now() - timedelta(days=1)}}
|
||||
)
|
||||
prev_day_total = len(prev_day_tickets)
|
||||
prev_day_open = len([t for t in prev_day_tickets if t.status == TicketStatus.OPEN])
|
||||
prev_day_in_progress = len(
|
||||
[t for t in prev_day_tickets if t.status == TicketStatus.IN_PROGRESS]
|
||||
)
|
||||
prev_day_closed = len(
|
||||
[t for t in prev_day_tickets if t.status == TicketStatus.CLOSED]
|
||||
)
|
||||
prev_day_total = len(prev_day_tickets)
|
||||
|
||||
prev_24_resolvers = [
|
||||
user
|
||||
for user in users_with_closed_tickets
|
||||
if user.closedTickets
|
||||
and any(
|
||||
ticket.closedAt
|
||||
and ticket.closedAt >= datetime.now(timezone.utc) - timedelta(days=1)
|
||||
for ticket in user.closedTickets
|
||||
)
|
||||
]
|
||||
|
||||
prev_day_top_3_users = sorted(
|
||||
prev_24_resolvers, key=lambda user: len(user.closedTickets or []), reverse=True
|
||||
)[:3]
|
||||
|
||||
return JSONResponse(
|
||||
{
|
||||
"total_tickets": total,
|
||||
"total_open": total_open,
|
||||
"total_in_progress": total_in_progress,
|
||||
"total_closed": total_closed,
|
||||
"total_top_3_users_with_closed_tickets": [
|
||||
{
|
||||
"user_id": user.id,
|
||||
"slack_id": user.slackId,
|
||||
"closed_ticket_count": len(user.closedTickets or []),
|
||||
}
|
||||
for user in total_top_3_users
|
||||
],
|
||||
"prev_day_total": prev_day_total,
|
||||
"prev_day_open": prev_day_open,
|
||||
"prev_day_in_progress": prev_day_in_progress,
|
||||
"prev_day_closed": prev_day_closed,
|
||||
"prev_day_top_3_users_with_closed_tickets": [
|
||||
{
|
||||
"user_id": user.id,
|
||||
"slack_id": user.slackId,
|
||||
"closed_ticket_count": len(user.closedTickets or []),
|
||||
}
|
||||
for user in prev_day_top_3_users
|
||||
],
|
||||
}
|
||||
)
|
||||
|
|
@ -6,6 +6,7 @@ from starlette.responses import RedirectResponse
|
|||
from starlette.routing import Route
|
||||
|
||||
from nephthys.__main__ import main
|
||||
from nephthys.api.stats import stats
|
||||
from nephthys.utils.env import env
|
||||
from nephthys.utils.slack import app as slack_app
|
||||
|
||||
|
|
@ -43,6 +44,7 @@ app = Starlette(
|
|||
routes=[
|
||||
Route(path="/", endpoint=root, methods=["GET"]),
|
||||
Route(path="/slack/events", endpoint=endpoint, methods=["POST"]),
|
||||
Route(path="/api/stats", endpoint=stats, methods=["GET"]),
|
||||
Route(path="/health", endpoint=health, methods=["GET"]),
|
||||
],
|
||||
lifespan=main,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue