mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat: add analytics env vars, DB schema columns, instance ID generation
This commit is contained in:
@@ -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;
|
||||||
@@ -64,6 +64,13 @@
|
|||||||
"when": 1745366600000,
|
"when": 1745366600000,
|
||||||
"tag": "0008_api_key_expiration",
|
"tag": "0008_api_key_expiration",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 9,
|
||||||
|
"version": "6",
|
||||||
|
"when": 1776855591000,
|
||||||
|
"tag": "0009_analytics_consent",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ export const users = sqliteTable("users", {
|
|||||||
updatedAt: integer("updated_at", { mode: "timestamp" })
|
updatedAt: integer("updated_at", { mode: "timestamp" })
|
||||||
.notNull()
|
.notNull()
|
||||||
.$defaultFn(() => new Date()),
|
.$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", {
|
export const teams = sqliteTable("teams", {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
|
import { randomUUID } from "node:crypto";
|
||||||
import { isGpuAvailable } from "@ashim/ai";
|
import { isGpuAvailable } from "@ashim/ai";
|
||||||
import { APP_VERSION } from "@ashim/shared";
|
import { APP_VERSION } from "@ashim/shared";
|
||||||
import cors from "@fastify/cors";
|
import cors from "@fastify/cors";
|
||||||
import rateLimit from "@fastify/rate-limit";
|
import rateLimit from "@fastify/rate-limit";
|
||||||
|
import { eq } from "drizzle-orm";
|
||||||
import Fastify from "fastify";
|
import Fastify from "fastify";
|
||||||
import { env } from "./config.js";
|
import { env } from "./config.js";
|
||||||
import { db, schema } from "./db/index.js";
|
import { db, schema } from "./db/index.js";
|
||||||
@@ -35,6 +37,19 @@ console.log("Database initialized");
|
|||||||
// Create default admin user if no users exist
|
// Create default admin user if no users exist
|
||||||
await ensureDefaultAdmin();
|
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
|
// Mark any jobs left in processing/queued from a previous unclean shutdown
|
||||||
recoverStaleJobs();
|
recoverStaleJobs();
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ const envSchema = z.object({
|
|||||||
.enum(["true", "false"])
|
.enum(["true", "false"])
|
||||||
.default("true")
|
.default("true")
|
||||||
.transform((v) => v === "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>;
|
export type Env = z.infer<typeof envSchema>;
|
||||||
|
|||||||
Reference in New Issue
Block a user