Phase 2 scaffold: mitra online status & pairing logic
Add mitra online/offline status with heartbeat-based auto-offline, customer-mitra pairing via Valkey pub/sub blast, session management, and control center dashboard with real-time stats. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
28
backend/src/services/dashboard.service.js
Normal file
28
backend/src/services/dashboard.service.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import { getDb } from '../db/client.js'
|
||||
|
||||
const sql = getDb()
|
||||
|
||||
export const getDashboardStats = async () => {
|
||||
const [[{ active_chats }], [{ online_mitras }], [{ pending_requests }]] = await Promise.all([
|
||||
sql`SELECT COUNT(*) AS active_chats FROM chat_sessions WHERE status IN ('active', 'pending_payment')`,
|
||||
sql`SELECT COUNT(*) AS online_mitras FROM mitra_online_status WHERE is_online = true`,
|
||||
sql`SELECT COUNT(*) AS pending_requests FROM chat_sessions WHERE status IN ('searching', 'pending_acceptance')`,
|
||||
])
|
||||
|
||||
const customersPerMitra = await sql`
|
||||
SELECT m.id, m.display_name,
|
||||
(SELECT COUNT(*) FROM chat_sessions cs
|
||||
WHERE cs.mitra_id = m.id AND cs.status IN ('active', 'pending_payment')) AS active_session_count
|
||||
FROM mitras m
|
||||
INNER JOIN mitra_online_status s ON s.mitra_id = m.id
|
||||
WHERE s.is_online = true
|
||||
ORDER BY active_session_count DESC
|
||||
`
|
||||
|
||||
return {
|
||||
active_chats: Number(active_chats),
|
||||
online_mitras: Number(online_mitras),
|
||||
pending_requests: Number(pending_requests),
|
||||
customers_per_mitra: customersPerMitra,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user