import { DEFAULT_TIMESTAMP } from "./../index" import { events } from "@devlego/backend-core" import { quotas } from "@devlego/pro" import { App } from "@devlego/types" const getOldestCreatedAt = (allApps: App[]): string | undefined => { const timestamps = allApps .filter(app => !!app.createdAt) .map(app => app.createdAt as string) .sort((a, b) => new Date(a).getTime() - new Date(b).getTime()) if (timestamps.length) { return timestamps[0] } } const getMonthTimestamp = (monthString: string): number => { const parts = monthString.split("-") const month = parseInt(parts[0]) - 1 // we already do +1 in month string calculation const year = parseInt(parts[1]) // using 0 as the day in next month gives us last day in previous month const date = new Date(year, month + 1, 0).getTime() const now = new Date().getTime() if (date > now) { return now } else { return date } } export const backfill = async (allApps: App[]) => { const usage = await quotas.getQuotaUsage() const rows = usage.usageQuota.rows let timestamp: string | number = DEFAULT_TIMESTAMP const oldestAppTimestamp = getOldestCreatedAt(allApps) if (oldestAppTimestamp) { timestamp = oldestAppTimestamp } await events.rows.created(rows, timestamp) for (const [monthString, quotas] of Object.entries(usage.monthly)) { if (monthString === "current") { continue } const monthTimestamp = getMonthTimestamp(monthString) const queries = quotas.queries await events.query.run(queries, monthTimestamp) const automations = quotas.automations await events.automation.run(automations, monthTimestamp) } return usage }