mirror of
https://github.com/sourcebot-dev/sourcebot.git
synced 2025-12-12 20:35:24 +00:00
144 lines
6 KiB
TypeScript
144 lines
6 KiB
TypeScript
|
|
import { Script } from "../scriptRunner";
|
||
|
|
import { PrismaClient } from "../../dist";
|
||
|
|
import { confirmAction } from "../utils";
|
||
|
|
import { createLogger } from "@sourcebot/logger";
|
||
|
|
|
||
|
|
const logger = createLogger('inject-audit-data');
|
||
|
|
|
||
|
|
// Generate realistic audit data for analytics testing
|
||
|
|
// Simulates 50 engineers with varying activity patterns
|
||
|
|
export const injectAuditData: Script = {
|
||
|
|
run: async (prisma: PrismaClient) => {
|
||
|
|
const orgId = 1;
|
||
|
|
|
||
|
|
// Check if org exists
|
||
|
|
const org = await prisma.org.findUnique({
|
||
|
|
where: { id: orgId }
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!org) {
|
||
|
|
logger.error(`Organization with id ${orgId} not found. Please create it first.`);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
logger.info(`Injecting audit data for organization: ${org.name} (${org.domain})`);
|
||
|
|
|
||
|
|
// Generate 50 fake user IDs
|
||
|
|
const userIds = Array.from({ length: 50 }, (_, i) => `user_${String(i + 1).padStart(3, '0')}`);
|
||
|
|
|
||
|
|
// Actions we're tracking
|
||
|
|
const actions = [
|
||
|
|
'user.performed_code_search',
|
||
|
|
'user.performed_find_references',
|
||
|
|
'user.performed_goto_definition'
|
||
|
|
];
|
||
|
|
|
||
|
|
// Generate data for the last 90 days
|
||
|
|
const endDate = new Date();
|
||
|
|
const startDate = new Date();
|
||
|
|
startDate.setDate(startDate.getDate() - 90);
|
||
|
|
|
||
|
|
logger.info(`Generating data from ${startDate.toISOString().split('T')[0]} to ${endDate.toISOString().split('T')[0]}`);
|
||
|
|
|
||
|
|
confirmAction();
|
||
|
|
|
||
|
|
// Generate data for each day
|
||
|
|
for (let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) {
|
||
|
|
const currentDate = new Date(d);
|
||
|
|
const dayOfWeek = currentDate.getDay(); // 0 = Sunday, 6 = Saturday
|
||
|
|
const isWeekend = dayOfWeek === 0 || dayOfWeek === 6;
|
||
|
|
|
||
|
|
// For each user, generate activity for this day
|
||
|
|
for (const userId of userIds) {
|
||
|
|
// Determine if user is active today (higher chance on weekdays)
|
||
|
|
const isActiveToday = isWeekend
|
||
|
|
? Math.random() < 0.15 // 15% chance on weekends
|
||
|
|
: Math.random() < 0.85; // 85% chance on weekdays
|
||
|
|
|
||
|
|
if (!isActiveToday) continue;
|
||
|
|
|
||
|
|
// Generate code searches (2-5 per day)
|
||
|
|
const codeSearches = isWeekend
|
||
|
|
? Math.floor(Math.random() * 2) + 1 // 1-2 on weekends
|
||
|
|
: Math.floor(Math.random() * 4) + 2; // 2-5 on weekdays
|
||
|
|
|
||
|
|
// Generate navigation actions (5-10 per day)
|
||
|
|
const navigationActions = isWeekend
|
||
|
|
? Math.floor(Math.random() * 3) + 1 // 1-3 on weekends
|
||
|
|
: Math.floor(Math.random() * 6) + 5; // 5-10 on weekdays
|
||
|
|
|
||
|
|
// Create code search records
|
||
|
|
for (let i = 0; i < codeSearches; i++) {
|
||
|
|
const timestamp = new Date(currentDate);
|
||
|
|
// Spread throughout the day (9 AM to 6 PM on weekdays, more random on weekends)
|
||
|
|
if (isWeekend) {
|
||
|
|
timestamp.setHours(9 + Math.floor(Math.random() * 12));
|
||
|
|
timestamp.setMinutes(Math.floor(Math.random() * 60));
|
||
|
|
} else {
|
||
|
|
timestamp.setHours(9 + Math.floor(Math.random() * 9));
|
||
|
|
timestamp.setMinutes(Math.floor(Math.random() * 60));
|
||
|
|
}
|
||
|
|
timestamp.setSeconds(Math.floor(Math.random() * 60));
|
||
|
|
|
||
|
|
await prisma.audit.create({
|
||
|
|
data: {
|
||
|
|
timestamp,
|
||
|
|
action: 'user.performed_code_search',
|
||
|
|
actorId: userId,
|
||
|
|
actorType: 'user',
|
||
|
|
targetId: `search_${Math.floor(Math.random() * 1000)}`,
|
||
|
|
targetType: 'search',
|
||
|
|
sourcebotVersion: '1.0.0',
|
||
|
|
orgId
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Create navigation action records
|
||
|
|
for (let i = 0; i < navigationActions; i++) {
|
||
|
|
const timestamp = new Date(currentDate);
|
||
|
|
if (isWeekend) {
|
||
|
|
timestamp.setHours(9 + Math.floor(Math.random() * 12));
|
||
|
|
timestamp.setMinutes(Math.floor(Math.random() * 60));
|
||
|
|
} else {
|
||
|
|
timestamp.setHours(9 + Math.floor(Math.random() * 9));
|
||
|
|
timestamp.setMinutes(Math.floor(Math.random() * 60));
|
||
|
|
}
|
||
|
|
timestamp.setSeconds(Math.floor(Math.random() * 60));
|
||
|
|
|
||
|
|
// Randomly choose between find references and goto definition
|
||
|
|
const action = Math.random() < 0.6 ? 'user.performed_find_references' : 'user.performed_goto_definition';
|
||
|
|
|
||
|
|
await prisma.audit.create({
|
||
|
|
data: {
|
||
|
|
timestamp,
|
||
|
|
action,
|
||
|
|
actorId: userId,
|
||
|
|
actorType: 'user',
|
||
|
|
targetId: `symbol_${Math.floor(Math.random() * 1000)}`,
|
||
|
|
targetType: 'symbol',
|
||
|
|
sourcebotVersion: '1.0.0',
|
||
|
|
orgId
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
logger.info(`\nAudit data injection complete!`);
|
||
|
|
logger.info(`Users: ${userIds.length}`);
|
||
|
|
logger.info(`Date range: ${startDate.toISOString().split('T')[0]} to ${endDate.toISOString().split('T')[0]}`);
|
||
|
|
|
||
|
|
// Show some statistics
|
||
|
|
const stats = await prisma.audit.groupBy({
|
||
|
|
by: ['action'],
|
||
|
|
where: { orgId },
|
||
|
|
_count: { action: true }
|
||
|
|
});
|
||
|
|
|
||
|
|
logger.info('\nAction breakdown:');
|
||
|
|
stats.forEach(stat => {
|
||
|
|
logger.info(` ${stat.action}: ${stat._count.action}`);
|
||
|
|
});
|
||
|
|
},
|
||
|
|
};
|