feat: add analytics env vars, DB schema columns, instance ID generation

This commit is contained in:
ashim-hq
2026-04-22 19:00:15 +08:00
parent 03df555e10
commit 4904e8d140
5 changed files with 36 additions and 0 deletions
@@ -0,0 +1,3 @@
ALTER TABLE users ADD COLUMN analytics_enabled integer;
ALTER TABLE users ADD COLUMN analytics_consent_shown_at integer;
ALTER TABLE users ADD COLUMN analytics_consent_remind_at integer;
+7
View File
@@ -64,6 +64,13 @@
"when": 1745366600000,
"tag": "0008_api_key_expiration",
"breakpoints": true
},
{
"idx": 9,
"version": "6",
"when": 1776855591000,
"tag": "0009_analytics_consent",
"breakpoints": true
}
]
}
+3
View File
@@ -13,6 +13,9 @@ export const users = sqliteTable("users", {
updatedAt: integer("updated_at", { mode: "timestamp" })
.notNull()
.$defaultFn(() => new Date()),
analyticsEnabled: integer("analytics_enabled", { mode: "boolean" }),
analyticsConsentShownAt: integer("analytics_consent_shown_at", { mode: "timestamp" }),
analyticsConsentRemindAt: integer("analytics_consent_remind_at", { mode: "timestamp" }),
});
export const teams = sqliteTable("teams", {
+15
View File
@@ -1,7 +1,9 @@
import { randomUUID } from "node:crypto";
import { isGpuAvailable } from "@ashim/ai";
import { APP_VERSION } from "@ashim/shared";
import cors from "@fastify/cors";
import rateLimit from "@fastify/rate-limit";
import { eq } from "drizzle-orm";
import Fastify from "fastify";
import { env } from "./config.js";
import { db, schema } from "./db/index.js";
@@ -35,6 +37,19 @@ console.log("Database initialized");
// Create default admin user if no users exist
await ensureDefaultAdmin();
function ensureInstanceId() {
const existing = db
.select()
.from(schema.settings)
.where(eq(schema.settings.key, "instance_id"))
.get();
if (!existing) {
db.insert(schema.settings).values({ key: "instance_id", value: randomUUID() }).run();
}
}
ensureInstanceId();
// Mark any jobs left in processing/queued from a previous unclean shutdown
recoverStaleJobs();
+8
View File
@@ -44,6 +44,14 @@ const envSchema = z.object({
.enum(["true", "false"])
.default("true")
.transform((v) => v === "true"),
ANALYTICS_ENABLED: z
.enum(["true", "false"])
.default("true")
.transform((v) => v === "true"),
ANALYTICS_SAMPLE_RATE: z.coerce.number().min(0).max(1).default(1.0),
POSTHOG_API_KEY: z.string().default(""),
POSTHOG_HOST: z.string().default("https://us.i.posthog.com"),
SENTRY_DSN: z.string().default(""),
});
export type Env = z.infer<typeof envSchema>;