@wizeworks/lens-cloud 0.0.0-stage → 0.3.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +115 -2
- package/dist/alerts/evaluate.d.ts +10 -0
- package/dist/alerts/evaluate.d.ts.map +1 -0
- package/dist/alerts/evaluate.js +81 -0
- package/dist/alerts/evaluate.js.map +1 -0
- package/dist/alerts/notify.d.ts +28 -0
- package/dist/alerts/notify.d.ts.map +1 -0
- package/dist/alerts/notify.js +52 -0
- package/dist/alerts/notify.js.map +1 -0
- package/dist/app.d.ts +26 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/auth.d.ts +51 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +63 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/bridge.d.ts +7 -0
- package/dist/auth/bridge.d.ts.map +1 -0
- package/dist/auth/bridge.js +39 -0
- package/dist/auth/bridge.js.map +1 -0
- package/dist/auth/crypto.d.ts +14 -0
- package/dist/auth/crypto.d.ts.map +1 -0
- package/dist/auth/crypto.js +16 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/delete-user.d.ts +16 -0
- package/dist/auth/delete-user.d.ts.map +1 -0
- package/dist/auth/delete-user.js +21 -0
- package/dist/auth/delete-user.js.map +1 -0
- package/dist/auth/deps.d.ts +27 -0
- package/dist/auth/deps.d.ts.map +1 -0
- package/dist/auth/deps.js +3 -0
- package/dist/auth/deps.js.map +1 -0
- package/dist/auth/email-token.d.ts +8 -0
- package/dist/auth/email-token.d.ts.map +1 -0
- package/dist/auth/email-token.js +15 -0
- package/dist/auth/email-token.js.map +1 -0
- package/dist/auth/hooks.d.ts +4 -0
- package/dist/auth/hooks.d.ts.map +1 -0
- package/dist/auth/hooks.js +143 -0
- package/dist/auth/hooks.js.map +1 -0
- package/dist/auth/options.d.ts +17 -0
- package/dist/auth/options.d.ts.map +1 -0
- package/dist/auth/options.js +98 -0
- package/dist/auth/options.js.map +1 -0
- package/dist/auth/password.d.ts +10 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +22 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/plugins.d.ts +4 -0
- package/dist/auth/plugins.d.ts.map +1 -0
- package/dist/auth/plugins.js +45 -0
- package/dist/auth/plugins.js.map +1 -0
- package/dist/auth/principal.d.ts +38 -0
- package/dist/auth/principal.d.ts.map +1 -0
- package/dist/auth/principal.js +69 -0
- package/dist/auth/principal.js.map +1 -0
- package/dist/auth/roles.d.ts +50 -0
- package/dist/auth/roles.d.ts.map +1 -0
- package/dist/auth/roles.js +18 -0
- package/dist/auth/roles.js.map +1 -0
- package/dist/auth/schema-names.d.ts +130 -0
- package/dist/auth/schema-names.d.ts.map +1 -0
- package/dist/auth/schema-names.js +53 -0
- package/dist/auth/schema-names.js.map +1 -0
- package/dist/auth/secret.d.ts +12 -0
- package/dist/auth/secret.d.ts.map +1 -0
- package/dist/auth/secret.js +32 -0
- package/dist/auth/secret.js.map +1 -0
- package/dist/auth/security-notices.d.ts +34 -0
- package/dist/auth/security-notices.d.ts.map +1 -0
- package/dist/auth/security-notices.js +81 -0
- package/dist/auth/security-notices.js.map +1 -0
- package/dist/auth/signup.d.ts +23 -0
- package/dist/auth/signup.d.ts.map +1 -0
- package/dist/auth/signup.js +61 -0
- package/dist/auth/signup.js.map +1 -0
- package/dist/auth/sso.d.ts +21 -0
- package/dist/auth/sso.d.ts.map +1 -0
- package/dist/auth/sso.js +35 -0
- package/dist/auth/sso.js.map +1 -0
- package/dist/auth/wire.d.ts +16 -0
- package/dist/auth/wire.d.ts.map +1 -0
- package/dist/auth/wire.js +47 -0
- package/dist/auth/wire.js.map +1 -0
- package/dist/cli-args.d.ts +5 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +86 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +44 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -0
- package/dist/db/db.d.ts +22 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +64 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/migrate.d.ts +6 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +35 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema-auth.d.ts +2 -0
- package/dist/db/schema-auth.d.ts.map +1 -0
- package/dist/db/schema-auth.js +93 -0
- package/dist/db/schema-auth.js.map +1 -0
- package/dist/db/schema-mail.d.ts +2 -0
- package/dist/db/schema-mail.d.ts.map +1 -0
- package/dist/db/schema-mail.js +8 -0
- package/dist/db/schema-mail.js.map +1 -0
- package/dist/db/schema-notify.d.ts +2 -0
- package/dist/db/schema-notify.d.ts.map +1 -0
- package/dist/db/schema-notify.js +26 -0
- package/dist/db/schema-notify.js.map +1 -0
- package/dist/db/schema-sso.d.ts +2 -0
- package/dist/db/schema-sso.d.ts.map +1 -0
- package/dist/db/schema-sso.js +17 -0
- package/dist/db/schema-sso.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +208 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/http/http.d.ts +19 -0
- package/dist/http/http.d.ts.map +1 -0
- package/dist/http/http.js +66 -0
- package/dist/http/http.js.map +1 -0
- package/dist/http/limiter.d.ts +11 -0
- package/dist/http/limiter.d.ts.map +1 -0
- package/dist/http/limiter.js +31 -0
- package/dist/http/limiter.js.map +1 -0
- package/dist/http/router.d.ts +21 -0
- package/dist/http/router.d.ts.map +1 -0
- package/dist/http/router.js +28 -0
- package/dist/http/router.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +4 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +53 -0
- package/dist/jobs.js.map +1 -0
- package/dist/mail/blocks.d.ts +14 -0
- package/dist/mail/blocks.d.ts.map +1 -0
- package/dist/mail/blocks.js +35 -0
- package/dist/mail/blocks.js.map +1 -0
- package/dist/mail/content.d.ts +68 -0
- package/dist/mail/content.d.ts.map +1 -0
- package/dist/mail/content.js +6 -0
- package/dist/mail/content.js.map +1 -0
- package/dist/mail/emails-digest.d.ts +10 -0
- package/dist/mail/emails-digest.d.ts.map +1 -0
- package/dist/mail/emails-digest.js +55 -0
- package/dist/mail/emails-digest.js.map +1 -0
- package/dist/mail/emails-health.d.ts +6 -0
- package/dist/mail/emails-health.d.ts.map +1 -0
- package/dist/mail/emails-health.js +36 -0
- package/dist/mail/emails-health.js.map +1 -0
- package/dist/mail/emails-security.d.ts +14 -0
- package/dist/mail/emails-security.d.ts.map +1 -0
- package/dist/mail/emails-security.js +27 -0
- package/dist/mail/emails-security.js.map +1 -0
- package/dist/mail/emails-team.d.ts +11 -0
- package/dist/mail/emails-team.d.ts.map +1 -0
- package/dist/mail/emails-team.js +45 -0
- package/dist/mail/emails-team.js.map +1 -0
- package/dist/mail/emails.d.ts +9 -0
- package/dist/mail/emails.d.ts.map +1 -0
- package/dist/mail/emails.js +49 -0
- package/dist/mail/emails.js.map +1 -0
- package/dist/mail/layout.d.ts +6 -0
- package/dist/mail/layout.d.ts.map +1 -0
- package/dist/mail/layout.js +10 -0
- package/dist/mail/layout.js.map +1 -0
- package/dist/mail/mailer.d.ts +25 -0
- package/dist/mail/mailer.d.ts.map +1 -0
- package/dist/mail/mailer.js +49 -0
- package/dist/mail/mailer.js.map +1 -0
- package/dist/mail/preview.d.ts +6 -0
- package/dist/mail/preview.d.ts.map +1 -0
- package/dist/mail/preview.js +26 -0
- package/dist/mail/preview.js.map +1 -0
- package/dist/mail/resend.d.ts +11 -0
- package/dist/mail/resend.d.ts.map +1 -0
- package/dist/mail/resend.js +34 -0
- package/dist/mail/resend.js.map +1 -0
- package/dist/mail/samples.d.ts +3 -0
- package/dist/mail/samples.d.ts.map +1 -0
- package/dist/mail/samples.js +63 -0
- package/dist/mail/samples.js.map +1 -0
- package/dist/mail/stop-route.d.ts +4 -0
- package/dist/mail/stop-route.d.ts.map +1 -0
- package/dist/mail/stop-route.js +41 -0
- package/dist/mail/stop-route.js.map +1 -0
- package/dist/mail/svix.d.ts +8 -0
- package/dist/mail/svix.d.ts.map +1 -0
- package/dist/mail/svix.js +17 -0
- package/dist/mail/svix.js.map +1 -0
- package/dist/mail/templates.d.ts +12 -0
- package/dist/mail/templates.d.ts.map +1 -0
- package/dist/mail/templates.js +18 -0
- package/dist/mail/templates.js.map +1 -0
- package/dist/mail/text.d.ts +4 -0
- package/dist/mail/text.d.ts.map +1 -0
- package/dist/mail/text.js +17 -0
- package/dist/mail/text.js.map +1 -0
- package/dist/mail/theme.d.ts +26 -0
- package/dist/mail/theme.d.ts.map +1 -0
- package/dist/mail/theme.js +21 -0
- package/dist/mail/theme.js.map +1 -0
- package/dist/mail/unsubscribe.d.ts +14 -0
- package/dist/mail/unsubscribe.d.ts.map +1 -0
- package/dist/mail/unsubscribe.js +39 -0
- package/dist/mail/unsubscribe.js.map +1 -0
- package/dist/mail/webhook.d.ts +5 -0
- package/dist/mail/webhook.d.ts.map +1 -0
- package/dist/mail/webhook.js +41 -0
- package/dist/mail/webhook.js.map +1 -0
- package/dist/notify/digest-data.d.ts +31 -0
- package/dist/notify/digest-data.d.ts.map +1 -0
- package/dist/notify/digest-data.js +37 -0
- package/dist/notify/digest-data.js.map +1 -0
- package/dist/notify/digest.d.ts +17 -0
- package/dist/notify/digest.d.ts.map +1 -0
- package/dist/notify/digest.js +76 -0
- package/dist/notify/digest.js.map +1 -0
- package/dist/notify/health.d.ts +6 -0
- package/dist/notify/health.d.ts.map +1 -0
- package/dist/notify/health.js +43 -0
- package/dist/notify/health.js.map +1 -0
- package/dist/notify/team-describe.d.ts +22 -0
- package/dist/notify/team-describe.d.ts.map +1 -0
- package/dist/notify/team-describe.js +67 -0
- package/dist/notify/team-describe.js.map +1 -0
- package/dist/notify/team.d.ts +6 -0
- package/dist/notify/team.d.ts.map +1 -0
- package/dist/notify/team.js +56 -0
- package/dist/notify/team.js.map +1 -0
- package/dist/repo/alerts.d.ts +52 -0
- package/dist/repo/alerts.d.ts.map +1 -0
- package/dist/repo/alerts.js +38 -0
- package/dist/repo/alerts.js.map +1 -0
- package/dist/repo/audit.d.ts +11 -0
- package/dist/repo/audit.d.ts.map +1 -0
- package/dist/repo/audit.js +17 -0
- package/dist/repo/audit.js.map +1 -0
- package/dist/repo/auth-prune.d.ts +4 -0
- package/dist/repo/auth-prune.d.ts.map +1 -0
- package/dist/repo/auth-prune.js +8 -0
- package/dist/repo/auth-prune.js.map +1 -0
- package/dist/repo/mail-prefs.d.ts +35 -0
- package/dist/repo/mail-prefs.d.ts.map +1 -0
- package/dist/repo/mail-prefs.js +34 -0
- package/dist/repo/mail-prefs.js.map +1 -0
- package/dist/repo/metric-read.d.ts +12 -0
- package/dist/repo/metric-read.d.ts.map +1 -0
- package/dist/repo/metric-read.js +11 -0
- package/dist/repo/metric-read.js.map +1 -0
- package/dist/repo/metric-write.d.ts +9 -0
- package/dist/repo/metric-write.d.ts.map +1 -0
- package/dist/repo/metric-write.js +53 -0
- package/dist/repo/metric-write.js.map +1 -0
- package/dist/repo/orgs.d.ts +37 -0
- package/dist/repo/orgs.d.ts.map +1 -0
- package/dist/repo/orgs.js +33 -0
- package/dist/repo/orgs.js.map +1 -0
- package/dist/repo/projects.d.ts +37 -0
- package/dist/repo/projects.d.ts.map +1 -0
- package/dist/repo/projects.js +57 -0
- package/dist/repo/projects.js.map +1 -0
- package/dist/repo/suppressions.d.ts +8 -0
- package/dist/repo/suppressions.d.ts.map +1 -0
- package/dist/repo/suppressions.js +16 -0
- package/dist/repo/suppressions.js.map +1 -0
- package/dist/repo/trace-read.d.ts +28 -0
- package/dist/repo/trace-read.d.ts.map +1 -0
- package/dist/repo/trace-read.js +76 -0
- package/dist/repo/trace-read.js.map +1 -0
- package/dist/repo/trace-write.d.ts +9 -0
- package/dist/repo/trace-write.d.ts.map +1 -0
- package/dist/repo/trace-write.js +82 -0
- package/dist/repo/trace-write.js.map +1 -0
- package/dist/repo/users.d.ts +13 -0
- package/dist/repo/users.d.ts.map +1 -0
- package/dist/repo/users.js +7 -0
- package/dist/repo/users.js.map +1 -0
- package/dist/routes/alerts.d.ts +4 -0
- package/dist/routes/alerts.d.ts.map +1 -0
- package/dist/routes/alerts.js +116 -0
- package/dist/routes/alerts.js.map +1 -0
- package/dist/routes/data.d.ts +7 -0
- package/dist/routes/data.d.ts.map +1 -0
- package/dist/routes/data.js +74 -0
- package/dist/routes/data.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +25 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/ingest.d.ts +8 -0
- package/dist/routes/ingest.d.ts.map +1 -0
- package/dist/routes/ingest.js +38 -0
- package/dist/routes/ingest.js.map +1 -0
- package/dist/routes/mcp.d.ts +4 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +52 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/me.d.ts +4 -0
- package/dist/routes/me.d.ts.map +1 -0
- package/dist/routes/me.js +37 -0
- package/dist/routes/me.js.map +1 -0
- package/dist/routes/metrics.d.ts +13 -0
- package/dist/routes/metrics.d.ts.map +1 -0
- package/dist/routes/metrics.js +29 -0
- package/dist/routes/metrics.js.map +1 -0
- package/dist/routes/models.d.ts +4 -0
- package/dist/routes/models.d.ts.map +1 -0
- package/dist/routes/models.js +71 -0
- package/dist/routes/models.js.map +1 -0
- package/dist/routes/notify.d.ts +4 -0
- package/dist/routes/notify.d.ts.map +1 -0
- package/dist/routes/notify.js +55 -0
- package/dist/routes/notify.js.map +1 -0
- package/dist/routes/orgs.d.ts +4 -0
- package/dist/routes/orgs.d.ts.map +1 -0
- package/dist/routes/orgs.js +73 -0
- package/dist/routes/orgs.js.map +1 -0
- package/dist/routes/projects.d.ts +4 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +55 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/shares.d.ts +11 -0
- package/dist/routes/shares.d.ts.map +1 -0
- package/dist/routes/shares.js +61 -0
- package/dist/routes/shares.js.map +1 -0
- package/dist/scale-exec.d.ts +11 -0
- package/dist/scale-exec.d.ts.map +1 -0
- package/dist/scale-exec.js +26 -0
- package/dist/scale-exec.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +126 -0
- package/dist/server.js.map +1 -0
- package/dist/settle.d.ts +26 -0
- package/dist/settle.d.ts.map +1 -0
- package/dist/settle.js +85 -0
- package/dist/settle.js.map +1 -0
- package/package.json +76 -3
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Db } from "./db.js";
|
|
2
|
+
/** Apply every migration not applied yet, each in its own transaction. Returns how many ran. */
|
|
3
|
+
export declare function migrate(db: Db): Promise<number>;
|
|
4
|
+
/** One migration as single statements, so it runs inside a transaction on every driver. A `$$ … $$` body (a function) stays whole. */
|
|
5
|
+
export declare function splitStatements(sql: string): string[];
|
|
6
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAGlC,gGAAgG;AAChG,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAcrD;AAED,sIAAsI;AACtI,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAWrD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { MIGRATIONS, MIGRATIONS_TABLE } from "./schema.js";
|
|
2
|
+
/** Apply every migration not applied yet, each in its own transaction. Returns how many ran. */
|
|
3
|
+
export async function migrate(db) {
|
|
4
|
+
await db.exec(MIGRATIONS_TABLE);
|
|
5
|
+
const done = new Set((await db.query("SELECT version FROM wizelens_migrations")).map((r) => r.version));
|
|
6
|
+
let ran = 0;
|
|
7
|
+
for (let i = 0; i < MIGRATIONS.length; i++) {
|
|
8
|
+
const version = i + 1;
|
|
9
|
+
if (done.has(version))
|
|
10
|
+
continue;
|
|
11
|
+
await db.tx(async (q) => {
|
|
12
|
+
for (const statement of splitStatements(MIGRATIONS[i]))
|
|
13
|
+
await q.query(statement);
|
|
14
|
+
await q.query("INSERT INTO wizelens_migrations (version, applied_ms) VALUES ($1, $2)", [version, Date.now()]);
|
|
15
|
+
});
|
|
16
|
+
ran++;
|
|
17
|
+
}
|
|
18
|
+
return ran;
|
|
19
|
+
}
|
|
20
|
+
/** One migration as single statements, so it runs inside a transaction on every driver. A `$$ … $$` body (a function) stays whole. */
|
|
21
|
+
export function splitStatements(sql) {
|
|
22
|
+
const out = [];
|
|
23
|
+
let current = "";
|
|
24
|
+
let quoted = false;
|
|
25
|
+
for (const line of sql.split("\n")) {
|
|
26
|
+
current += `${line}\n`;
|
|
27
|
+
if ((line.match(/\$\$/g)?.length ?? 0) % 2 === 1)
|
|
28
|
+
quoted = !quoted;
|
|
29
|
+
if (!quoted && /;\s*$/.test(line))
|
|
30
|
+
(out.push(current), (current = ""));
|
|
31
|
+
}
|
|
32
|
+
out.push(current);
|
|
33
|
+
return out.map((s) => s.trim().replace(/;$/, "")).filter(Boolean);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAM;IAClC,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAsB,yCAAyC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7H,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAChC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;gBAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAClF,MAAM,CAAC,CAAC,KAAK,CAAC,uEAAuE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sIAAsI;AACtI,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,GAAG,IAAI,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,GAAG,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const AUTH_MIGRATION = "\nALTER TABLE users ADD COLUMN email_verified BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE users ADD COLUMN image TEXT;\nALTER TABLE users ADD COLUMN created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;\nALTER TABLE users ADD COLUMN updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;\nALTER TABLE users ADD COLUMN two_factor_enabled BOOLEAN DEFAULT FALSE;\nUPDATE users SET email = lower(email), email_verified = TRUE, created_at = to_timestamp(created_ms / 1000.0), updated_at = to_timestamp(created_ms / 1000.0);\nCREATE TABLE accounts (\n id TEXT NOT NULL PRIMARY KEY, account_id TEXT NOT NULL, provider_id TEXT NOT NULL,\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, access_token TEXT, refresh_token TEXT, id_token TEXT,\n access_token_expires_at TIMESTAMPTZ, refresh_token_expires_at TIMESTAMPTZ, scope TEXT, password TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL\n);\nCREATE INDEX accounts_user_id_idx ON accounts (user_id);\nCREATE UNIQUE INDEX ux_accounts_provider_account ON accounts (provider_id, account_id);\nINSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)\n SELECT gen_random_uuid()::text, id, 'credential', id, password_hash, created_at, CURRENT_TIMESTAMP FROM users;\nALTER TABLE users DROP COLUMN password_hash;\nALTER TABLE users DROP COLUMN created_ms;\nDROP TABLE sessions;\nCREATE TABLE sessions (\n id TEXT NOT NULL PRIMARY KEY, expires_at TIMESTAMPTZ NOT NULL, token TEXT NOT NULL UNIQUE,\n created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL, ip_address TEXT, user_agent TEXT,\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, active_org_id TEXT\n);\nCREATE INDEX sessions_user_id_idx ON sessions (user_id);\nALTER TABLE orgs ADD COLUMN logo TEXT;\nALTER TABLE orgs ADD COLUMN metadata TEXT;\nALTER TABLE orgs ADD COLUMN created_at TIMESTAMPTZ;\nUPDATE orgs SET created_at = to_timestamp(created_ms / 1000.0);\nALTER TABLE orgs ALTER COLUMN created_at SET NOT NULL;\nALTER TABLE orgs DROP COLUMN created_ms;\nALTER TABLE members ADD COLUMN id TEXT;\nALTER TABLE members ADD COLUMN created_at TIMESTAMPTZ;\nUPDATE members SET id = gen_random_uuid()::text, created_at = to_timestamp(created_ms / 1000.0);\nALTER TABLE members DROP CONSTRAINT members_pkey;\nALTER TABLE members ALTER COLUMN id SET NOT NULL;\nALTER TABLE members ALTER COLUMN created_at SET NOT NULL;\nALTER TABLE members DROP COLUMN created_ms;\nALTER TABLE members ADD PRIMARY KEY (id);\nCREATE UNIQUE INDEX ux_members_org_user ON members (org_id, user_id);\nCREATE INDEX members_org_id_idx ON members (org_id);\nCREATE INDEX members_user_id_idx ON members (user_id);\nDROP INDEX ix_members_user;\nALTER TABLE invites RENAME TO legacy_invites;\nCREATE TABLE invites (\n id TEXT NOT NULL PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE, email TEXT NOT NULL, role TEXT,\n status TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,\n inviter_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE\n);\nCREATE INDEX invites_org_id_idx ON invites (org_id);\nCREATE INDEX invites_email_idx ON invites (email);\nINSERT INTO invites (id, org_id, email, role, status, expires_at, created_at, inviter_id)\n SELECT gen_random_uuid()::text, i.org_id, lower(i.email), i.role, 'pending', to_timestamp(i.expires_ms / 1000.0), to_timestamp(i.created_ms / 1000.0),\n COALESCE((SELECT u.id FROM users u WHERE u.id = i.created_by),\n (SELECT m.user_id FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner' ORDER BY m.created_at LIMIT 1))\n FROM legacy_invites i\n WHERE i.accepted_ms IS NULL AND i.expires_ms > extract(epoch FROM CURRENT_TIMESTAMP) * 1000\n AND EXISTS (SELECT 1 FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner');\nDROP TABLE legacy_invites;\nCREATE TABLE verifications (\n id TEXT NOT NULL PRIMARY KEY, identifier TEXT NOT NULL, value TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\nCREATE INDEX verifications_identifier_idx ON verifications (identifier);\nCREATE TABLE two_factors (\n id TEXT NOT NULL PRIMARY KEY, secret TEXT NOT NULL, backup_codes TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,\n verified BOOLEAN, failed_verification_count INTEGER, locked_until TIMESTAMPTZ\n);\nCREATE INDEX two_factors_secret_idx ON two_factors (secret);\nCREATE INDEX two_factors_user_id_idx ON two_factors (user_id);\nCREATE TABLE passkeys (\n id TEXT NOT NULL PRIMARY KEY, name TEXT, public_key TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,\n credential_id TEXT NOT NULL, counter INTEGER NOT NULL, device_type TEXT NOT NULL, backed_up BOOLEAN NOT NULL, transports TEXT,\n created_at TIMESTAMPTZ, aaguid TEXT\n);\nCREATE INDEX passkeys_user_id_idx ON passkeys (user_id);\nCREATE INDEX passkeys_credential_id_idx ON passkeys (credential_id);\nCREATE TABLE rate_limits (id TEXT NOT NULL PRIMARY KEY, key TEXT NOT NULL UNIQUE, count INTEGER NOT NULL, last_request BIGINT NOT NULL);\nCREATE TABLE cloud_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE FUNCTION wl_org_keeps_owner() RETURNS trigger LANGUAGE plpgsql AS $$\nDECLARE oid TEXT := COALESCE(OLD.org_id, NEW.org_id);\nBEGIN\n IF EXISTS (SELECT 1 FROM orgs WHERE id = oid) AND NOT EXISTS (SELECT 1 FROM members WHERE org_id = oid AND role = 'owner') THEN\n RAISE EXCEPTION 'organization % must keep at least one owner', oid USING ERRCODE = 'check_violation';\n END IF;\n RETURN NULL;\nEND $$;\nCREATE CONSTRAINT TRIGGER members_keep_owner AFTER UPDATE OR DELETE ON members\n DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION wl_org_keeps_owner();\n";
|
|
2
|
+
//# sourceMappingURL=schema-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-auth.d.ts","sourceRoot":"","sources":["../../src/db/schema-auth.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,8xLA0F1B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Migration 4: accounts move to Better Auth (names in auth/schema-names.ts). Rows and ids stay; sessions start over; invites get new links.
|
|
2
|
+
export const AUTH_MIGRATION = `
|
|
3
|
+
ALTER TABLE users ADD COLUMN email_verified BOOLEAN NOT NULL DEFAULT FALSE;
|
|
4
|
+
ALTER TABLE users ADD COLUMN image TEXT;
|
|
5
|
+
ALTER TABLE users ADD COLUMN created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
|
6
|
+
ALTER TABLE users ADD COLUMN updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
|
7
|
+
ALTER TABLE users ADD COLUMN two_factor_enabled BOOLEAN DEFAULT FALSE;
|
|
8
|
+
UPDATE users SET email = lower(email), email_verified = TRUE, created_at = to_timestamp(created_ms / 1000.0), updated_at = to_timestamp(created_ms / 1000.0);
|
|
9
|
+
CREATE TABLE accounts (
|
|
10
|
+
id TEXT NOT NULL PRIMARY KEY, account_id TEXT NOT NULL, provider_id TEXT NOT NULL,
|
|
11
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, access_token TEXT, refresh_token TEXT, id_token TEXT,
|
|
12
|
+
access_token_expires_at TIMESTAMPTZ, refresh_token_expires_at TIMESTAMPTZ, scope TEXT, password TEXT,
|
|
13
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX accounts_user_id_idx ON accounts (user_id);
|
|
16
|
+
CREATE UNIQUE INDEX ux_accounts_provider_account ON accounts (provider_id, account_id);
|
|
17
|
+
INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)
|
|
18
|
+
SELECT gen_random_uuid()::text, id, 'credential', id, password_hash, created_at, CURRENT_TIMESTAMP FROM users;
|
|
19
|
+
ALTER TABLE users DROP COLUMN password_hash;
|
|
20
|
+
ALTER TABLE users DROP COLUMN created_ms;
|
|
21
|
+
DROP TABLE sessions;
|
|
22
|
+
CREATE TABLE sessions (
|
|
23
|
+
id TEXT NOT NULL PRIMARY KEY, expires_at TIMESTAMPTZ NOT NULL, token TEXT NOT NULL UNIQUE,
|
|
24
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL, ip_address TEXT, user_agent TEXT,
|
|
25
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, active_org_id TEXT
|
|
26
|
+
);
|
|
27
|
+
CREATE INDEX sessions_user_id_idx ON sessions (user_id);
|
|
28
|
+
ALTER TABLE orgs ADD COLUMN logo TEXT;
|
|
29
|
+
ALTER TABLE orgs ADD COLUMN metadata TEXT;
|
|
30
|
+
ALTER TABLE orgs ADD COLUMN created_at TIMESTAMPTZ;
|
|
31
|
+
UPDATE orgs SET created_at = to_timestamp(created_ms / 1000.0);
|
|
32
|
+
ALTER TABLE orgs ALTER COLUMN created_at SET NOT NULL;
|
|
33
|
+
ALTER TABLE orgs DROP COLUMN created_ms;
|
|
34
|
+
ALTER TABLE members ADD COLUMN id TEXT;
|
|
35
|
+
ALTER TABLE members ADD COLUMN created_at TIMESTAMPTZ;
|
|
36
|
+
UPDATE members SET id = gen_random_uuid()::text, created_at = to_timestamp(created_ms / 1000.0);
|
|
37
|
+
ALTER TABLE members DROP CONSTRAINT members_pkey;
|
|
38
|
+
ALTER TABLE members ALTER COLUMN id SET NOT NULL;
|
|
39
|
+
ALTER TABLE members ALTER COLUMN created_at SET NOT NULL;
|
|
40
|
+
ALTER TABLE members DROP COLUMN created_ms;
|
|
41
|
+
ALTER TABLE members ADD PRIMARY KEY (id);
|
|
42
|
+
CREATE UNIQUE INDEX ux_members_org_user ON members (org_id, user_id);
|
|
43
|
+
CREATE INDEX members_org_id_idx ON members (org_id);
|
|
44
|
+
CREATE INDEX members_user_id_idx ON members (user_id);
|
|
45
|
+
DROP INDEX ix_members_user;
|
|
46
|
+
ALTER TABLE invites RENAME TO legacy_invites;
|
|
47
|
+
CREATE TABLE invites (
|
|
48
|
+
id TEXT NOT NULL PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE, email TEXT NOT NULL, role TEXT,
|
|
49
|
+
status TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
50
|
+
inviter_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE
|
|
51
|
+
);
|
|
52
|
+
CREATE INDEX invites_org_id_idx ON invites (org_id);
|
|
53
|
+
CREATE INDEX invites_email_idx ON invites (email);
|
|
54
|
+
INSERT INTO invites (id, org_id, email, role, status, expires_at, created_at, inviter_id)
|
|
55
|
+
SELECT gen_random_uuid()::text, i.org_id, lower(i.email), i.role, 'pending', to_timestamp(i.expires_ms / 1000.0), to_timestamp(i.created_ms / 1000.0),
|
|
56
|
+
COALESCE((SELECT u.id FROM users u WHERE u.id = i.created_by),
|
|
57
|
+
(SELECT m.user_id FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner' ORDER BY m.created_at LIMIT 1))
|
|
58
|
+
FROM legacy_invites i
|
|
59
|
+
WHERE i.accepted_ms IS NULL AND i.expires_ms > extract(epoch FROM CURRENT_TIMESTAMP) * 1000
|
|
60
|
+
AND EXISTS (SELECT 1 FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner');
|
|
61
|
+
DROP TABLE legacy_invites;
|
|
62
|
+
CREATE TABLE verifications (
|
|
63
|
+
id TEXT NOT NULL PRIMARY KEY, identifier TEXT NOT NULL, value TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL,
|
|
64
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
65
|
+
);
|
|
66
|
+
CREATE INDEX verifications_identifier_idx ON verifications (identifier);
|
|
67
|
+
CREATE TABLE two_factors (
|
|
68
|
+
id TEXT NOT NULL PRIMARY KEY, secret TEXT NOT NULL, backup_codes TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
69
|
+
verified BOOLEAN, failed_verification_count INTEGER, locked_until TIMESTAMPTZ
|
|
70
|
+
);
|
|
71
|
+
CREATE INDEX two_factors_secret_idx ON two_factors (secret);
|
|
72
|
+
CREATE INDEX two_factors_user_id_idx ON two_factors (user_id);
|
|
73
|
+
CREATE TABLE passkeys (
|
|
74
|
+
id TEXT NOT NULL PRIMARY KEY, name TEXT, public_key TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
75
|
+
credential_id TEXT NOT NULL, counter INTEGER NOT NULL, device_type TEXT NOT NULL, backed_up BOOLEAN NOT NULL, transports TEXT,
|
|
76
|
+
created_at TIMESTAMPTZ, aaguid TEXT
|
|
77
|
+
);
|
|
78
|
+
CREATE INDEX passkeys_user_id_idx ON passkeys (user_id);
|
|
79
|
+
CREATE INDEX passkeys_credential_id_idx ON passkeys (credential_id);
|
|
80
|
+
CREATE TABLE rate_limits (id TEXT NOT NULL PRIMARY KEY, key TEXT NOT NULL UNIQUE, count INTEGER NOT NULL, last_request BIGINT NOT NULL);
|
|
81
|
+
CREATE TABLE cloud_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
|
|
82
|
+
CREATE FUNCTION wl_org_keeps_owner() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
83
|
+
DECLARE oid TEXT := COALESCE(OLD.org_id, NEW.org_id);
|
|
84
|
+
BEGIN
|
|
85
|
+
IF EXISTS (SELECT 1 FROM orgs WHERE id = oid) AND NOT EXISTS (SELECT 1 FROM members WHERE org_id = oid AND role = 'owner') THEN
|
|
86
|
+
RAISE EXCEPTION 'organization % must keep at least one owner', oid USING ERRCODE = 'check_violation';
|
|
87
|
+
END IF;
|
|
88
|
+
RETURN NULL;
|
|
89
|
+
END $$;
|
|
90
|
+
CREATE CONSTRAINT TRIGGER members_keep_owner AFTER UPDATE OR DELETE ON members
|
|
91
|
+
DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION wl_org_keeps_owner();
|
|
92
|
+
`;
|
|
93
|
+
//# sourceMappingURL=schema-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-auth.js","sourceRoot":"","sources":["../../src/db/schema-auth.ts"],"names":[],"mappings":"AAAA,4IAA4I;AAC5I,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F7B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const MAIL_MIGRATION = "\nCREATE TABLE mail_suppressions (\n email TEXT NOT NULL PRIMARY KEY, reason TEXT NOT NULL CHECK (reason IN ('bounce', 'complaint')), detail TEXT NOT NULL,\n created_ms DOUBLE PRECISION NOT NULL\n);\n";
|
|
2
|
+
//# sourceMappingURL=schema-mail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-mail.d.ts","sourceRoot":"","sources":["../../src/db/schema-mail.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,+MAK1B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Migration 6: addresses mail must skip. A hard bounce skips every email; a spam complaint skips all but mail the person asked for.
|
|
2
|
+
export const MAIL_MIGRATION = `
|
|
3
|
+
CREATE TABLE mail_suppressions (
|
|
4
|
+
email TEXT NOT NULL PRIMARY KEY, reason TEXT NOT NULL CHECK (reason IN ('bounce', 'complaint')), detail TEXT NOT NULL,
|
|
5
|
+
created_ms DOUBLE PRECISION NOT NULL
|
|
6
|
+
);
|
|
7
|
+
`;
|
|
8
|
+
//# sourceMappingURL=schema-mail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-mail.js","sourceRoot":"","sources":["../../src/db/schema-mail.ts"],"names":[],"mappings":"AAAA,oIAAoI;AACpI,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;CAK7B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const NOTIFY_MIGRATION = "\nALTER TABLE audit ADD COLUMN noticed BOOLEAN NOT NULL DEFAULT TRUE;\nALTER TABLE audit ALTER COLUMN noticed SET DEFAULT FALSE;\nCREATE INDEX ix_audit_unnoticed ON audit (time_ms) WHERE NOT noticed;\nCREATE TABLE mail_prefs (\n user_id TEXT NOT NULL PRIMARY KEY REFERENCES users (id) ON DELETE CASCADE, team BOOLEAN NOT NULL DEFAULT TRUE,\n health BOOLEAN NOT NULL DEFAULT TRUE, digests BOOLEAN NOT NULL DEFAULT TRUE, time_zone TEXT NOT NULL DEFAULT 'UTC', digest_hour SMALLINT NOT NULL DEFAULT 8\n);\nCREATE TABLE digest_prefs (\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,\n daily BOOLEAN NOT NULL, weekly BOOLEAN NOT NULL, monthly BOOLEAN NOT NULL, PRIMARY KEY (user_id, project_id)\n);\nCREATE TABLE digest_sends (\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,\n period TEXT NOT NULL, period_key TEXT NOT NULL, sent_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, project_id, period, period_key)\n);\nCREATE TABLE known_devices (\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, device TEXT NOT NULL, first_ms DOUBLE PRECISION NOT NULL,\n last_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, device)\n);\nCREATE TABLE project_health (\n project_id TEXT NOT NULL PRIMARY KEY REFERENCES projects (id) ON DELETE CASCADE, quiet BOOLEAN NOT NULL, changed_ms DOUBLE PRECISION NOT NULL\n);\n";
|
|
2
|
+
//# sourceMappingURL=schema-notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-notify.d.ts","sourceRoot":"","sources":["../../src/db/schema-notify.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,g+CAuB5B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Migration 7: notices and digests. Old audit lines count as noticed, so an upgrade sends nothing for the past.
|
|
2
|
+
export const NOTIFY_MIGRATION = `
|
|
3
|
+
ALTER TABLE audit ADD COLUMN noticed BOOLEAN NOT NULL DEFAULT TRUE;
|
|
4
|
+
ALTER TABLE audit ALTER COLUMN noticed SET DEFAULT FALSE;
|
|
5
|
+
CREATE INDEX ix_audit_unnoticed ON audit (time_ms) WHERE NOT noticed;
|
|
6
|
+
CREATE TABLE mail_prefs (
|
|
7
|
+
user_id TEXT NOT NULL PRIMARY KEY REFERENCES users (id) ON DELETE CASCADE, team BOOLEAN NOT NULL DEFAULT TRUE,
|
|
8
|
+
health BOOLEAN NOT NULL DEFAULT TRUE, digests BOOLEAN NOT NULL DEFAULT TRUE, time_zone TEXT NOT NULL DEFAULT 'UTC', digest_hour SMALLINT NOT NULL DEFAULT 8
|
|
9
|
+
);
|
|
10
|
+
CREATE TABLE digest_prefs (
|
|
11
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
12
|
+
daily BOOLEAN NOT NULL, weekly BOOLEAN NOT NULL, monthly BOOLEAN NOT NULL, PRIMARY KEY (user_id, project_id)
|
|
13
|
+
);
|
|
14
|
+
CREATE TABLE digest_sends (
|
|
15
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
16
|
+
period TEXT NOT NULL, period_key TEXT NOT NULL, sent_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, project_id, period, period_key)
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE known_devices (
|
|
19
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, device TEXT NOT NULL, first_ms DOUBLE PRECISION NOT NULL,
|
|
20
|
+
last_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, device)
|
|
21
|
+
);
|
|
22
|
+
CREATE TABLE project_health (
|
|
23
|
+
project_id TEXT NOT NULL PRIMARY KEY REFERENCES projects (id) ON DELETE CASCADE, quiet BOOLEAN NOT NULL, changed_ms DOUBLE PRECISION NOT NULL
|
|
24
|
+
);
|
|
25
|
+
`;
|
|
26
|
+
//# sourceMappingURL=schema-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-notify.js","sourceRoot":"","sources":["../../src/db/schema-notify.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuB/B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const SSO_MIGRATION = "\nCREATE TABLE sso_providers (\n id TEXT NOT NULL PRIMARY KEY, provider_id TEXT NOT NULL UNIQUE, issuer TEXT NOT NULL, domain TEXT NOT NULL, domain_verified BOOLEAN,\n oidc_config TEXT, saml_config TEXT, user_id TEXT REFERENCES users (id) ON DELETE SET NULL,\n org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE\n);\nCREATE INDEX sso_providers_user_id_idx ON sso_providers (user_id);\nCREATE INDEX sso_providers_org_id_idx ON sso_providers (org_id);\nCREATE FUNCTION wl_sso_accounts_go() RETURNS trigger LANGUAGE plpgsql AS $$\nBEGIN\n DELETE FROM accounts WHERE provider_id = OLD.provider_id;\n RETURN NULL;\nEND $$;\nCREATE TRIGGER sso_providers_accounts_go AFTER DELETE ON sso_providers FOR EACH ROW EXECUTE FUNCTION wl_sso_accounts_go();\n";
|
|
2
|
+
//# sourceMappingURL=schema-sso.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sso.d.ts","sourceRoot":"","sources":["../../src/db/schema-sso.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,0vBAczB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Migration 5: single sign-on providers, one organization each (Better Auth's SSO plugin; names in auth/schema-names.ts).
|
|
2
|
+
export const SSO_MIGRATION = `
|
|
3
|
+
CREATE TABLE sso_providers (
|
|
4
|
+
id TEXT NOT NULL PRIMARY KEY, provider_id TEXT NOT NULL UNIQUE, issuer TEXT NOT NULL, domain TEXT NOT NULL, domain_verified BOOLEAN,
|
|
5
|
+
oidc_config TEXT, saml_config TEXT, user_id TEXT REFERENCES users (id) ON DELETE SET NULL,
|
|
6
|
+
org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE
|
|
7
|
+
);
|
|
8
|
+
CREATE INDEX sso_providers_user_id_idx ON sso_providers (user_id);
|
|
9
|
+
CREATE INDEX sso_providers_org_id_idx ON sso_providers (org_id);
|
|
10
|
+
CREATE FUNCTION wl_sso_accounts_go() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
11
|
+
BEGIN
|
|
12
|
+
DELETE FROM accounts WHERE provider_id = OLD.provider_id;
|
|
13
|
+
RETURN NULL;
|
|
14
|
+
END $$;
|
|
15
|
+
CREATE TRIGGER sso_providers_accounts_go AFTER DELETE ON sso_providers FOR EACH ROW EXECUTE FUNCTION wl_sso_accounts_go();
|
|
16
|
+
`;
|
|
17
|
+
//# sourceMappingURL=schema-sso.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sso.js","sourceRoot":"","sources":["../../src/db/schema-sso.ts"],"names":[],"mappings":"AAAA,0HAA0H;AAC1H,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;CAc5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAwMvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,uHAAuH,CAAC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { AUTH_MIGRATION } from "./schema-auth.js";
|
|
2
|
+
import { MAIL_MIGRATION } from "./schema-mail.js";
|
|
3
|
+
import { NOTIFY_MIGRATION } from "./schema-notify.js";
|
|
4
|
+
import { SSO_MIGRATION } from "./schema-sso.js";
|
|
5
|
+
// Cloud schema, one entry per version. Never edit a shipped entry: add a new one (docs/CONTRACT.md, "Cloud storage").
|
|
6
|
+
export const MIGRATIONS = [
|
|
7
|
+
`
|
|
8
|
+
CREATE TABLE orgs (
|
|
9
|
+
id TEXT PRIMARY KEY, name TEXT NOT NULL, slug TEXT NOT NULL UNIQUE,
|
|
10
|
+
retention_days INTEGER NOT NULL DEFAULT 30, created_ms DOUBLE PRECISION NOT NULL
|
|
11
|
+
);
|
|
12
|
+
CREATE TABLE users (
|
|
13
|
+
id TEXT PRIMARY KEY, email TEXT NOT NULL UNIQUE, name TEXT NOT NULL, password_hash TEXT NOT NULL,
|
|
14
|
+
created_ms DOUBLE PRECISION NOT NULL
|
|
15
|
+
);
|
|
16
|
+
CREATE TABLE members (
|
|
17
|
+
org_id TEXT NOT NULL REFERENCES orgs(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
18
|
+
role TEXT NOT NULL, created_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (org_id, user_id)
|
|
19
|
+
);
|
|
20
|
+
CREATE TABLE sessions (
|
|
21
|
+
token_hash TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
22
|
+
created_ms DOUBLE PRECISION NOT NULL, expires_ms DOUBLE PRECISION NOT NULL
|
|
23
|
+
);
|
|
24
|
+
CREATE TABLE invites (
|
|
25
|
+
token_hash TEXT PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs(id) ON DELETE CASCADE, email TEXT NOT NULL,
|
|
26
|
+
role TEXT NOT NULL, created_by TEXT NOT NULL, created_ms DOUBLE PRECISION NOT NULL,
|
|
27
|
+
expires_ms DOUBLE PRECISION NOT NULL, accepted_ms DOUBLE PRECISION
|
|
28
|
+
);
|
|
29
|
+
CREATE TABLE projects (
|
|
30
|
+
id TEXT PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs(id) ON DELETE CASCADE, name TEXT NOT NULL, slug TEXT NOT NULL,
|
|
31
|
+
created_ms DOUBLE PRECISION NOT NULL, UNIQUE (org_id, slug)
|
|
32
|
+
);
|
|
33
|
+
CREATE TABLE api_keys (
|
|
34
|
+
id TEXT PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs(id) ON DELETE CASCADE, kind TEXT NOT NULL,
|
|
35
|
+
project_ids TEXT NOT NULL, name TEXT NOT NULL, prefix TEXT NOT NULL, token_hash TEXT NOT NULL UNIQUE,
|
|
36
|
+
created_by TEXT NOT NULL, created_ms DOUBLE PRECISION NOT NULL, last_used_ms DOUBLE PRECISION, revoked_ms DOUBLE PRECISION
|
|
37
|
+
);
|
|
38
|
+
CREATE TABLE traces (
|
|
39
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, start_ms DOUBLE PRECISION NOT NULL, end_ms DOUBLE PRECISION NOT NULL,
|
|
40
|
+
updated_ms DOUBLE PRECISION NOT NULL, env TEXT NOT NULL DEFAULT '', PRIMARY KEY (project_id, trace_id)
|
|
41
|
+
);
|
|
42
|
+
CREATE TABLE spans (
|
|
43
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, span_id TEXT NOT NULL, service TEXT NOT NULL,
|
|
44
|
+
start_ms DOUBLE PRECISION NOT NULL, duration_ms DOUBLE PRECISION NOT NULL, session TEXT, json TEXT NOT NULL,
|
|
45
|
+
PRIMARY KEY (project_id, trace_id, span_id)
|
|
46
|
+
);
|
|
47
|
+
CREATE TABLE logs (
|
|
48
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, key TEXT NOT NULL, time_ms DOUBLE PRECISION NOT NULL, json TEXT NOT NULL,
|
|
49
|
+
PRIMARY KEY (project_id, trace_id, key)
|
|
50
|
+
);
|
|
51
|
+
CREATE TABLE services (
|
|
52
|
+
project_id TEXT NOT NULL, service TEXT NOT NULL, environment TEXT NOT NULL, host TEXT NOT NULL, via TEXT NOT NULL,
|
|
53
|
+
info TEXT NOT NULL, first_seen DOUBLE PRECISION NOT NULL, last_seen DOUBLE PRECISION NOT NULL,
|
|
54
|
+
PRIMARY KEY (project_id, service, environment, host)
|
|
55
|
+
);
|
|
56
|
+
CREATE TABLE alert_rules (
|
|
57
|
+
id TEXT PRIMARY KEY, project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE, name TEXT NOT NULL,
|
|
58
|
+
metric TEXT NOT NULL, op TEXT NOT NULL, threshold DOUBLE PRECISION NOT NULL, window_ms DOUBLE PRECISION NOT NULL,
|
|
59
|
+
env TEXT NOT NULL DEFAULT '', channels TEXT NOT NULL, enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
60
|
+
state TEXT NOT NULL DEFAULT 'ok', last_value DOUBLE PRECISION, last_eval_ms DOUBLE PRECISION,
|
|
61
|
+
created_by TEXT NOT NULL, created_ms DOUBLE PRECISION NOT NULL
|
|
62
|
+
);
|
|
63
|
+
CREATE TABLE alert_events (
|
|
64
|
+
id TEXT PRIMARY KEY, rule_id TEXT NOT NULL REFERENCES alert_rules(id) ON DELETE CASCADE, project_id TEXT NOT NULL,
|
|
65
|
+
kind TEXT NOT NULL, value DOUBLE PRECISION, threshold DOUBLE PRECISION NOT NULL, message TEXT NOT NULL,
|
|
66
|
+
time_ms DOUBLE PRECISION NOT NULL, delivery TEXT NOT NULL DEFAULT ''
|
|
67
|
+
);
|
|
68
|
+
CREATE TABLE shares (
|
|
69
|
+
id TEXT PRIMARY KEY, project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE, trace_id TEXT NOT NULL,
|
|
70
|
+
token_hash TEXT NOT NULL UNIQUE, created_by TEXT NOT NULL, created_ms DOUBLE PRECISION NOT NULL,
|
|
71
|
+
expires_ms DOUBLE PRECISION NOT NULL, revoked_ms DOUBLE PRECISION, views INTEGER NOT NULL DEFAULT 0
|
|
72
|
+
);
|
|
73
|
+
CREATE TABLE audit (
|
|
74
|
+
id TEXT PRIMARY KEY, org_id TEXT NOT NULL, actor TEXT NOT NULL, action TEXT NOT NULL, detail TEXT NOT NULL,
|
|
75
|
+
time_ms DOUBLE PRECISION NOT NULL
|
|
76
|
+
);
|
|
77
|
+
CREATE INDEX ix_traces_updated ON traces (project_id, updated_ms);
|
|
78
|
+
CREATE INDEX ix_traces_start ON traces (project_id, start_ms);
|
|
79
|
+
CREATE INDEX ix_traces_start_all ON traces (start_ms);
|
|
80
|
+
CREATE INDEX ix_spans_session ON spans (project_id, session) WHERE session IS NOT NULL;
|
|
81
|
+
CREATE INDEX ix_alert_events_project ON alert_events (project_id, time_ms);
|
|
82
|
+
CREATE INDEX ix_audit_org ON audit (org_id, time_ms);
|
|
83
|
+
CREATE INDEX ix_members_user ON members (user_id);
|
|
84
|
+
`,
|
|
85
|
+
`
|
|
86
|
+
CREATE TABLE metric_points (
|
|
87
|
+
project_id TEXT NOT NULL, time_ms DOUBLE PRECISION NOT NULL, env TEXT NOT NULL DEFAULT '', service TEXT NOT NULL,
|
|
88
|
+
name TEXT NOT NULL, series_key TEXT NOT NULL, json TEXT NOT NULL
|
|
89
|
+
);
|
|
90
|
+
CREATE INDEX ix_metric_points_name ON metric_points (project_id, name, time_ms);
|
|
91
|
+
CREATE INDEX ix_metric_points_time ON metric_points (project_id, time_ms);
|
|
92
|
+
ALTER TABLE alert_rules ADD COLUMN metric_name TEXT NOT NULL DEFAULT '';
|
|
93
|
+
ALTER TABLE alert_rules ADD COLUMN metric_stat TEXT NOT NULL DEFAULT '';
|
|
94
|
+
ALTER TABLE alert_rules ADD COLUMN metric_service TEXT NOT NULL DEFAULT '';
|
|
95
|
+
`,
|
|
96
|
+
`
|
|
97
|
+
ALTER TABLE traces ADD COLUMN settled_ms DOUBLE PRECISION NOT NULL DEFAULT 0;
|
|
98
|
+
ALTER TABLE traces ADD COLUMN contrib TEXT;
|
|
99
|
+
CREATE INDEX ix_traces_dirty ON traces (start_ms) WHERE settled_ms < updated_ms;
|
|
100
|
+
CREATE TABLE scale_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
|
|
101
|
+
CREATE TABLE fact_requests (
|
|
102
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, env TEXT NOT NULL DEFAULT '', start_ms DOUBLE PRECISION NOT NULL,
|
|
103
|
+
method TEXT NOT NULL, path TEXT NOT NULL, endpoint TEXT NOT NULL, status INTEGER, status_class TEXT NOT NULL, failed BOOLEAN NOT NULL,
|
|
104
|
+
dur_class TEXT NOT NULL, aborted BOOLEAN NOT NULL, duration_ms DOUBLE PRECISION NOT NULL, server_ms DOUBLE PRECISION,
|
|
105
|
+
db_ms DOUBLE PRECISION NOT NULL, db_count INTEGER NOT NULL, fetch_count INTEGER NOT NULL, fetch_ms DOUBLE PRECISION NOT NULL,
|
|
106
|
+
render_ms DOUBLE PRECISION, network_ms DOUBLE PRECISION, service TEXT NOT NULL, services TEXT NOT NULL, errors INTEGER NOT NULL,
|
|
107
|
+
insights INTEGER NOT NULL, health TEXT NOT NULL, user_agent TEXT, client_address TEXT, end_user TEXT, request_id TEXT,
|
|
108
|
+
tags TEXT NOT NULL, search TEXT NOT NULL, PRIMARY KEY (project_id, trace_id)
|
|
109
|
+
);
|
|
110
|
+
CREATE INDEX ix_fact_requests_time ON fact_requests (project_id, start_ms);
|
|
111
|
+
CREATE TABLE fact_traces (
|
|
112
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, env TEXT NOT NULL DEFAULT '', start_ms DOUBLE PRECISION NOT NULL, path TEXT NOT NULL,
|
|
113
|
+
duration_ms DOUBLE PRECISION NOT NULL, health TEXT, status TEXT NOT NULL, services TEXT NOT NULL, span_count INTEGER NOT NULL,
|
|
114
|
+
slow BOOLEAN NOT NULL, search TEXT NOT NULL, PRIMARY KEY (project_id, trace_id)
|
|
115
|
+
);
|
|
116
|
+
CREATE INDEX ix_fact_traces_time ON fact_traces (project_id, start_ms);
|
|
117
|
+
CREATE TABLE fact_logs (
|
|
118
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, idx INTEGER NOT NULL, env TEXT NOT NULL DEFAULT '', time_ms DOUBLE PRECISION NOT NULL,
|
|
119
|
+
level TEXT NOT NULL, level_rank SMALLINT NOT NULL, service TEXT NOT NULL, category TEXT NOT NULL, message TEXT NOT NULL,
|
|
120
|
+
trace_name TEXT NOT NULL, span_id TEXT, attributes TEXT NOT NULL, search TEXT NOT NULL, PRIMARY KEY (project_id, trace_id, idx)
|
|
121
|
+
);
|
|
122
|
+
CREATE INDEX ix_fact_logs_time ON fact_logs (project_id, time_ms);
|
|
123
|
+
CREATE TABLE fact_critical (
|
|
124
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, span_id TEXT NOT NULL, env TEXT NOT NULL DEFAULT '', start_ms DOUBLE PRECISION NOT NULL,
|
|
125
|
+
duration_ms DOUBLE PRECISION NOT NULL, name TEXT NOT NULL, service TEXT NOT NULL, layer TEXT NOT NULL, PRIMARY KEY (project_id, trace_id, span_id)
|
|
126
|
+
);
|
|
127
|
+
CREATE INDEX ix_fact_critical_time ON fact_critical (project_id, start_ms);
|
|
128
|
+
CREATE INDEX ix_fact_critical_slow ON fact_critical (project_id, duration_ms);
|
|
129
|
+
CREATE TABLE rollup_10s (
|
|
130
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
131
|
+
n DOUBLE PRECISION NOT NULL, err DOUBLE PRECISION NOT NULL, sum_v DOUBLE PRECISION NOT NULL,
|
|
132
|
+
c0 DOUBLE PRECISION NOT NULL DEFAULT 0, c1 DOUBLE PRECISION NOT NULL DEFAULT 0, c2 DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
133
|
+
c3 DOUBLE PRECISION NOT NULL DEFAULT 0, c4 DOUBLE PRECISION NOT NULL DEFAULT 0, c5 DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
134
|
+
first_ms DOUBLE PRECISION NOT NULL, last_ms DOUBLE PRECISION NOT NULL, top_rank DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
135
|
+
top TEXT, ids TEXT NOT NULL DEFAULT '', PRIMARY KEY (project_id, kind, bucket_ms, env, key)
|
|
136
|
+
);
|
|
137
|
+
CREATE INDEX ix_rollup_10s_key ON rollup_10s (project_id, kind, key, bucket_ms);
|
|
138
|
+
CREATE TABLE rollup_5m (
|
|
139
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
140
|
+
n DOUBLE PRECISION NOT NULL, err DOUBLE PRECISION NOT NULL, sum_v DOUBLE PRECISION NOT NULL,
|
|
141
|
+
c0 DOUBLE PRECISION NOT NULL DEFAULT 0, c1 DOUBLE PRECISION NOT NULL DEFAULT 0, c2 DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
142
|
+
c3 DOUBLE PRECISION NOT NULL DEFAULT 0, c4 DOUBLE PRECISION NOT NULL DEFAULT 0, c5 DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
143
|
+
first_ms DOUBLE PRECISION NOT NULL, last_ms DOUBLE PRECISION NOT NULL, top_rank DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
144
|
+
top TEXT, ids TEXT NOT NULL DEFAULT '', PRIMARY KEY (project_id, kind, bucket_ms, env, key)
|
|
145
|
+
);
|
|
146
|
+
CREATE INDEX ix_rollup_5m_key ON rollup_5m (project_id, kind, key, bucket_ms);
|
|
147
|
+
CREATE TABLE rollup_1h (
|
|
148
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
149
|
+
n DOUBLE PRECISION NOT NULL, err DOUBLE PRECISION NOT NULL, sum_v DOUBLE PRECISION NOT NULL,
|
|
150
|
+
c0 DOUBLE PRECISION NOT NULL DEFAULT 0, c1 DOUBLE PRECISION NOT NULL DEFAULT 0, c2 DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
151
|
+
c3 DOUBLE PRECISION NOT NULL DEFAULT 0, c4 DOUBLE PRECISION NOT NULL DEFAULT 0, c5 DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
152
|
+
first_ms DOUBLE PRECISION NOT NULL, last_ms DOUBLE PRECISION NOT NULL, top_rank DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
153
|
+
top TEXT, ids TEXT NOT NULL DEFAULT '', PRIMARY KEY (project_id, kind, bucket_ms, env, key)
|
|
154
|
+
);
|
|
155
|
+
CREATE INDEX ix_rollup_1h_key ON rollup_1h (project_id, kind, key, bucket_ms);
|
|
156
|
+
CREATE TABLE hist_10s (
|
|
157
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
158
|
+
bin INTEGER NOT NULL, cnt DOUBLE PRECISION NOT NULL, PRIMARY KEY (project_id, kind, bucket_ms, env, key, bin)
|
|
159
|
+
);
|
|
160
|
+
CREATE TABLE hist_5m (
|
|
161
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
162
|
+
bin INTEGER NOT NULL, cnt DOUBLE PRECISION NOT NULL, PRIMARY KEY (project_id, kind, bucket_ms, env, key, bin)
|
|
163
|
+
);
|
|
164
|
+
CREATE TABLE hist_1h (
|
|
165
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, kind TEXT NOT NULL, key TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
166
|
+
bin INTEGER NOT NULL, cnt DOUBLE PRECISION NOT NULL, PRIMARY KEY (project_id, kind, bucket_ms, env, key, bin)
|
|
167
|
+
);
|
|
168
|
+
CREATE TABLE metric_series (
|
|
169
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, series_key TEXT NOT NULL, name TEXT NOT NULL, service TEXT NOT NULL, kind TEXT NOT NULL,
|
|
170
|
+
unit TEXT NOT NULL, description TEXT NOT NULL, monotonic BOOLEAN NOT NULL, temporality TEXT NOT NULL, attributes TEXT NOT NULL,
|
|
171
|
+
last_ms DOUBLE PRECISION NOT NULL, last_value DOUBLE PRECISION, last_hist TEXT, PRIMARY KEY (project_id, env, series_key)
|
|
172
|
+
);
|
|
173
|
+
CREATE INDEX ix_metric_series_name ON metric_series (project_id, name);
|
|
174
|
+
CREATE TABLE metric_10s (
|
|
175
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, series_key TEXT NOT NULL, name TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
176
|
+
cnt DOUBLE PRECISION NOT NULL, vsum DOUBLE PRECISION NOT NULL, vmin DOUBLE PRECISION, vmax DOUBLE PRECISION,
|
|
177
|
+
first_ms DOUBLE PRECISION NOT NULL, first_v DOUBLE PRECISION, last_ms DOUBLE PRECISION NOT NULL, last_v DOUBLE PRECISION,
|
|
178
|
+
rate_delta DOUBLE PRECISION NOT NULL DEFAULT 0, rate_ms DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
179
|
+
h_count DOUBLE PRECISION NOT NULL DEFAULT 0, h_sum DOUBLE PRECISION NOT NULL DEFAULT 0, h_min DOUBLE PRECISION, h_max DOUBLE PRECISION,
|
|
180
|
+
h_bounds TEXT, h_counts TEXT, PRIMARY KEY (project_id, name, bucket_ms, env, series_key)
|
|
181
|
+
);
|
|
182
|
+
CREATE TABLE metric_5m (
|
|
183
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, series_key TEXT NOT NULL, name TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
184
|
+
cnt DOUBLE PRECISION NOT NULL, vsum DOUBLE PRECISION NOT NULL, vmin DOUBLE PRECISION, vmax DOUBLE PRECISION,
|
|
185
|
+
first_ms DOUBLE PRECISION NOT NULL, first_v DOUBLE PRECISION, last_ms DOUBLE PRECISION NOT NULL, last_v DOUBLE PRECISION,
|
|
186
|
+
rate_delta DOUBLE PRECISION NOT NULL DEFAULT 0, rate_ms DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
187
|
+
h_count DOUBLE PRECISION NOT NULL DEFAULT 0, h_sum DOUBLE PRECISION NOT NULL DEFAULT 0, h_min DOUBLE PRECISION, h_max DOUBLE PRECISION,
|
|
188
|
+
h_bounds TEXT, h_counts TEXT, PRIMARY KEY (project_id, name, bucket_ms, env, series_key)
|
|
189
|
+
);
|
|
190
|
+
CREATE TABLE metric_1h (
|
|
191
|
+
project_id TEXT NOT NULL, env TEXT NOT NULL, series_key TEXT NOT NULL, name TEXT NOT NULL, bucket_ms DOUBLE PRECISION NOT NULL,
|
|
192
|
+
cnt DOUBLE PRECISION NOT NULL, vsum DOUBLE PRECISION NOT NULL, vmin DOUBLE PRECISION, vmax DOUBLE PRECISION,
|
|
193
|
+
first_ms DOUBLE PRECISION NOT NULL, first_v DOUBLE PRECISION, last_ms DOUBLE PRECISION NOT NULL, last_v DOUBLE PRECISION,
|
|
194
|
+
rate_delta DOUBLE PRECISION NOT NULL DEFAULT 0, rate_ms DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
195
|
+
h_count DOUBLE PRECISION NOT NULL DEFAULT 0, h_sum DOUBLE PRECISION NOT NULL DEFAULT 0, h_min DOUBLE PRECISION, h_max DOUBLE PRECISION,
|
|
196
|
+
h_bounds TEXT, h_counts TEXT, PRIMARY KEY (project_id, name, bucket_ms, env, series_key)
|
|
197
|
+
);
|
|
198
|
+
CREATE INDEX ix_metric_10s_time ON metric_10s (project_id, bucket_ms);
|
|
199
|
+
CREATE INDEX ix_metric_5m_time ON metric_5m (project_id, bucket_ms);
|
|
200
|
+
CREATE INDEX ix_metric_1h_time ON metric_1h (project_id, bucket_ms);
|
|
201
|
+
`,
|
|
202
|
+
AUTH_MIGRATION,
|
|
203
|
+
SSO_MIGRATION,
|
|
204
|
+
MAIL_MIGRATION,
|
|
205
|
+
NOTIFY_MIGRATION,
|
|
206
|
+
];
|
|
207
|
+
export const MIGRATIONS_TABLE = `CREATE TABLE IF NOT EXISTS wizelens_migrations (version INTEGER PRIMARY KEY, applied_ms DOUBLE PRECISION NOT NULL)`;
|
|
208
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,sHAAsH;AACtH,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ED;IACC;;;;;;;;;;CAUD;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGD;IACC,cAAc;IACd,aAAa;IACb,cAAc;IACd,gBAAgB;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,oHAAoH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
/** A failure that becomes one JSON error answer. */
|
|
3
|
+
export declare class HttpError extends Error {
|
|
4
|
+
readonly status: number;
|
|
5
|
+
constructor(status: number, message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare const fail: (status: number, message: string) => never;
|
|
8
|
+
export declare function sendJson(res: ServerResponse, status: number, value: unknown, headers?: Record<string, string | string[]>): void;
|
|
9
|
+
/** The body exactly as sent, for signature checks. Throws 413 past 1 MB. */
|
|
10
|
+
export declare function readRawBody(req: IncomingMessage): Promise<string>;
|
|
11
|
+
/** A small JSON body. Throws 400 for bad JSON or more than 1 MB. */
|
|
12
|
+
export declare function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>>;
|
|
13
|
+
export declare function cookieOf(req: IncomingMessage, name: string): string | undefined;
|
|
14
|
+
/** A cookie header: HttpOnly, SameSite=Lax, Secure on https. `maxAgeS` 0 deletes it. */
|
|
15
|
+
export declare const cookie: (name: string, value: string, maxAgeS: number, secure: boolean) => string;
|
|
16
|
+
export declare const bearerOf: (req: IncomingMessage) => string | undefined;
|
|
17
|
+
/** Read a string field. Throws 400 when it is required and missing. */
|
|
18
|
+
export declare function str(body: Record<string, unknown>, key: string, required?: boolean): string;
|
|
19
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,oDAAoD;AACpD,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAGhB;CACF;AAED,eAAO,MAAM,IAAI,WAAY,MAAM,WAAW,MAAM,KAAG,KAEtD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAM,GAAG,IAAI,CAGnI;AAED,4EAA4E;AAC5E,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAUvE;AAED,oEAAoE;AACpE,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASzF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,wFAAwF;AACxF,eAAO,MAAM,MAAM,SAAU,MAAM,SAAS,MAAM,WAAW,MAAM,UAAU,OAAO,KAAG,MACgC,CAAC;AAExH,eAAO,MAAM,QAAQ,QAAS,eAAe,KAAG,MAAM,GAAG,SAGxD,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,MAAM,CAKvF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const MAX_JSON = 1024 * 1024;
|
|
2
|
+
/** A failure that becomes one JSON error answer. */
|
|
3
|
+
export class HttpError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
constructor(status, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.status = status;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export const fail = (status, message) => {
|
|
11
|
+
throw new HttpError(status, message);
|
|
12
|
+
};
|
|
13
|
+
export function sendJson(res, status, value, headers = {}) {
|
|
14
|
+
res.writeHead(status, { "Content-Type": "application/json; charset=utf-8", "Cache-Control": "no-store", ...headers });
|
|
15
|
+
res.end(JSON.stringify(value));
|
|
16
|
+
}
|
|
17
|
+
/** The body exactly as sent, for signature checks. Throws 413 past 1 MB. */
|
|
18
|
+
export async function readRawBody(req) {
|
|
19
|
+
const chunks = [];
|
|
20
|
+
let size = 0;
|
|
21
|
+
for await (const chunk of req) {
|
|
22
|
+
const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
23
|
+
size += buf.length;
|
|
24
|
+
if (size > MAX_JSON)
|
|
25
|
+
fail(413, "The body is too large.");
|
|
26
|
+
chunks.push(buf);
|
|
27
|
+
}
|
|
28
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
29
|
+
}
|
|
30
|
+
/** A small JSON body. Throws 400 for bad JSON or more than 1 MB. */
|
|
31
|
+
export async function readJsonBody(req) {
|
|
32
|
+
const text = await readRawBody(req);
|
|
33
|
+
try {
|
|
34
|
+
const v = text ? JSON.parse(text) : {};
|
|
35
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : fail(400, "Send a JSON object.");
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err instanceof HttpError)
|
|
39
|
+
throw err;
|
|
40
|
+
return fail(400, "The body is not valid JSON.");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function cookieOf(req, name) {
|
|
44
|
+
for (const part of String(req.headers.cookie ?? "").split(";")) {
|
|
45
|
+
const [k, ...v] = part.trim().split("=");
|
|
46
|
+
if (k === name)
|
|
47
|
+
return decodeURIComponent(v.join("="));
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
/** A cookie header: HttpOnly, SameSite=Lax, Secure on https. `maxAgeS` 0 deletes it. */
|
|
52
|
+
export const cookie = (name, value, maxAgeS, secure) => `${name}=${encodeURIComponent(value)}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAgeS}${secure ? "; Secure" : ""}`;
|
|
53
|
+
export const bearerOf = (req) => {
|
|
54
|
+
const auth = String(req.headers.authorization ?? "");
|
|
55
|
+
return auth.toLowerCase().startsWith("bearer ") ? auth.slice(7).trim() || undefined : undefined;
|
|
56
|
+
};
|
|
57
|
+
/** Read a string field. Throws 400 when it is required and missing. */
|
|
58
|
+
export function str(body, key, required = true) {
|
|
59
|
+
const v = body[key];
|
|
60
|
+
if (typeof v === "string" && v.trim())
|
|
61
|
+
return v;
|
|
62
|
+
if (required)
|
|
63
|
+
fail(400, `"${key}" is required.`);
|
|
64
|
+
return "";
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** A fixed-window counter per key: at most `limit` calls per `windowMs`. In memory, per process. */
|
|
2
|
+
export declare class RateLimiter {
|
|
3
|
+
#private;
|
|
4
|
+
private readonly limit;
|
|
5
|
+
private readonly windowMs;
|
|
6
|
+
private readonly now;
|
|
7
|
+
constructor(limit: number, windowMs: number, now?: () => number);
|
|
8
|
+
/** True when the call is allowed. */
|
|
9
|
+
take(key: string): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limiter.d.ts","sourceRoot":"","sources":["../../src/http/limiter.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,qBAAa,WAAW;;IAIpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHtB,YACmB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,MAAiB,EAC3C;IAEJ,qCAAqC;IACrC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUzB;CAKF"}
|