Phase 3 scaffold: chat engine (WebSocket, FCM, pricing, timer, extension, history)
- Backend: WebSocket plugin, chat/pricing/timer/extension/closure/notification services - Client app: ChatBloc, pricing dialog, chat screen with message status, extension/goodbye flow, history - Mitra app: MitraChatBloc, ExtensionBloc, chat screen, extension accept/reject, history - Control center: free trial, extension timeout, early end config toggles - DB migration: chat_messages, session_closures, session_extensions, customer_transactions tables Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import { authenticate } from '../../plugins/auth.js'
|
||||
import { getMitraByFirebaseUid } from '../../services/mitra.service.js'
|
||||
import { acceptPairingRequest, declinePairingRequest } from '../../services/pairing.service.js'
|
||||
import { getActiveSessionsByMitra, endSession } from '../../services/session.service.js'
|
||||
import { getActiveSessionsByMitra, endSession, getMitraHistory } from '../../services/session.service.js'
|
||||
import { subscribe } from '../../plugins/valkey.js'
|
||||
import { respondToExtension } from '../../services/extension.service.js'
|
||||
|
||||
const resolveMitra = async (request, reply) => {
|
||||
const mitra = await getMitraByFirebaseUid(request.firebaseUser.uid)
|
||||
@@ -66,4 +67,27 @@ export const mitraChatRoutes = async (app) => {
|
||||
const session = await endSession(request.params.sessionId, 'mitra')
|
||||
return reply.send({ success: true, data: session })
|
||||
})
|
||||
|
||||
// Respond to extension request
|
||||
app.post('/sessions/:sessionId/extend-response', { preHandler: [authenticate, resolveMitra] }, async (request, reply) => {
|
||||
const { extension_id, accepted } = request.body || {}
|
||||
if (!extension_id || accepted === undefined) {
|
||||
return reply.code(400).send({
|
||||
success: false,
|
||||
error: { code: 'BAD_REQUEST', message: 'extension_id and accepted are required' },
|
||||
})
|
||||
}
|
||||
const extension = await respondToExtension(extension_id, request.params.sessionId, request.mitra.id, accepted)
|
||||
return reply.send({ success: true, data: extension })
|
||||
})
|
||||
|
||||
// Chat history
|
||||
app.get('/history', { preHandler: [authenticate, resolveMitra] }, async (request, reply) => {
|
||||
const { page, limit } = request.query
|
||||
const history = await getMitraHistory(request.mitra.id, {
|
||||
page: page ? parseInt(page) : 1,
|
||||
limit: limit ? parseInt(limit) : 20,
|
||||
})
|
||||
return reply.send({ success: true, data: history })
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user