@wizeworks/lens-cloud 0.3.0-alpha.1 → 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/README.md +57 -5
- package/dist/alerts/evaluate.d.ts.map +1 -1
- package/dist/alerts/evaluate.js +17 -2
- package/dist/alerts/evaluate.js.map +1 -1
- package/dist/alerts/notify.d.ts +13 -2
- package/dist/alerts/notify.d.ts.map +1 -1
- package/dist/alerts/notify.js +22 -16
- package/dist/alerts/notify.js.map +1 -1
- package/dist/app.d.ts +10 -2
- package/dist/app.d.ts.map +1 -1
- 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 +0 -5
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +3 -20
- package/dist/auth/crypto.js.map +1 -1
- 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 +8 -3
- package/dist/auth/principal.d.ts.map +1 -1
- package/dist/auth/principal.js +13 -8
- package/dist/auth/principal.js.map +1 -1
- package/dist/auth/roles.d.ts +43 -3
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +15 -6
- package/dist/auth/roles.js.map +1 -1
- 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 +1 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +55 -14
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +18 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +26 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -1
- package/dist/db/db.d.ts +5 -2
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +15 -8
- package/dist/db/db.js.map +1 -1
- package/dist/db/migrate.d.ts +2 -2
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +15 -5
- package/dist/db/migrate.js.map +1 -1
- 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.map +1 -1
- package/dist/db/schema.js +8 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/http/http.d.ts +2 -0
- package/dist/http/http.d.ts.map +1 -1
- package/dist/http/http.js +7 -3
- package/dist/http/http.js.map +1 -1
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +14 -3
- package/dist/jobs.js.map +1 -1
- 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 +6 -2
- package/dist/repo/alerts.d.ts.map +1 -1
- package/dist/repo/alerts.js.map +1 -1
- 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/orgs.d.ts +15 -25
- package/dist/repo/orgs.d.ts.map +1 -1
- package/dist/repo/orgs.js +18 -60
- package/dist/repo/orgs.js.map +1 -1
- 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/users.d.ts +5 -16
- package/dist/repo/users.d.ts.map +1 -1
- package/dist/repo/users.js +2 -60
- package/dist/repo/users.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +23 -6
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +4 -2
- package/dist/routes/index.js.map +1 -1
- 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/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.map +1 -1
- package/dist/routes/orgs.js +30 -53
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +4 -3
- package/dist/routes/projects.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -14
- package/dist/server.js.map +1 -1
- package/package.json +19 -6
- package/dist/routes/auth.d.ts +0 -4
- package/dist/routes/auth.d.ts.map +0 -1
- package/dist/routes/auth.js +0 -106
- package/dist/routes/auth.js.map +0 -1
package/dist/repo/users.js
CHANGED
|
@@ -1,65 +1,7 @@
|
|
|
1
|
-
import { checkPassword, hashPassword, hashToken, newId, newToken } from "../auth/crypto.js";
|
|
2
|
-
const SESSION_MS = 30 * 24 * 60 * 60_000;
|
|
3
|
-
export const normalizeEmail = (email) => email.trim().toLowerCase();
|
|
4
|
-
const isEmail = (email) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) && email.length <= 200;
|
|
5
|
-
/** Check sign-up input. Returns an error message, or null when it is fine. */
|
|
6
|
-
export function signUpProblem(email, password, name) {
|
|
7
|
-
if (!isEmail(normalizeEmail(email)))
|
|
8
|
-
return "Enter a valid email address.";
|
|
9
|
-
if (password.length < 10)
|
|
10
|
-
return "Use a password of at least 10 characters.";
|
|
11
|
-
if (password.length > 200)
|
|
12
|
-
return "Use a password of at most 200 characters.";
|
|
13
|
-
if (!name.trim() || name.length > 100)
|
|
14
|
-
return "Enter your name (at most 100 characters).";
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
1
|
export async function userCount(q) {
|
|
18
2
|
const [row] = await q.query("SELECT count(*)::int AS n FROM users");
|
|
19
3
|
return row?.n ?? 0;
|
|
20
4
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
await q.query("INSERT INTO users (id, email, name, password_hash, created_ms) VALUES ($1, $2, $3, $4, $5)", [
|
|
24
|
-
user.id,
|
|
25
|
-
user.email,
|
|
26
|
-
user.name,
|
|
27
|
-
await hashPassword(password),
|
|
28
|
-
now,
|
|
29
|
-
]);
|
|
30
|
-
return user;
|
|
31
|
-
}
|
|
32
|
-
export async function userByEmail(q, email) {
|
|
33
|
-
const [row] = await q.query("SELECT id, email, name FROM users WHERE email = $1", [normalizeEmail(email)]);
|
|
34
|
-
return row;
|
|
35
|
-
}
|
|
36
|
-
/** The user when the email and password match. Takes the same time when the email is unknown. */
|
|
37
|
-
export async function verifyLogin(q, email, password) {
|
|
38
|
-
const [row] = await q.query("SELECT id, email, name, password_hash FROM users WHERE email = $1", [
|
|
39
|
-
normalizeEmail(email),
|
|
40
|
-
]);
|
|
41
|
-
const ok = await checkPassword(password, row?.password_hash ?? "scrypt$AAAAAAAAAAAAAAAAAAAAAA$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
|
|
42
|
-
return row && ok ? { id: row.id, email: row.email, name: row.name } : undefined;
|
|
43
|
-
}
|
|
44
|
-
export async function setPassword(q, userId, password) {
|
|
45
|
-
await q.query("UPDATE users SET password_hash = $1 WHERE id = $2", [await hashPassword(password), userId]);
|
|
46
|
-
await q.query("DELETE FROM sessions WHERE user_id = $1", [userId]);
|
|
47
|
-
}
|
|
48
|
-
/** A new session. Returns the token for the cookie; only its hash is stored. */
|
|
49
|
-
export async function createSession(q, userId, now) {
|
|
50
|
-
const token = newToken("session");
|
|
51
|
-
const expiresMs = now + SESSION_MS;
|
|
52
|
-
await q.query("INSERT INTO sessions (token_hash, user_id, created_ms, expires_ms) VALUES ($1, $2, $3, $4)", [hashToken(token), userId, now, expiresMs]);
|
|
53
|
-
return { token, expiresMs };
|
|
54
|
-
}
|
|
55
|
-
export async function userBySession(q, token, now) {
|
|
56
|
-
const [row] = await q.query(`SELECT u.id, u.email, u.name FROM sessions s JOIN users u ON u.id = s.user_id WHERE s.token_hash = $1 AND s.expires_ms > $2`, [hashToken(token), now]);
|
|
57
|
-
return row;
|
|
58
|
-
}
|
|
59
|
-
export async function endSession(q, token) {
|
|
60
|
-
await q.query("DELETE FROM sessions WHERE token_hash = $1", [hashToken(token)]);
|
|
61
|
-
}
|
|
62
|
-
export async function pruneSessions(q, now) {
|
|
63
|
-
await q.query("DELETE FROM sessions WHERE expires_ms <= $1", [now]);
|
|
64
|
-
}
|
|
5
|
+
/** Emails of an organization's members, for alert emails. When mail really goes out, only confirmed ones. */
|
|
6
|
+
export const memberEmails = async (q, orgId, confirmedOnly) => (await q.query("SELECT u.email FROM members m JOIN users u ON u.id = m.user_id WHERE m.org_id = $1 AND (u.email_verified OR NOT $2)", [orgId, confirmedOnly])).map((r) => r.email);
|
|
65
7
|
//# sourceMappingURL=users.js.map
|
package/dist/repo/users.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/repo/users.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/repo/users.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY;IAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAgB,sCAAsC,CAAC,CAAC;IACnF,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,CAAY,EAAE,KAAa,EAAE,aAAsB,EAAqB,EAAE,CAC3G,CAAC,MAAM,CAAC,CAAC,KAAK,CAAoB,qHAAqH,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CACnL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsGhD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAMhD"}
|
package/dist/routes/alerts.js
CHANGED
|
@@ -3,15 +3,32 @@ import { notify } from "../alerts/evaluate.js";
|
|
|
3
3
|
import { checkTarget } from "../alerts/notify.js";
|
|
4
4
|
import { requireProject } from "../auth/principal.js";
|
|
5
5
|
import { fail, readJsonBody, sendJson, str } from "../http/http.js";
|
|
6
|
+
import { memberEmails } from "../repo/users.js";
|
|
6
7
|
import { createRule, deleteRule, listEvents, listRules, ruleById, updateRule } from "../repo/alerts.js";
|
|
7
8
|
const WINDOWS = [5, 15, 60, 360, 1440].map((m) => m * 60_000);
|
|
8
9
|
const MAX_CHANNELS = 5;
|
|
9
|
-
|
|
10
|
+
const MAX_EMAILS = 20;
|
|
11
|
+
/** Email goes only to members of the organization with a confirmed address, so a rule cannot send mail to strangers. */
|
|
12
|
+
async function emailChannel(ctx, orgId, to) {
|
|
13
|
+
const allowed = new Set(await memberEmails(ctx.app.db, orgId, ctx.app.mailer.live));
|
|
14
|
+
const list = Array.isArray(to) ? [...new Set(to.filter((x) => typeof x === "string").map((x) => x.trim().toLowerCase()))] : [];
|
|
15
|
+
if (list.length === 0 || list.length > MAX_EMAILS)
|
|
16
|
+
fail(400, `Send to 1 to ${MAX_EMAILS} email addresses.`);
|
|
17
|
+
const stranger = list.find((e) => !allowed.has(e));
|
|
18
|
+
if (stranger)
|
|
19
|
+
fail(400, `${stranger} is not a member of this organization with a confirmed email.`);
|
|
20
|
+
return { kind: "email", to: list };
|
|
21
|
+
}
|
|
22
|
+
async function channelsOf(ctx, orgId, raw) {
|
|
10
23
|
const list = Array.isArray(raw) ? raw.slice(0, MAX_CHANNELS) : [];
|
|
11
24
|
const out = [];
|
|
12
25
|
for (const c of list) {
|
|
26
|
+
if (c.kind === "email") {
|
|
27
|
+
out.push(await emailChannel(ctx, orgId, c.to));
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
13
30
|
if ((c.kind !== "webhook" && c.kind !== "slack") || typeof c.url !== "string")
|
|
14
|
-
return fail(400, "Each channel needs kind (webhook or
|
|
31
|
+
return fail(400, "Each channel needs kind (webhook, slack, or email) and url (or to).");
|
|
15
32
|
const problem = await checkTarget(c.url, ctx.app.config.allowPrivateWebhooks);
|
|
16
33
|
if (problem)
|
|
17
34
|
fail(400, `${c.url}: ${problem}`);
|
|
@@ -36,7 +53,7 @@ function metricPart(b) {
|
|
|
36
53
|
return { metric: "metric", metricName: name, metricStat: stat, metricService: service };
|
|
37
54
|
}
|
|
38
55
|
/** Check a rule from the request body. A change sends only what it changes: the rest comes from `current`. */
|
|
39
|
-
async function ruleInput(ctx, current) {
|
|
56
|
+
async function ruleInput(ctx, orgId, current) {
|
|
40
57
|
const b = { ...current, ...(await readJsonBody(ctx.req)) };
|
|
41
58
|
const metric = metricPart(b);
|
|
42
59
|
if (b.op !== ">" && b.op !== "<")
|
|
@@ -54,7 +71,7 @@ async function ruleInput(ctx, current) {
|
|
|
54
71
|
threshold,
|
|
55
72
|
windowMs,
|
|
56
73
|
env: typeof b.env === "string" ? b.env.slice(0, 50) : "",
|
|
57
|
-
channels: await channelsOf(ctx, b.channels),
|
|
74
|
+
channels: await channelsOf(ctx, orgId, b.channels),
|
|
58
75
|
enabled: b.enabled !== false,
|
|
59
76
|
};
|
|
60
77
|
}
|
|
@@ -64,7 +81,7 @@ async function list(ctx) {
|
|
|
64
81
|
}
|
|
65
82
|
async function create(ctx) {
|
|
66
83
|
const { project, actor } = await requireProject(ctx, ctx.params.project, "write");
|
|
67
|
-
const id = await createRule(ctx.app.db, project.id, await ruleInput(ctx), actor, ctx.app.config.now());
|
|
84
|
+
const id = await createRule(ctx.app.db, project.id, await ruleInput(ctx, project.orgId), actor, ctx.app.config.now());
|
|
68
85
|
sendJson(ctx.res, 201, await ruleById(ctx.app.db, project.id, id));
|
|
69
86
|
}
|
|
70
87
|
async function change(ctx) {
|
|
@@ -72,7 +89,7 @@ async function change(ctx) {
|
|
|
72
89
|
const current = await ruleById(ctx.app.db, project.id, ctx.params.id);
|
|
73
90
|
if (!current)
|
|
74
91
|
fail(404, "Alert rule not found.");
|
|
75
|
-
await updateRule(ctx.app.db, project.id, ctx.params.id, await ruleInput(ctx, current));
|
|
92
|
+
await updateRule(ctx.app.db, project.id, ctx.params.id, await ruleInput(ctx, project.orgId, current));
|
|
76
93
|
sendJson(ctx.res, 200, await ruleById(ctx.app.db, project.id, ctx.params.id));
|
|
77
94
|
}
|
|
78
95
|
async function remove(ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAgB,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAkB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEtI,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC9D,MAAM,YAAY,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAW3C,4GAA4G;AAC5G,wBAAgB,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,CAYvC"}
|
package/dist/routes/index.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { Router } from "../http/router.js";
|
|
2
2
|
import { alertRoutes } from "./alerts.js";
|
|
3
|
-
import {
|
|
3
|
+
import { meRoutes } from "./me.js";
|
|
4
4
|
import { mcpRoutes } from "./mcp.js";
|
|
5
5
|
import { shareRoutes } from "./shares.js";
|
|
6
6
|
import { dataRoutes } from "./data.js";
|
|
7
7
|
import { modelRoutes } from "./models.js";
|
|
8
|
+
import { notifyRoutes } from "./notify.js";
|
|
8
9
|
import { orgRoutes } from "./orgs.js";
|
|
9
10
|
import { projectRoutes } from "./projects.js";
|
|
10
11
|
/** Every route below `/_wizelens/`, except ingest and OTLP (they use ingest keys and are matched first). */
|
|
11
12
|
export function allRoutes() {
|
|
12
13
|
const r = new Router();
|
|
13
|
-
|
|
14
|
+
meRoutes(r);
|
|
15
|
+
notifyRoutes(r);
|
|
14
16
|
orgRoutes(r);
|
|
15
17
|
projectRoutes(r);
|
|
16
18
|
dataRoutes(r);
|
package/dist/routes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,4GAA4G;AAC5G,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,GAAG,IAAI,MAAM,EAAO,CAAC;IAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC;IACZ,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,SAAS,CAAC,CAAC,CAAC,CAAC;IACb,aAAa,CAAC,CAAC,CAAC,CAAC;IACjB,UAAU,CAAC,CAAC,CAAC,CAAC;IACd,WAAW,CAAC,CAAC,CAAC,CAAC;IACf,WAAW,CAAC,CAAC,CAAC,CAAC;IACf,WAAW,CAAC,CAAC,CAAC,CAAC;IACf,SAAS,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../src/routes/me.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqChD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAE7C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { blockingOrgs, ownedOrgs } from "../auth/delete-user.js";
|
|
2
|
+
import { sessionOf } from "../auth/principal.js";
|
|
3
|
+
import { fail, sendJson } from "../http/http.js";
|
|
4
|
+
import { orgsOfUser } from "../repo/orgs.js";
|
|
5
|
+
import { listProjects } from "../repo/projects.js";
|
|
6
|
+
import { userCount } from "../repo/users.js";
|
|
7
|
+
/** The signed-in person's organizations, each with its projects. */
|
|
8
|
+
async function orgsWithProjects(ctx, userId) {
|
|
9
|
+
const orgs = await orgsOfUser(ctx.app.db, userId);
|
|
10
|
+
return Promise.all(orgs.map(async (o) => ({ ...o, projects: await listProjects(ctx.app.db, o.id) })));
|
|
11
|
+
}
|
|
12
|
+
/** True once any organization has an SSO provider with a proven domain, so the sign-in page offers single sign-on. */
|
|
13
|
+
async function ssoReady(ctx) {
|
|
14
|
+
const [row] = await ctx.app.db.query("SELECT EXISTS (SELECT 1 FROM sso_providers WHERE domain_verified) AS ready");
|
|
15
|
+
return row?.ready === true;
|
|
16
|
+
}
|
|
17
|
+
/** Who is signed in, whether setup is needed, how sign-up works, whether mail goes out, and whether SSO is on. Sign-in itself is Better Auth's (api/auth/). */
|
|
18
|
+
async function me(ctx) {
|
|
19
|
+
const s = await sessionOf(ctx);
|
|
20
|
+
const base = { signedIn: !!s, needsSetup: (await userCount(ctx.app.db)) === 0, signup: ctx.app.config.signup, mail: ctx.app.mailer.live, sso: await ssoReady(ctx) };
|
|
21
|
+
if (!s)
|
|
22
|
+
return sendJson(ctx.res, 200, base);
|
|
23
|
+
const owned = await ownedOrgs(ctx.app.db, s.user.id);
|
|
24
|
+
sendJson(ctx.res, 200, { ...base, user: s.user, sessionId: s.sessionId, orgs: await orgsWithProjects(ctx, s.user.id), blockingOrgs: blockingOrgs(owned).map((o) => o.name) });
|
|
25
|
+
}
|
|
26
|
+
/** Who sent an invite and for which email, so the sign-up form can show it. The id is the link's secret. */
|
|
27
|
+
async function invitePreview(ctx) {
|
|
28
|
+
const [row] = await ctx.app.db.query(`SELECT o.name AS "orgName", i.email, i.role, u.name AS inviter FROM invites i JOIN orgs o ON o.id = i.org_id JOIN users u ON u.id = i.inviter_id
|
|
29
|
+
WHERE i.id = $1 AND i.status = 'pending' AND i.expires_at > now()`, [ctx.params.id]);
|
|
30
|
+
if (!row)
|
|
31
|
+
return fail(404, "This invite link is not valid any more.");
|
|
32
|
+
sendJson(ctx.res, 200, row);
|
|
33
|
+
}
|
|
34
|
+
export function meRoutes(r) {
|
|
35
|
+
r.on("GET", "api/me", me).on("GET", "api/invites/:id", invitePreview);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=me.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"me.js","sourceRoot":"","sources":["../../src/routes/me.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/routes/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoDhD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAEjD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { requireUser } from "../auth/principal.js";
|
|
2
|
+
import { fail, readJsonBody, sendJson } from "../http/http.js";
|
|
3
|
+
import { DEFAULT_DIGEST, DIGEST_PERIODS, digestPrefsOf, prefsOf, saveDigestPref, savePrefs } from "../repo/mail-prefs.js";
|
|
4
|
+
const validZone = (tz) => {
|
|
5
|
+
try {
|
|
6
|
+
new Intl.DateTimeFormat("en-US", { timeZone: tz });
|
|
7
|
+
return tz.length <= 64;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
/** Projects this person can see, each with its digest choices. */
|
|
14
|
+
async function projectsOf(ctx, userId) {
|
|
15
|
+
const rows = await ctx.app.db.query("SELECT p.id, p.name, p.org_id, o.name AS org, m.role FROM members m JOIN orgs o ON o.id = m.org_id JOIN projects p ON p.org_id = o.id WHERE m.user_id = $1 ORDER BY o.name, p.name", [userId]);
|
|
16
|
+
const prefs = await digestPrefsOf(ctx.app.db, userId);
|
|
17
|
+
return rows.map((r) => ({ projectId: r.id, project: r.name, orgId: r.org_id, org: r.org, role: r.role, ...(prefs.get(r.id) ?? DEFAULT_DIGEST) }));
|
|
18
|
+
}
|
|
19
|
+
/** `GET api/me/notifications`: which emails this person gets. Security notices are always on, so they are not listed. */
|
|
20
|
+
async function show(ctx) {
|
|
21
|
+
const user = await requireUser(ctx);
|
|
22
|
+
sendJson(ctx.res, 200, { mail: ctx.app.mailer.live, ...(await prefsOf(ctx.app.db, user.id)), projects: await projectsOf(ctx, user.id) });
|
|
23
|
+
}
|
|
24
|
+
function prefsPatch(b) {
|
|
25
|
+
const out = {};
|
|
26
|
+
for (const k of ["team", "health", "digests"])
|
|
27
|
+
if (typeof b[k] === "boolean")
|
|
28
|
+
out[k] = b[k];
|
|
29
|
+
if (b.timeZone !== undefined)
|
|
30
|
+
out.timeZone = typeof b.timeZone === "string" && validZone(b.timeZone) ? b.timeZone : fail(400, "Pick a time zone such as America/Los_Angeles.");
|
|
31
|
+
if (b.digestHour !== undefined)
|
|
32
|
+
out.digestHour = Number.isInteger(b.digestHour) && Number(b.digestHour) >= 0 && Number(b.digestHour) <= 23 ? Number(b.digestHour) : fail(400, "Pick an hour from 0 to 23.");
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/** `PATCH api/me/notifications`: change only the fields sent. Projects must be ones this person can see. */
|
|
36
|
+
async function change(ctx) {
|
|
37
|
+
const user = await requireUser(ctx);
|
|
38
|
+
const body = await readJsonBody(ctx.req);
|
|
39
|
+
const patch = prefsPatch(body);
|
|
40
|
+
const visible = new Set((await projectsOf(ctx, user.id)).map((p) => p.projectId));
|
|
41
|
+
const projects = Array.isArray(body.projects) ? body.projects : [];
|
|
42
|
+
if (projects.some((p) => typeof p?.projectId !== "string" || !visible.has(p.projectId)))
|
|
43
|
+
fail(404, "Project not found.");
|
|
44
|
+
if (Object.keys(patch).length)
|
|
45
|
+
await savePrefs(ctx.app.db, user.id, patch);
|
|
46
|
+
for (const p of projects) {
|
|
47
|
+
const periods = Object.fromEntries(DIGEST_PERIODS.filter((k) => typeof p[k] === "boolean").map((k) => [k, p[k]]));
|
|
48
|
+
await saveDigestPref(ctx.app.db, user.id, p.projectId, periods);
|
|
49
|
+
}
|
|
50
|
+
await show(ctx);
|
|
51
|
+
}
|
|
52
|
+
export function notifyRoutes(r) {
|
|
53
|
+
r.on("GET", "api/me/notifications", show).on("PATCH", "api/me/notifications", change);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/routes/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/routes/orgs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/routes/orgs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA+DhD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAM9C"}
|
package/dist/routes/orgs.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { isAPIError } from "better-auth/api";
|
|
2
|
+
import { fromNodeHeaders } from "better-auth/node";
|
|
3
|
+
import { createOrgFor } from "../auth/auth.js";
|
|
1
4
|
import { requireOrg, requireUser } from "../auth/principal.js";
|
|
2
|
-
import { canGrant, isRole } from "../auth/roles.js";
|
|
3
5
|
import { fail, readJsonBody, sendJson, str } from "../http/http.js";
|
|
4
6
|
import { audit, listAudit } from "../repo/audit.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
+
import { orgDeletionNotice } from "../notify/team.js";
|
|
8
|
+
import { deleteOrgEverything, listMembers, pendingInvites, setRetention } from "../repo/orgs.js";
|
|
9
|
+
import { listKeys, listProjects } from "../repo/projects.js";
|
|
10
|
+
// Members, roles, and invites change through Better Auth (`api/auth/organization/*`). These routes add what it does not have.
|
|
7
11
|
const now = (ctx) => ctx.app.config.now();
|
|
8
12
|
async function overview(ctx) {
|
|
9
13
|
const { role } = await requireOrg(ctx, ctx.params.org, "read");
|
|
@@ -14,20 +18,14 @@ async function overview(ctx) {
|
|
|
14
18
|
role,
|
|
15
19
|
members: await listMembers(db, id),
|
|
16
20
|
projects: await listProjects(db, id),
|
|
17
|
-
invites: manage ? await pendingInvites(db, id
|
|
21
|
+
invites: manage ? await pendingInvites(db, id) : [],
|
|
18
22
|
keys: manage ? await listKeys(db, id) : [],
|
|
19
23
|
});
|
|
20
24
|
}
|
|
21
25
|
async function newOrg(ctx) {
|
|
22
26
|
const user = await requireUser(ctx);
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
const o = await createOrg(q, str(body, "name"), user.id, now(ctx), ctx.app.config.retentionDays);
|
|
26
|
-
await createProject(q, o.id, "My app", now(ctx));
|
|
27
|
-
await audit(q, o.id, `user:${user.id}`, "org.create", { name: o.name }, now(ctx));
|
|
28
|
-
return o;
|
|
29
|
-
});
|
|
30
|
-
sendJson(ctx.res, 201, org);
|
|
27
|
+
const name = str(await readJsonBody(ctx.req), "name");
|
|
28
|
+
sendJson(ctx.res, 201, await createOrgFor(ctx.app.auth, { db: ctx.app.db, retentionDays: ctx.app.config.retentionDays }, user.id, name));
|
|
31
29
|
}
|
|
32
30
|
async function changeOrg(ctx) {
|
|
33
31
|
const { user } = await requireOrg(ctx, ctx.params.org, "manage");
|
|
@@ -35,48 +33,29 @@ async function changeOrg(ctx) {
|
|
|
35
33
|
const days = body.retentionDays;
|
|
36
34
|
if (days !== undefined && (!Number.isInteger(days) || days < 1 || days > 400))
|
|
37
35
|
fail(400, "Retention is 1 to 400 days.");
|
|
38
|
-
const name = typeof body.name === "string" && body.name.trim() ? body.name : undefined;
|
|
39
|
-
|
|
36
|
+
const name = typeof body.name === "string" && body.name.trim() ? body.name.trim().slice(0, 100) : undefined;
|
|
37
|
+
if (name)
|
|
38
|
+
await ctx.app.db.query("UPDATE orgs SET name = $1 WHERE id = $2", [name, ctx.params.org]);
|
|
39
|
+
if (days !== undefined)
|
|
40
|
+
await setRetention(ctx.app.db, ctx.params.org, days);
|
|
40
41
|
await audit(ctx.app.db, ctx.params.org, `user:${user.id}`, "org.update", { name, retentionDays: days }, now(ctx));
|
|
41
42
|
sendJson(ctx.res, 200, { ok: true });
|
|
42
43
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const email = str(body, "email");
|
|
50
|
-
const token = await createInvite(ctx.app.db, ctx.params.org, email, target, user.id, now(ctx));
|
|
51
|
-
await audit(ctx.app.db, ctx.params.org, `user:${user.id}`, "member.invite", { email, role: target }, now(ctx));
|
|
52
|
-
sendJson(ctx.res, 201, { url: `${ctx.app.baseUrl(ctx.req)}/_wizelens/#/join/${token}`, expiresInDays: 7 });
|
|
53
|
-
}
|
|
54
|
-
async function applyMemberChange(ctx, actorRole, targetRole, lastOwner) {
|
|
55
|
-
const { org, userId } = ctx.params;
|
|
56
|
-
if (ctx.req.method === "DELETE") {
|
|
57
|
-
if (lastOwner)
|
|
58
|
-
fail(409, "An organization needs at least one owner.");
|
|
59
|
-
return removeMember(ctx.app.db, org, userId);
|
|
44
|
+
/** Owners only, with their password again: the organization and all of its data go at once. */
|
|
45
|
+
async function deleteOrg(ctx) {
|
|
46
|
+
const { user } = await requireOrg(ctx, ctx.params.org, "own");
|
|
47
|
+
const password = str(await readJsonBody(ctx.req), "password");
|
|
48
|
+
try {
|
|
49
|
+
await ctx.app.auth.api.verifyPassword({ body: { password }, headers: fromNodeHeaders(ctx.req.headers) });
|
|
60
50
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
async function changeMember(ctx) {
|
|
70
|
-
const { user, role } = await requireOrg(ctx, ctx.params.org, "manage");
|
|
71
|
-
const { org, userId } = ctx.params;
|
|
72
|
-
const target = (await listMembers(ctx.app.db, org)).find((m) => m.userId === userId);
|
|
73
|
-
if (!target)
|
|
74
|
-
return fail(404, "Member not found.");
|
|
75
|
-
if (!canGrant(role, target.role))
|
|
76
|
-
fail(403, "You cannot change someone above your role.");
|
|
77
|
-
const lastOwner = target.role === "owner" && (await ownerCount(ctx.app.db, org)) === 1;
|
|
78
|
-
await applyMemberChange(ctx, role, target.role, lastOwner);
|
|
79
|
-
await audit(ctx.app.db, org, `user:${user.id}`, ctx.req.method === "DELETE" ? "member.remove" : "member.role", { userId }, now(ctx));
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (isAPIError(err))
|
|
53
|
+
fail(400, "The password is not right.");
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
const tell = await orgDeletionNotice(ctx.app, ctx.params.org, user.id);
|
|
57
|
+
await ctx.app.db.tx((q) => deleteOrgEverything(q, ctx.params.org));
|
|
58
|
+
tell();
|
|
80
59
|
sendJson(ctx.res, 200, { ok: true });
|
|
81
60
|
}
|
|
82
61
|
async function auditLog(ctx) {
|
|
@@ -88,9 +67,7 @@ export function orgRoutes(r) {
|
|
|
88
67
|
r.on("POST", "api/orgs", newOrg)
|
|
89
68
|
.on("GET", "api/orgs/:org", overview)
|
|
90
69
|
.on("PATCH", "api/orgs/:org", changeOrg)
|
|
91
|
-
.on("
|
|
92
|
-
.on("PATCH", "api/orgs/:org/members/:userId", changeMember)
|
|
93
|
-
.on("DELETE", "api/orgs/:org/members/:userId", changeMember)
|
|
70
|
+
.on("DELETE", "api/orgs/:org", deleteOrg)
|
|
94
71
|
.on("GET", "api/orgs/:org/audit", auditLog);
|
|
95
72
|
}
|
|
96
73
|
//# sourceMappingURL=orgs.js.map
|
package/dist/routes/orgs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/routes/orgs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/routes/orgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAgDhD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAMlD"}
|
package/dist/routes/projects.js
CHANGED
|
@@ -13,11 +13,12 @@ async function newProject(ctx) {
|
|
|
13
13
|
async function dropProject(ctx) {
|
|
14
14
|
const { org, project } = ctx.params;
|
|
15
15
|
const { user } = await requireOrg(ctx, org, "manage");
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const found = await projectInOrg(ctx.app.db, org, project);
|
|
17
|
+
if (!found)
|
|
18
|
+
return fail(404, "Project not found.");
|
|
18
19
|
const clearOnly = ctx.req.method === "POST";
|
|
19
20
|
await ctx.app.db.tx((q) => (clearOnly ? deleteProjectData(q, project) : deleteProject(q, project)));
|
|
20
|
-
await audit(ctx.app.db, org, `user:${user.id}`, clearOnly ? "project.clear" : "project.delete", { projectId: project }, now(ctx));
|
|
21
|
+
await audit(ctx.app.db, org, `user:${user.id}`, clearOnly ? "project.clear" : "project.delete", { projectId: project, name: found.name }, now(ctx));
|
|
21
22
|
sendJson(ctx.res, 200, { ok: true });
|
|
22
23
|
}
|
|
23
24
|
/** Ingest keys belong to one project. Read keys name the projects they may read. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAgB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEtJ,MAAM,GAAG,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAE/C,KAAK,UAAU,UAAU,CAAC,GAAQ;IAChC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAI,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,GAAI,EAAE,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/G,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,GAAI,EAAE,QAAQ,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3H,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,WAAW,CAAC,GAAQ;IACjC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAA0C,CAAC;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtD,
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export interface Cloud {
|
|
|
6
6
|
readonly server: Server;
|
|
7
7
|
readonly app: CloudApp;
|
|
8
8
|
listen(): Promise<string>;
|
|
9
|
+
/** The link that makes the first account, while no account exists. */
|
|
10
|
+
setupLink(): string | null;
|
|
9
11
|
close(): Promise<void>;
|
|
10
12
|
}
|
|
11
13
|
/** Open the database, bring its schema up to date, and build the server. Call `listen()` to start. */
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,KAAK,EAAE,QAAQ,EAAO,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,KAAK,EAAE,QAAQ,EAAO,MAAM,UAAU,CAAC;AAK9C,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,aAAa,CAAC;AAgB/D,eAAO,MAAM,aAAa,EAAE,MAAoE,CAAC;AAGjG,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,sEAAsE;IACtE,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAiDD,sGAAsG;AACtG,wBAAsB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,CAiD5E"}
|