Skip to content

Commit 4e8c916

Browse files
committed
feat(dashboard): Implemented basic message types, handlers and API endpoints
1 parent 8d1771b commit 4e8c916

6 files changed

Lines changed: 87 additions & 0 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Router } from 'express'
2+
3+
import { createGetKPISnapshotRequestHandler } from '../handlers/request-handlers/get-kpi-snapshot-request-handler'
4+
import { SnapshotService } from '../services/snapshot-service'
5+
6+
export const createDashboardRouter = (snapshotService: SnapshotService): Router => {
7+
const router = Router()
8+
9+
router.get('/snapshot', createGetKPISnapshotRequestHandler(snapshotService))
10+
11+
return router
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Request, Response } from 'express'
2+
3+
import { IController } from '../../@types/controllers'
4+
5+
export class GetHealthController implements IController {
6+
public async handleRequest(_request: Request, response: Response): Promise<void> {
7+
response
8+
.status(200)
9+
.setHeader('content-type', 'application/json; charset=utf-8')
10+
.send({ status: 'ok' })
11+
}
12+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Request, Response } from 'express'
2+
3+
import { DashboardSnapshotResponse } from '../types'
4+
import { IController } from '../../@types/controllers'
5+
import { SnapshotService } from '../services/snapshot-service'
6+
7+
export class GetKPISnapshotController implements IController {
8+
public constructor(private readonly snapshotService: SnapshotService) { }
9+
10+
public async handleRequest(_request: Request, response: Response): Promise<void> {
11+
const payload: DashboardSnapshotResponse = {
12+
data: this.snapshotService.getSnapshot(),
13+
}
14+
15+
response
16+
.status(200)
17+
.setHeader('content-type', 'application/json; charset=utf-8')
18+
.send(payload)
19+
}
20+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { withController } from '../../../handlers/request-handlers/with-controller-request-handler'
2+
3+
import { GetHealthController } from '../../controllers/get-health-controller'
4+
5+
export const getHealthRequestHandler = withController(() => new GetHealthController())
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { withController } from '../../../handlers/request-handlers/with-controller-request-handler'
2+
3+
import { GetKPISnapshotController } from '../../controllers/get-kpi-snapshot-controller'
4+
import { SnapshotService } from '../../services/snapshot-service'
5+
6+
export const createGetKPISnapshotRequestHandler = (snapshotService: SnapshotService) => {
7+
return withController(() => new GetKPISnapshotController(snapshotService))
8+
}

src/dashboard-service/types.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export interface TopTalker {
2+
pubkey: string
3+
count: number
4+
}
5+
6+
export interface KPISnapshot {
7+
sequence: number
8+
generatedAt: string
9+
status: 'placeholder'
10+
metrics: {
11+
eventsByKind: Array<{ kind: string, count: number }>
12+
admittedUsers: number | null
13+
satsPaid: number | null
14+
topTalkers: TopTalker[]
15+
}
16+
}
17+
18+
export interface DashboardSnapshotResponse {
19+
data: KPISnapshot
20+
}
21+
22+
export interface DashboardWebSocketEnvelope<TType extends string, TPayload> {
23+
type: TType
24+
payload: TPayload
25+
}
26+
27+
export type DashboardServerMessage =
28+
| DashboardWebSocketEnvelope<'dashboard.connected', { at: string }>
29+
| DashboardWebSocketEnvelope<'kpi.snapshot', KPISnapshot>
30+
| DashboardWebSocketEnvelope<'kpi.tick', { at: string, sequence: number }>

0 commit comments

Comments
 (0)