Skip to content

Commit

Permalink
generate KPI
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanseifert committed Jul 9, 2024
1 parent cfba0d5 commit 1897228
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { handleTalkRoomMessages } from './socket/talkRoomMessages'
import { handleTalkRoomQAEntries } from './socket/talkRoomQAEntries'
import { handleAdminLoginCodeManagement } from './socket/admin/loginCodeManagement'
import { handleTalkRoomModeratorNotes } from './socket/talkRoomModeratorNotes'
import { handleAdminKPI } from './socket/admin/kpi'

// read env configuration
config()
Expand Down Expand Up @@ -53,6 +54,7 @@ io.on('connection', async (socket) => {
await handleAdminUserManagement(socket)
await handleAdminTalkRatings(socket)
await handleAdminStatistics(socket)
await handleAdminKPI(socket)
})

async function run() {
Expand Down
99 changes: 99 additions & 0 deletions src/socket/admin/kpi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { Socket } from 'socket.io'
import { ClientToServerEvents, KPIDataset, KPIDatasetDay, ServerToClientEvents } from '../socket.types'
import { InterServerEvents, SocketData } from '../socket.server.types'
import log from '../../util/log'
import { UserModel } from '../../repository/mongodb.schema'

export async function handleAdminKPI(socket : Socket<ClientToServerEvents,ServerToClientEvents,InterServerEvents,SocketData>) {
const { admin } = socket.data

// admin-only operations
if (!admin) {
return
}

socket.on('adminGetKPI', async (dayDates: Date[]) => {
log.debug('Admin: get KPI')

await userRegistrationKPI(dayDates)
await talkRatingKPI()
await talkMessagesKPI()
await talkQAEntriesKPI()
})

async function userRegistrationKPI(dayDates: Date[]) {
const dataset : KPIDataset = {
title: 'User Registrations',
xAxisTitle: 'Hour of day',
yAxisTitle: '# Registrations',
days: []
}

const users = await UserModel.find().sort({created:1}).exec()
dayDates.forEach((dayDate, index) => {
const date = new Date(dayDate)
console.log('date', date, 'type', typeof date)
const day : KPIDatasetDay = { day: index+1, values: {} }
dataset.days.push(day)
for (let hour = 9; hour <= 18; hour++) {
const upToDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), hour, 0, 0)
console.log('upToDate', upToDate)
const count = users.filter(user => user.created <= upToDate).length
day.values[hour] = count
}
})

socket.emit('adminKPIDataset', dataset)
}

async function talkRatingKPI() {
const datasetNumber : KPIDataset = {
title: 'Talk Ratings',
xAxisTitle: 'Talk Index',
yAxisTitle: '# Talk Ratings',
days: []
}

// TODO: calc KPI

socket.emit('adminKPIDataset', datasetNumber)

const datasetAverage : KPIDataset = {
title: 'Average Rating',
xAxisTitle: 'Talk Index',
yAxisTitle: 'Average Rating',
days: []
}

// TODO: calc KPI

socket.emit('adminKPIDataset', datasetAverage)
}

async function talkMessagesKPI() {
const dataset : KPIDataset = {
title: 'Talk Messages',
xAxisTitle: 'Talk Index',
yAxisTitle: '# Messages',
days: []
}

// TODO: calc KPI

socket.emit('adminKPIDataset', dataset)
}

async function talkQAEntriesKPI() {
const dataset : KPIDataset = {
title: 'Talk Q&A Entries',
xAxisTitle: 'Talk Index',
yAxisTitle: '# Q&A Entries',
days: []
}

// TODO: calc KPI

socket.emit('adminKPIDataset', dataset)
}

}
14 changes: 14 additions & 0 deletions src/socket/socket.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export interface ServerToClientEvents {
adminUsers: (users: User[]) => void
adminTalkRatings: (ratings: AverageTalkRating[]) => void
adminStatistics: (statistics: Statistics) => void
adminKPIDataset: (kpiDataset: KPIDataset) => void
userBlocked: (userid: string) => void
}

Expand All @@ -35,6 +36,7 @@ export interface ClientToServerEvents {
adminUpdateUser: (user: UserUpdate, callback: (result: OperationResult) => void) => void
adminGetTalkRatings: () => void
adminGetStatistics: () => void
adminGetKPI: (dayDates: Date[]) => void
}

export interface OperationResult {
Expand Down Expand Up @@ -140,3 +142,15 @@ export interface Statistics {
numMessages: number
numQAEntries: number
}

export interface KPIDataset {
title: string
xAxisTitle: string
yAxisTitle: string
days: KPIDatasetDay[]
}

export interface KPIDatasetDay {
day: number
values: { [key: number]: number }
}

0 comments on commit 1897228

Please sign in to comment.