71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import { isBot } from '@/bots';
|
|
import { handler } from '@/controllers/track.controller';
|
|
import { SdkAuthError, validateSdkRequest } from '@/utils/auth';
|
|
import { logger } from '@/utils/logger';
|
|
import type { FastifyPluginCallback, FastifyRequest } from 'fastify';
|
|
|
|
import { createBotEvent } from '@openpanel/db';
|
|
import type { TrackHandlerPayload } from '@openpanel/sdk';
|
|
|
|
const trackRouter: FastifyPluginCallback = (fastify, opts, done) => {
|
|
fastify.addHook(
|
|
'preHandler',
|
|
async (
|
|
req: FastifyRequest<{
|
|
Body: TrackHandlerPayload;
|
|
}>,
|
|
reply
|
|
) => {
|
|
try {
|
|
const client = await validateSdkRequest(req.headers).catch((error) => {
|
|
if (error instanceof SdkAuthError) {
|
|
return reply.status(401).send(error.message);
|
|
}
|
|
logger.error(error, 'Failed to validate sdk request');
|
|
return reply.status(401).send('Unknown validation error');
|
|
});
|
|
|
|
if (!client?.projectId) {
|
|
return reply.status(401).send('No project found for this client');
|
|
}
|
|
|
|
req.projectId = client.projectId;
|
|
req.client = client;
|
|
|
|
const bot = req.headers['user-agent']
|
|
? isBot(req.headers['user-agent'])
|
|
: null;
|
|
|
|
if (bot) {
|
|
if (req.body.type === 'track') {
|
|
const path = (req.body.payload.properties?.__path ||
|
|
req.body.payload.properties?.path) as string | undefined;
|
|
await createBotEvent({
|
|
...bot,
|
|
projectId: client.projectId,
|
|
path: path ?? '',
|
|
createdAt: new Date(),
|
|
});
|
|
}
|
|
|
|
reply.status(202).send('OK');
|
|
}
|
|
} catch (e) {
|
|
logger.error(e, 'Failed to create bot event');
|
|
reply.status(401).send();
|
|
return;
|
|
}
|
|
}
|
|
);
|
|
|
|
fastify.route({
|
|
method: 'POST',
|
|
url: '/',
|
|
handler: handler,
|
|
});
|
|
|
|
done();
|
|
};
|
|
|
|
export default trackRouter;
|