diff --git a/packages/import-handler/src/index.ts b/packages/import-handler/src/index.ts index b20c51e8d..e0121f0a1 100644 --- a/packages/import-handler/src/index.ts +++ b/packages/import-handler/src/index.ts @@ -10,6 +10,7 @@ import { promisify } from 'util' import { v4 as uuid } from 'uuid' import { importCsv } from './csv' import { importMatterArchive } from './matterHistory' +import { ImportStatus, updateMetrics } from './metrics' import { createRedisClient } from './redis' import { CONTENT_FETCH_URL, createCloudTask, emailUserUrl } from './task' @@ -62,6 +63,15 @@ export type ImportContext = { type importHandlerFunc = (ctx: ImportContext, stream: Stream) => Promise +interface UpdateMetricsRequest { + taskId: string + status: ImportStatus +} + +function isUpdateMetricsRequest(body: any): body is UpdateMetricsRequest { + return 'taskId' in body && 'status' in body +} + interface StorageEvent { name: string bucket: string @@ -328,3 +338,43 @@ export const importHandler = Sentry.GCPFunction.wrapHttpFunction( res.send('ok') } ) + +export const importMetricsCollector = Sentry.GCPFunction.wrapHttpFunction( + async (req, res) => { + if (!process.env.JWT_SECRET) { + console.error('JWT_SECRET not exists') + return res.status(500).send({ errorCodes: 'JWT_SECRET_NOT_EXISTS' }) + } + const token = (req.query.token || req.headers.authorization) as string + if (!token) { + return res.status(401).send({ errorCode: 'INVALID_TOKEN' }) + } + + let userId: string + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET) as { + uid: string + } + userId = decoded.uid + } catch (e) { + console.error('Authentication error:', e) + return res.status(401).send({ errorCode: 'UNAUTHENTICATED' }) + } + + const redisClient = await createRedisClient( + process.env.REDIS_URL, + process.env.REDIS_CERT + ) + if (!isUpdateMetricsRequest(req.body)) { + console.log('Invalid request body') + return res.status(400).send('Bad Request') + } + + // update metrics + await updateMetrics(redisClient, userId, req.body.taskId, req.body.status) + await redisClient.quit() + + res.send('ok') + } +)