@snagset/server 0.1.2 → 0.1.4
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/dist/app.js +45 -6
- package/dist/app.js.map +1 -1
- package/dist/bin.js +1 -1
- package/dist/db/scope.js +23 -0
- package/dist/db/scope.js.map +1 -0
- package/dist/instance/mcpHttp.js +42 -0
- package/dist/instance/mcpHttp.js.map +1 -0
- package/dist/mail/unsubscribe.js +5 -4
- package/dist/mail/unsubscribe.js.map +1 -1
- package/dist/orgs.js +87 -0
- package/dist/orgs.js.map +1 -0
- package/dist/plan.js +82 -0
- package/dist/plan.js.map +1 -0
- package/dist/projectCache.js +3 -2
- package/dist/projectCache.js.map +1 -1
- package/dist/reviewerCache.js +3 -2
- package/dist/reviewerCache.js.map +1 -1
- package/dist/routes/account.js +5 -4
- package/dist/routes/account.js.map +1 -1
- package/dist/routes/anchorReports.js +3 -2
- package/dist/routes/anchorReports.js.map +1 -1
- package/dist/routes/attachments.js +17 -6
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/commentEdit.js +3 -2
- package/dist/routes/commentEdit.js.map +1 -1
- package/dist/routes/comments.js +7 -6
- package/dist/routes/comments.js.map +1 -1
- package/dist/routes/cors.js +5 -4
- package/dist/routes/cors.js.map +1 -1
- package/dist/routes/instance.js +29 -0
- package/dist/routes/instance.js.map +1 -1
- package/dist/routes/integrations.js +10 -5
- package/dist/routes/integrations.js.map +1 -1
- package/dist/routes/mcp.js +45 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/mcpAuth.js +59 -3
- package/dist/routes/mcpAuth.js.map +1 -1
- package/dist/routes/mcpToken.js +10 -9
- package/dist/routes/mcpToken.js.map +1 -1
- package/dist/routes/mcpTokens.js +10 -3
- package/dist/routes/mcpTokens.js.map +1 -1
- package/dist/routes/members.js +11 -0
- package/dist/routes/members.js.map +1 -1
- package/dist/routes/orgs.js +128 -0
- package/dist/routes/orgs.js.map +1 -0
- package/dist/routes/owner.js +34 -12
- package/dist/routes/owner.js.map +1 -1
- package/dist/routes/reviewLinks.js +11 -10
- package/dist/routes/reviewLinks.js.map +1 -1
- package/dist/routes/rounds.js +7 -6
- package/dist/routes/rounds.js.map +1 -1
- package/dist/routes/sessions.js +16 -15
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/sites.js +45 -26
- package/dist/routes/sites.js.map +1 -1
- package/dist/routes/threads.js +7 -11
- package/dist/routes/threads.js.map +1 -1
- package/dist/serverless.js +86 -120
- package/dist/serverless.js.map +1 -1
- package/dist/storage/settings.js +8 -7
- package/dist/storage/settings.js.map +1 -1
- package/dist/vendor/mcp/bin.js +72 -0
- package/dist/vendor/mcp/client.js +107 -0
- package/dist/vendor/mcp/server.js +242 -0
- package/dist/vendor/mcp/source.js +284 -0
- package/dist/vendor/mcp/view.js +199 -0
- package/dist/vendor/types/names.js +1 -0
- package/package.json +4 -2
- package/static/dashboard/assets/CompositeItem-DooiJvYh.js +1 -0
- package/static/dashboard/assets/{ConfirmDialog-CfUnmf4e.js → ConfirmDialog-B5Kq--VU.js} +1 -1
- package/static/dashboard/assets/{CopyButton-0ANrU8mS.js → CopyButton-BX1ldjjz.js} +1 -1
- package/static/dashboard/assets/FieldItemContext-DkOlIwHg.js +1 -0
- package/static/dashboard/assets/{InstallTag-CFvRuiwX.js → InstallTag-DahspVU0.js} +1 -1
- package/static/dashboard/assets/{SaveState-RDbpfaEm.js → SaveState-Q9xJjbqL.js} +1 -1
- package/static/dashboard/assets/_app-CRQzX614.js +56 -0
- package/static/dashboard/assets/{_app-DpPrYyh8.js → _app-Cd9_WR6L.js} +1 -1
- package/static/dashboard/assets/{activity-DwTWlcUi.js → activity-B-59HYua.js} +1 -1
- package/static/dashboard/assets/{arrow-left-2PKG3ITQ.js → arrow-left-aeWIKOlS.js} +1 -1
- package/static/dashboard/assets/{avatar-AfucjvZ4.js → avatar-KLKmXBKs.js} +1 -1
- package/static/dashboard/assets/{badge-CErha5Qd.js → badge-Dly0Vqky.js} +1 -1
- package/static/dashboard/assets/{card-DxFqxFQf.js → card-D3S4369l.js} +1 -1
- package/static/dashboard/assets/{check-Yc6VFTfm.js → check-CjehM7M4.js} +1 -1
- package/static/dashboard/assets/{chevron-right-Go23FN_b.js → chevron-right-CtWPB3ox.js} +1 -1
- package/static/dashboard/assets/{copy-BjvQHEe0.js → copy-DbrG17rp.js} +1 -1
- package/static/dashboard/assets/{createLucideIcon-DwbZIZsa.js → createLucideIcon-CJO80vPf.js} +1 -1
- package/static/dashboard/assets/{dialog-CgkCHO0g.js → dialog-GyPeOagK.js} +1 -1
- package/static/dashboard/assets/{dropdown-menu-DRa3ikv4.js → dropdown-menu-BOoXJZ3W.js} +3 -3
- package/static/dashboard/assets/{image-off-ByN_ZOK_.js → image-off-BYE-vNh9.js} +1 -1
- package/static/dashboard/assets/{index-BRTBtV91.css → index-BR4Mnw-o.css} +1 -1
- package/static/dashboard/assets/{index-DG2IWFx-.js → index-D4yHhKPM.js} +30 -30
- package/static/dashboard/assets/label-BGuYH_Ll.js +1 -0
- package/static/dashboard/assets/{layout-grid-Dj0cm_PO.js → layout-grid-DJ_OjGVc.js} +1 -1
- package/static/dashboard/assets/me-B-0XXdLF.js +1 -0
- package/static/dashboard/assets/{parts-B3hL1LIW.js → parts-DJaBw8EG.js} +1 -1
- package/static/dashboard/assets/{plus-CRLkl9fr.js → plus-x0wkLget.js} +1 -1
- package/static/dashboard/assets/s._site-s4IRnE6u.js +1 -0
- package/static/dashboard/assets/{s._site.comments-DCpM8f18.js → s._site.comments-Bt0AsQ8j.js} +3 -3
- package/static/dashboard/assets/s._site.reviewers-BzJsotII.js +1 -0
- package/static/dashboard/assets/s._site.settings-C6ei77kQ.js +1 -0
- package/static/dashboard/assets/setup-DTi8FBnt.js +1 -0
- package/static/dashboard/assets/sign-in-CGOMDkYg.js +1 -0
- package/static/dashboard/assets/sign-up-CfU4RCfo.js +1 -0
- package/static/dashboard/assets/sites-zZ5gTDCZ.js +1 -0
- package/static/dashboard/assets/studio-DaMq1jOg.js +1 -0
- package/static/dashboard/assets/{studio-BIDpGywS.js → studio-r6xIIciH.js} +1 -1
- package/static/dashboard/assets/studio.index-CsF3xaoh.js +1 -0
- package/static/dashboard/assets/studio.integrations-BnPEkEA3.js +1 -0
- package/static/dashboard/assets/studio.members-DegH-I8c.js +1 -0
- package/static/dashboard/assets/{sun-CyU37by7.js → sun-BLhaKyhb.js} +1 -1
- package/static/dashboard/assets/switch-En3PhTzh.js +1 -0
- package/static/dashboard/assets/{table-DEYsEr1D.js → table-DuU_ZP-u.js} +1 -1
- package/static/dashboard/assets/useAriaLabelledBy-C3DXCwhM.js +1 -0
- package/static/dashboard/assets/{useBaseQuery-Cyp8ADaN.js → useBaseQuery-B_iu1J2b.js} +1 -1
- package/static/dashboard/assets/useQuery-yeUPHKKg.js +1 -0
- package/static/dashboard/assets/useRender-Bl1M9SFS.js +1 -0
- package/static/dashboard/assets/useValueChanged-BwMBSSVy.js +1 -0
- package/static/dashboard/assets/{users-CcRaZGiI.js → users-c6wDSgLD.js} +1 -1
- package/static/dashboard/assets/{welcome-DFcmcB5m.js → welcome-Ddm5B8Xh.js} +2 -2
- package/static/dashboard/assets/you-BmjZYMtz.js +1 -0
- package/static/dashboard/assets/{zod-qEjeM9Eg.js → zod-CBoGbUzv.js} +1 -1
- package/static/dashboard/index.html +2 -2
- package/static/dashboard/assets/CompositeItem-CrOf38Oz.js +0 -1
- package/static/dashboard/assets/FieldItemContext-CFDZff0c.js +0 -1
- package/static/dashboard/assets/_app-CyFpAeiD.js +0 -56
- package/static/dashboard/assets/createBaseUIEventDetails-BWJgXhnd.js +0 -1
- package/static/dashboard/assets/label-Bombrpc6.js +0 -1
- package/static/dashboard/assets/me-Bno2H07j.js +0 -1
- package/static/dashboard/assets/s._site-CP12hsxz.js +0 -1
- package/static/dashboard/assets/s._site.reviewers-WT9D4fr3.js +0 -1
- package/static/dashboard/assets/s._site.settings-DaxVWDmT.js +0 -1
- package/static/dashboard/assets/setup-Ch-Vt7_T.js +0 -1
- package/static/dashboard/assets/sign-in-CdGjL0Ha.js +0 -1
- package/static/dashboard/assets/sites-8S1PAUfv.js +0 -1
- package/static/dashboard/assets/studio-DREMbrco.js +0 -1
- package/static/dashboard/assets/studio.index-B4-MAfEP.js +0 -1
- package/static/dashboard/assets/studio.integrations-D1bP5fqp.js +0 -1
- package/static/dashboard/assets/studio.members-DKl8oRd9.js +0 -1
- package/static/dashboard/assets/useQuery-DuAHuwx9.js +0 -1
- package/static/dashboard/assets/useRender-BCvsiXRL.js +0 -1
- package/static/dashboard/assets/you-ClBoja9X.js +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { THREAD_REF_PREFIX } from "../vendor/types/names.js";
|
|
4
|
+
import { csrfOk, hashPassword, setSessionCookies } from "./owner.js";
|
|
5
|
+
import { addOwner, createFirstProject, createOrg, createOwner, openSession, SESSION_S, studiosOf } from "../orgs.js";
|
|
6
|
+
const WINDOW_MS = 60 * 60 * 1000;
|
|
7
|
+
const PER_WINDOW = 10;
|
|
8
|
+
const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
9
|
+
function fail(c, status, code, message, details) {
|
|
10
|
+
return c.json({ error: { code, message, ...(details ? { details } : {}), requestId: c.get("requestId") } }, status);
|
|
11
|
+
}
|
|
12
|
+
const CLOSED = "This instance does not take sign-ups. Ask its owner to add you, or run your own — npx snagset.";
|
|
13
|
+
export function orgRoutes(deps) {
|
|
14
|
+
const { sql } = deps;
|
|
15
|
+
const now = deps.now ?? (() => Date.now());
|
|
16
|
+
const app = new Hono();
|
|
17
|
+
const attempts = new Map();
|
|
18
|
+
/** True when this address has used its ten. Counted before any work, so a flood of bad bodies costs a Map lookup. */
|
|
19
|
+
const overLimit = (c) => {
|
|
20
|
+
const ip = c.req.header("x-forwarded-for")?.split(",")[0]?.trim() || c.req.header("x-real-ip")?.trim() || "local";
|
|
21
|
+
const t = now();
|
|
22
|
+
const recent = (attempts.get(ip) ?? []).filter((at) => t - at < WINDOW_MS);
|
|
23
|
+
recent.push(t);
|
|
24
|
+
attempts.set(ip, recent);
|
|
25
|
+
if (attempts.size > 10_000)
|
|
26
|
+
attempts.clear();
|
|
27
|
+
return recent.length > PER_WINDOW;
|
|
28
|
+
};
|
|
29
|
+
const foreign = (c) => {
|
|
30
|
+
const origin = c.req.header("Origin");
|
|
31
|
+
const host = c.req.header("Host");
|
|
32
|
+
const ours = new Set([deps.origin, host ? `http://${host}` : "", host ? `https://${host}` : ""]);
|
|
33
|
+
return !!origin && !ours.has(origin);
|
|
34
|
+
};
|
|
35
|
+
const project = (p) => ({ uid: p.uid, name: p.name, keyPrefix: THREAD_REF_PREFIX.replace("-", "") });
|
|
36
|
+
app.post("/auth/register", async (c) => {
|
|
37
|
+
if (!deps.signupOpen())
|
|
38
|
+
return fail(c, 403, "registration_closed", CLOSED);
|
|
39
|
+
if (foreign(c))
|
|
40
|
+
return fail(c, 403, "forbidden", "That sign-up request came from another site.");
|
|
41
|
+
if (overLimit(c))
|
|
42
|
+
return fail(c, 429, "quota_exceeded", "Too many sign-ups from this address. Try again in an hour.");
|
|
43
|
+
const body = (await c.req.json().catch(() => null));
|
|
44
|
+
const str = (k) => (typeof body?.[k] === "string" ? body[k].trim() : "");
|
|
45
|
+
const email = str("email").toLowerCase();
|
|
46
|
+
const password = typeof body?.["password"] === "string" ? body["password"] : "";
|
|
47
|
+
const name = str("name").slice(0, 120);
|
|
48
|
+
const orgName = (str("orgName") || "My studio").slice(0, 120);
|
|
49
|
+
if (!EMAIL.test(email))
|
|
50
|
+
return fail(c, 400, "validation_failed", "That does not look like an email address.", { field: "email" });
|
|
51
|
+
if (password.length < 12)
|
|
52
|
+
return fail(c, 400, "validation_failed", "The password must be at least 12 characters.", { field: "password" });
|
|
53
|
+
const taken = await sql.begin(async (tx) => {
|
|
54
|
+
await tx `SET LOCAL app.maintenance = 'on'`;
|
|
55
|
+
return tx `SELECT count(*)::int AS n FROM users WHERE email = ${email} AND deleted_at IS NULL`;
|
|
56
|
+
});
|
|
57
|
+
if ((taken[0]?.n ?? 0) > 0)
|
|
58
|
+
return fail(c, 409, "email_taken", "An account with that email already exists. Sign in instead.", { field: "email" });
|
|
59
|
+
const orgId = randomUUID();
|
|
60
|
+
const userId = randomUUID();
|
|
61
|
+
const passwordHash = hashPassword(password);
|
|
62
|
+
let out;
|
|
63
|
+
try {
|
|
64
|
+
out = await sql.begin(async (tx) => {
|
|
65
|
+
await tx `SET LOCAL app.maintenance = 'on'`;
|
|
66
|
+
const [count] = await tx `SELECT count(*)::int AS n FROM orgs`;
|
|
67
|
+
const { slug } = await createOrg(tx, { orgId, name: orgName });
|
|
68
|
+
await createOwner(tx, { orgId, userId, email, name, passwordHash });
|
|
69
|
+
const made = await createFirstProject(tx, { orgId, userId, name: "", graceHours: deps.graceHours });
|
|
70
|
+
const session = await openSession(tx, { orgId, userId, userAgent: c.req.header("User-Agent") ?? "" });
|
|
71
|
+
return { slug, first: (count?.n ?? 0) === 0, project: made, session };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
// users_email_uniq — two sign-ups for one address in the same second.
|
|
76
|
+
if (e?.code === "23505")
|
|
77
|
+
return fail(c, 409, "email_taken", "An account with that email already exists. Sign in instead.", { field: "email" });
|
|
78
|
+
throw e;
|
|
79
|
+
}
|
|
80
|
+
if (out.first)
|
|
81
|
+
deps.onFirstOrg?.();
|
|
82
|
+
setSessionCookies(c, out.session.token, out.session.csrf, deps.secure, SESSION_S);
|
|
83
|
+
return c.json({ org: { name: orgName, slug: out.slug }, user: { email, name }, project: project(out.project), csrfToken: out.session.csrf }, 201);
|
|
84
|
+
});
|
|
85
|
+
app.post("/auth/switch", async (c) => {
|
|
86
|
+
const owner = c.get("owner");
|
|
87
|
+
if (!owner)
|
|
88
|
+
return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
|
|
89
|
+
if (!csrfOk(c))
|
|
90
|
+
return fail(c, 403, "csrf_failed", "That request could not be verified. Reload the dashboard and try again.");
|
|
91
|
+
const body = (await c.req.json().catch(() => null));
|
|
92
|
+
const slug = typeof body?.["slug"] === "string" ? body["slug"].trim() : "";
|
|
93
|
+
const target = (await studiosOf(sql, owner.userId)).find((s) => s.slug === slug);
|
|
94
|
+
if (!target)
|
|
95
|
+
return fail(c, 404, "not_a_member", "You are not a member of a studio with that address.");
|
|
96
|
+
const session = await sql.begin(async (tx) => {
|
|
97
|
+
await tx `SELECT set_config('app.org_id', ${owner.orgId}, true)`;
|
|
98
|
+
await tx `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`;
|
|
99
|
+
return openSession(tx, { orgId: target.id, userId: owner.userId, userAgent: c.req.header("User-Agent") ?? "" });
|
|
100
|
+
});
|
|
101
|
+
setSessionCookies(c, session.token, session.csrf, deps.secure, SESSION_S);
|
|
102
|
+
return c.json({ org: { name: target.name, slug: target.slug }, role: target.role, csrfToken: session.csrf });
|
|
103
|
+
});
|
|
104
|
+
app.post("/api/v1/orgs", async (c) => {
|
|
105
|
+
const owner = c.get("owner");
|
|
106
|
+
if (!owner)
|
|
107
|
+
return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
|
|
108
|
+
if (!deps.signupOpen())
|
|
109
|
+
return fail(c, 403, "registration_closed", "This instance does not take new studios. Ask its operator to open sign-up, or run your own — npx snagset.");
|
|
110
|
+
const body = (await c.req.json().catch(() => null));
|
|
111
|
+
const name = (typeof body?.["name"] === "string" ? body["name"].trim() : "").slice(0, 120) || "My studio";
|
|
112
|
+
const orgId = randomUUID();
|
|
113
|
+
const out = await sql.begin(async (tx) => {
|
|
114
|
+
await tx `SET LOCAL app.maintenance = 'on'`;
|
|
115
|
+
const { slug } = await createOrg(tx, { orgId, name });
|
|
116
|
+
await addOwner(tx, orgId, owner.userId);
|
|
117
|
+
const made = await createFirstProject(tx, { orgId, userId: owner.userId, name: "", graceHours: deps.graceHours });
|
|
118
|
+
await tx `SELECT set_config('app.org_id', ${owner.orgId}, true)`;
|
|
119
|
+
await tx `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`;
|
|
120
|
+
const session = await openSession(tx, { orgId, userId: owner.userId, userAgent: c.req.header("User-Agent") ?? "" });
|
|
121
|
+
return { slug, project: made, session };
|
|
122
|
+
});
|
|
123
|
+
setSessionCookies(c, out.session.token, out.session.csrf, deps.secure, SESSION_S);
|
|
124
|
+
return c.json({ org: { name, slug: out.slug }, project: project(out.project), csrfToken: out.session.csrf }, 201);
|
|
125
|
+
});
|
|
126
|
+
return app;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=orgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/routes/orgs.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/owner.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { randomUUID, randomBytes, createHash, timingSafeEqual, scryptSync } from "node:crypto";
|
|
3
3
|
import { DASHBOARD_SESSION_COOKIE, DASHBOARD_CSRF_COOKIE, HTTP_HEADER, ID_PREFIX } from "../vendor/types/names.js";
|
|
4
|
+
import { usage } from "../plan.js";
|
|
5
|
+
import { studiosOf } from "../orgs.js";
|
|
6
|
+
import { inOrg, maintenance } from "../db/scope.js";
|
|
4
7
|
/** 05 §4.7: 30-day absolute, 7-day idle, rolling refresh on use. */
|
|
5
8
|
const ABSOLUTE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
6
9
|
const IDLE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
@@ -89,7 +92,7 @@ export function ownerAuth(deps) {
|
|
|
89
92
|
if (!token)
|
|
90
93
|
return next();
|
|
91
94
|
const at = now();
|
|
92
|
-
const [row] = await sql `
|
|
95
|
+
const [row] = await maintenance(sql, (tx) => tx `
|
|
93
96
|
SELECT s.id, s.org_id, s.user_id, u.email, u.name, s.last_seen_at, m.role
|
|
94
97
|
FROM user_sessions s
|
|
95
98
|
JOIN users u ON u.id = s.user_id AND u.deleted_at IS NULL
|
|
@@ -100,7 +103,7 @@ export function ownerAuth(deps) {
|
|
|
100
103
|
AND s.revoked_at IS NULL
|
|
101
104
|
AND s.expires_at > ${at}
|
|
102
105
|
AND s.last_seen_at > ${new Date(at.getTime() - IDLE_MS)}
|
|
103
|
-
|
|
106
|
+
`);
|
|
104
107
|
if (!row) {
|
|
105
108
|
// The cookie names no live session — expired, revoked, or minted under
|
|
106
109
|
// a key this instance no longer has. Left alone it is presented on every
|
|
@@ -124,7 +127,7 @@ export function ownerAuth(deps) {
|
|
|
124
127
|
// needs to be accurate to within the idle window, and a write per request
|
|
125
128
|
// turns a read-only dashboard page into a write on the hot path.
|
|
126
129
|
if (at.getTime() - row.last_seen_at.getTime() > 60 * 60 * 1000) {
|
|
127
|
-
void sql `UPDATE user_sessions SET last_seen_at = ${at} WHERE id = ${row.id}
|
|
130
|
+
void inOrg(sql, row.org_id, (tx) => tx `UPDATE user_sessions SET last_seen_at = ${at} WHERE id = ${row.id}`).catch(() => { });
|
|
128
131
|
}
|
|
129
132
|
return next();
|
|
130
133
|
};
|
|
@@ -223,10 +226,10 @@ export function ownerRoutes(deps) {
|
|
|
223
226
|
if (!email || !password) {
|
|
224
227
|
return fail(c, 400, "validation_failed", "Both an email address and a password are required.");
|
|
225
228
|
}
|
|
226
|
-
const [user] = await sql `
|
|
229
|
+
const [user] = await maintenance(sql, (tx) => tx `
|
|
227
230
|
SELECT id, org_id, email, name, password_hash
|
|
228
231
|
FROM users WHERE email = ${email} AND deleted_at IS NULL
|
|
229
|
-
|
|
232
|
+
`);
|
|
230
233
|
// `verifyPassword` spends the same work on a missing row as on a wrong
|
|
231
234
|
// password, so this branch costs what the real one costs.
|
|
232
235
|
if (!verifyPassword(password, user?.password_hash ?? null)) {
|
|
@@ -235,11 +238,11 @@ export function ownerRoutes(deps) {
|
|
|
235
238
|
const token = randomBytes(32).toString("base64url");
|
|
236
239
|
const csrf = randomBytes(32).toString("base64url");
|
|
237
240
|
const expires = new Date(now().getTime() + ABSOLUTE_MS);
|
|
238
|
-
await sql `
|
|
241
|
+
await inOrg(sql, user.org_id, (tx) => tx `
|
|
239
242
|
INSERT INTO user_sessions (id, org_id, user_id, token_hash, user_agent, expires_at)
|
|
240
243
|
VALUES (${randomUUID()}, ${user.org_id}, ${user.id}, ${sha256(token)},
|
|
241
244
|
${(c.req.header("User-Agent") ?? "").slice(0, 400)}, ${expires})
|
|
242
|
-
|
|
245
|
+
`);
|
|
243
246
|
setSessionCookies(c, token, csrf, deps.secure, Math.floor(ABSOLUTE_MS / 1000));
|
|
244
247
|
// No id, for the reason `/api/v1/me` gives: nothing outside the database
|
|
245
248
|
// needs it, and an internal id put on the wire because it was to hand is
|
|
@@ -250,7 +253,7 @@ export function ownerRoutes(deps) {
|
|
|
250
253
|
app.post("/auth/logout", async (c) => {
|
|
251
254
|
const owner = c.get("owner");
|
|
252
255
|
if (owner)
|
|
253
|
-
await sql `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}
|
|
256
|
+
await inOrg(sql, owner.orgId, (tx) => tx `UPDATE user_sessions SET revoked_at = now() WHERE id = ${owner.sessionId}`);
|
|
254
257
|
clearSessionCookies(c, deps.secure);
|
|
255
258
|
return c.json({ ok: true });
|
|
256
259
|
});
|
|
@@ -264,9 +267,9 @@ export function ownerRoutes(deps) {
|
|
|
264
267
|
const owner = c.get("owner");
|
|
265
268
|
if (!owner)
|
|
266
269
|
return fail(c, 401, "unauthorized", "Sign in to the dashboard first.");
|
|
267
|
-
const [org] = await sql `
|
|
270
|
+
const [org] = await inOrg(sql, owner.orgId, (tx) => tx `
|
|
268
271
|
SELECT name, slug FROM orgs WHERE id = ${owner.orgId}
|
|
269
|
-
|
|
272
|
+
`);
|
|
270
273
|
/*
|
|
271
274
|
* `shot` and `last_activity` are here rather than in a per-card request,
|
|
272
275
|
* for the same reason the counts are: the Sites screen draws every project
|
|
@@ -283,7 +286,7 @@ export function ownerRoutes(deps) {
|
|
|
283
286
|
* can attach a photo to a comment, and a client's holiday snap is not what
|
|
284
287
|
* their site looks like.
|
|
285
288
|
*/
|
|
286
|
-
const projects = await sql `
|
|
289
|
+
const projects = await inOrg(sql, owner.orgId, (tx) => tx `
|
|
287
290
|
SELECT p.uid, p.name, p.key_prefix, p.write_mode, p.status,
|
|
288
291
|
p.settings->>'domain' AS domain,
|
|
289
292
|
count(t.id)::int AS threads,
|
|
@@ -312,8 +315,25 @@ export function ownerRoutes(deps) {
|
|
|
312
315
|
WHERE p.org_id = ${owner.orgId} AND p.deleted_at IS NULL
|
|
313
316
|
GROUP BY p.id, p.uid, p.name, p.key_prefix, p.write_mode, p.status, p.settings, s.id
|
|
314
317
|
ORDER BY p.created_at
|
|
315
|
-
|
|
318
|
+
`);
|
|
319
|
+
// The plan's numbers and how far along them the studio is (plan/09) —
|
|
320
|
+
// shown where a limit exists, silent where there is none.
|
|
321
|
+
// Every studio this person belongs to, for the switcher; the current one is marked.
|
|
322
|
+
const studios = await studiosOf(sql, owner.userId);
|
|
323
|
+
const l = await deps.limits(owner.orgId);
|
|
324
|
+
const used = await sql.begin(async (tx) => {
|
|
325
|
+
await tx `SELECT set_config('app.org_id', ${owner.orgId}, true)`;
|
|
326
|
+
return usage(tx, owner.orgId);
|
|
327
|
+
});
|
|
316
328
|
return c.json({
|
|
329
|
+
limits: {
|
|
330
|
+
projects: { limit: l.projects, used: used.projects },
|
|
331
|
+
members: { limit: l.members, used: used.members },
|
|
332
|
+
storage: { limit: l.storageBytes, used: used.storageBytes },
|
|
333
|
+
screenshots: l.screenshots,
|
|
334
|
+
integrations: l.integrations,
|
|
335
|
+
source: l.source,
|
|
336
|
+
},
|
|
317
337
|
// NO id. Foundations §2.10 mints no `usr_` prefix, and the dashboard has
|
|
318
338
|
// no use for one: it renders a name and an email. AC-1-9 is about
|
|
319
339
|
// project uuids specifically, but the habit is the point — an internal
|
|
@@ -321,6 +341,8 @@ export function ownerRoutes(deps) {
|
|
|
321
341
|
// gets out.
|
|
322
342
|
user: { email: owner.email, name: owner.name, role: owner.role },
|
|
323
343
|
org: { name: org?.name ?? "", slug: org?.slug ?? "" },
|
|
344
|
+
orgs: studios.map((s) => ({ slug: s.slug, name: s.name, role: s.role, current: s.id === owner.orgId })),
|
|
345
|
+
signupOpen: deps.signupOpen?.() ?? false,
|
|
324
346
|
projects: projects.map((p) => ({
|
|
325
347
|
uid: p.uid,
|
|
326
348
|
name: p.name,
|
package/dist/routes/owner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner.js","sourceRoot":"","sources":["../../src/routes/owner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"owner.js","sourceRoot":"","sources":["../../src/routes/owner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { randomUUID, randomBytes, createHash } from "node:crypto";
|
|
3
3
|
import { ID_PREFIX } from "../vendor/types/names.js";
|
|
4
|
+
import { inOrg } from "../db/scope.js";
|
|
4
5
|
function fail(c, status, code, message) {
|
|
5
6
|
return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
|
|
6
7
|
}
|
|
@@ -89,9 +90,9 @@ export function reviewLinkRoutes(deps) {
|
|
|
89
90
|
roundId = rowId(body.roundId, ID_PREFIX.round);
|
|
90
91
|
if (!roundId)
|
|
91
92
|
return fail(c, 400, "validation_failed", "roundId is not a valid id.");
|
|
92
|
-
const [round] = await sql `
|
|
93
|
+
const [round] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
93
94
|
SELECT id FROM rounds WHERE id = ${roundId} AND project_id = ${project.id} AND deleted_at IS NULL
|
|
94
|
-
|
|
95
|
+
`);
|
|
95
96
|
if (!round)
|
|
96
97
|
return fail(c, 404, "not_found", "That round is not in this project.");
|
|
97
98
|
}
|
|
@@ -99,21 +100,21 @@ export function reviewLinkRoutes(deps) {
|
|
|
99
100
|
// sha256 only, which is why this response is the token's one appearance.
|
|
100
101
|
const token = randomBytes(32).toString("base64url");
|
|
101
102
|
const id = randomUUID();
|
|
102
|
-
const [row] = await sql `
|
|
103
|
+
const [row] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
103
104
|
INSERT INTO review_links
|
|
104
105
|
(id, org_id, project_id, round_id, token_hash, name, email, environments, permissions,
|
|
105
106
|
allow_name_override, max_uses, expires_at)
|
|
106
107
|
VALUES
|
|
107
108
|
(${id}, ${project.org_id}, ${project.id}, ${roundId}, ${sha256(token)}, ${name},
|
|
108
109
|
${typeof body?.email === "string" ? body.email : null},
|
|
109
|
-
${
|
|
110
|
-
${
|
|
110
|
+
${tx.array(Array.isArray(body?.environments) && body.environments.length ? body.environments : ["*"])},
|
|
111
|
+
${tx.array(permissions)},
|
|
111
112
|
${body?.allowNameOverride === false ? false : true},
|
|
112
113
|
${Number.isInteger(body?.maxUses) && body?.maxUses > 0 ? body.maxUses : null},
|
|
113
114
|
${expiresAt})
|
|
114
115
|
RETURNING id, round_id, name, email, environments, permissions, allow_name_override,
|
|
115
116
|
max_uses, use_count, created_at, expires_at, revoked_at, last_used_at
|
|
116
|
-
|
|
117
|
+
`);
|
|
117
118
|
c.header("Location", `/api/v1/review-links/${ID_PREFIX.link}${id}`);
|
|
118
119
|
return c.json({
|
|
119
120
|
...shape(row),
|
|
@@ -127,11 +128,11 @@ export function reviewLinkRoutes(deps) {
|
|
|
127
128
|
const project = await owned(c);
|
|
128
129
|
if (!project)
|
|
129
130
|
return fail(c, 404, "project_not_found", "No project with that uid.");
|
|
130
|
-
const rows = await sql `
|
|
131
|
+
const rows = await inOrg(sql, project.org_id, (tx) => tx `
|
|
131
132
|
SELECT id, round_id, name, email, environments, permissions, allow_name_override,
|
|
132
133
|
max_uses, use_count, created_at, expires_at, revoked_at, last_used_at
|
|
133
134
|
FROM review_links WHERE project_id = ${project.id} ORDER BY created_at DESC
|
|
134
|
-
|
|
135
|
+
`);
|
|
135
136
|
return c.json({ data: rows.map(shape), nextCursor: null });
|
|
136
137
|
});
|
|
137
138
|
app.delete("/api/v1/review-links/:id", async (c) => {
|
|
@@ -144,11 +145,11 @@ export function reviewLinkRoutes(deps) {
|
|
|
144
145
|
// guessing/enumerating a `lnk_` id. `review_links.org_id` is denormalised
|
|
145
146
|
// onto the row for exactly this filter.
|
|
146
147
|
const owner = c.get("owner");
|
|
147
|
-
const [link] = await sql `
|
|
148
|
+
const [link] = await inOrg(sql, owner.orgId, (tx) => tx `
|
|
148
149
|
SELECT rl.id, rl.project_id, p.uid, rl.revoked_at
|
|
149
150
|
FROM review_links rl JOIN projects p ON p.id = rl.project_id
|
|
150
151
|
WHERE rl.id = ${id} AND rl.org_id = ${owner.orgId}
|
|
151
|
-
|
|
152
|
+
`);
|
|
152
153
|
if (!link)
|
|
153
154
|
return fail(c, 404, "not_found", "No such review link.");
|
|
154
155
|
// BOTH, in one transaction. `revoked_at` stops further exchanges; the epoch
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewLinks.js","sourceRoot":"","sources":["../../src/routes/reviewLinks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"reviewLinks.js","sourceRoot":"","sources":["../../src/routes/reviewLinks.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/rounds.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { ID_PREFIX } from "../vendor/types/names.js";
|
|
4
|
+
import { inOrg } from "../db/scope.js";
|
|
4
5
|
function fail(c, status, code, message) {
|
|
5
6
|
return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
|
|
6
7
|
}
|
|
@@ -41,7 +42,7 @@ export function roundRoutes(deps) {
|
|
|
41
42
|
const p = await owned(c);
|
|
42
43
|
if (!p)
|
|
43
44
|
return fail(c, 404, "project_not_found", "No project with that uid.");
|
|
44
|
-
const rows = await sql `
|
|
45
|
+
const rows = await inOrg(sql, p.org_id, (tx) => tx `
|
|
45
46
|
SELECT r.id, r.number, r.name, r.closed_at, r.created_at,
|
|
46
47
|
count(t.id)::int AS threads,
|
|
47
48
|
count(t.id) FILTER (WHERE t.status <> 'resolved')::int AS unresolved
|
|
@@ -50,7 +51,7 @@ export function roundRoutes(deps) {
|
|
|
50
51
|
WHERE r.project_id = ${p.id} AND r.deleted_at IS NULL
|
|
51
52
|
GROUP BY r.id
|
|
52
53
|
ORDER BY r.number DESC
|
|
53
|
-
|
|
54
|
+
`);
|
|
54
55
|
return c.json({ data: rows.map(shape) });
|
|
55
56
|
});
|
|
56
57
|
/**
|
|
@@ -113,11 +114,11 @@ export function roundRoutes(deps) {
|
|
|
113
114
|
}
|
|
114
115
|
if (name !== null && !name)
|
|
115
116
|
return fail(c, 400, "validation_failed", "A round needs a name.");
|
|
116
|
-
const [row] = await sql `
|
|
117
|
+
const [row] = await inOrg(sql, owner.orgId, (tx) => tx `
|
|
117
118
|
WITH upd AS (
|
|
118
119
|
UPDATE rounds SET
|
|
119
|
-
name = ${name ??
|
|
120
|
-
closed_at = ${closed === null ?
|
|
120
|
+
name = ${name ?? tx `name`},
|
|
121
|
+
closed_at = ${closed === null ? tx `closed_at` : closed ? tx `now()` : tx `NULL`},
|
|
121
122
|
updated_at = now()
|
|
122
123
|
WHERE id = ${id}::uuid AND org_id = ${owner.orgId}::uuid AND deleted_at IS NULL
|
|
123
124
|
RETURNING id, number, name, closed_at, created_at
|
|
@@ -127,7 +128,7 @@ export function roundRoutes(deps) {
|
|
|
127
128
|
(SELECT count(*)::int FROM threads t
|
|
128
129
|
WHERE t.round_id = upd.id AND t.deleted_at IS NULL AND t.status <> 'resolved') AS unresolved
|
|
129
130
|
FROM upd
|
|
130
|
-
|
|
131
|
+
`);
|
|
131
132
|
if (!row)
|
|
132
133
|
return fail(c, 404, "not_found", "No such round.");
|
|
133
134
|
return c.json(shape(row));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rounds.js","sourceRoot":"","sources":["../../src/routes/rounds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"rounds.js","sourceRoot":"","sources":["../../src/routes/rounds.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/sessions.js
CHANGED
|
@@ -3,6 +3,7 @@ import { randomUUID, randomBytes, createHash } from "node:crypto";
|
|
|
3
3
|
import { ID_PREFIX } from "../vendor/types/names.js";
|
|
4
4
|
import { ProjectUnavailable } from "../projectCache.js";
|
|
5
5
|
import { mintSession, verifySession, withinRefreshWindow } from "../session.js";
|
|
6
|
+
import { inOrg } from "../db/scope.js";
|
|
6
7
|
function fail(c, status, code, message) {
|
|
7
8
|
return c.json({ error: { code, message, requestId: c.get("requestId") } }, status);
|
|
8
9
|
}
|
|
@@ -123,9 +124,9 @@ export function sessionRoutes(deps) {
|
|
|
123
124
|
// a revoked link keeps working to one sliding window.
|
|
124
125
|
let linkExpiresAt;
|
|
125
126
|
if (v.claims.lnk) {
|
|
126
|
-
const [link] = await sql `
|
|
127
|
+
const [link] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
127
128
|
SELECT expires_at, revoked_at FROM review_links WHERE id = ${v.claims.lnk}
|
|
128
|
-
|
|
129
|
+
`);
|
|
129
130
|
if (!link || link.revoked_at || link.expires_at <= now()) {
|
|
130
131
|
return fail(c, 401, "token_revoked", "This review link has been turned off.");
|
|
131
132
|
}
|
|
@@ -134,9 +135,9 @@ export function sessionRoutes(deps) {
|
|
|
134
135
|
if (!withinRefreshWindow(v.claims, ttls, linkExpiresAt, now)) {
|
|
135
136
|
return fail(c, 401, "session_expired", "This review session has reached its limit. Re-open your review link.");
|
|
136
137
|
}
|
|
137
|
-
const [reviewer] = await sql `
|
|
138
|
+
const [reviewer] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
138
139
|
SELECT identity_valid_after FROM reviewers WHERE id = ${v.claims.sub}
|
|
139
|
-
|
|
140
|
+
`);
|
|
140
141
|
if (reviewer?.identity_valid_after && v.claims.iat * 1000 < reviewer.identity_valid_after.getTime()) {
|
|
141
142
|
return fail(c, 401, "session_revoked", "This reviewer has been signed out.");
|
|
142
143
|
}
|
|
@@ -194,12 +195,12 @@ export function sessionRoutes(deps) {
|
|
|
194
195
|
// ── The environment. Absent means the project's default (the widget only
|
|
195
196
|
// knows a name if the host put one on the script tag).
|
|
196
197
|
const envKey = typeof body.environment === "string" && body.environment ? body.environment : null;
|
|
197
|
-
const [environment] = await sql `
|
|
198
|
+
const [environment] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
198
199
|
SELECT id, key, label FROM environments
|
|
199
200
|
WHERE project_id = ${project.id} AND deleted_at IS NULL
|
|
200
|
-
AND ${envKey ?
|
|
201
|
+
AND ${envKey ? tx `key = ${envKey}` : tx `is_default`}
|
|
201
202
|
LIMIT 1
|
|
202
|
-
|
|
203
|
+
`);
|
|
203
204
|
if (!environment) {
|
|
204
205
|
return fail(c, 400, "environment_not_found", envKey ? `This project has no environment called "${envKey}".` : "This project has no default environment.");
|
|
205
206
|
}
|
|
@@ -215,14 +216,14 @@ export function sessionRoutes(deps) {
|
|
|
215
216
|
// T8: LEFT JOIN rounds so a round-pinned link can report the round
|
|
216
217
|
// NUMBER (what a reviewer and the widget both mean by "round"), not
|
|
217
218
|
// just its opaque id -- rounds.id never left the server before this.
|
|
218
|
-
const [found] = await sql `
|
|
219
|
+
const [found] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
219
220
|
SELECT rl.id, rl.round_id, rd.number AS round_number, rl.permissions, rl.environments,
|
|
220
221
|
rl.allow_name_override, rl.name, rl.email,
|
|
221
222
|
rl.max_uses, rl.use_count, rl.expires_at, rl.revoked_at
|
|
222
223
|
FROM review_links rl
|
|
223
224
|
LEFT JOIN rounds rd ON rd.id = rl.round_id
|
|
224
225
|
WHERE rl.project_id = ${project.id} AND rl.token_hash = ${sha256(identity.token)}
|
|
225
|
-
|
|
226
|
+
`);
|
|
226
227
|
if (!found)
|
|
227
228
|
return fail(c, 401, "token_invalid", "That review link is not valid.");
|
|
228
229
|
if (found.revoked_at)
|
|
@@ -250,22 +251,22 @@ export function sessionRoutes(deps) {
|
|
|
250
251
|
const typedName = typeof identity.name === "string" ? identity.name.trim().slice(0, 80) : "";
|
|
251
252
|
reviewerName = link && !link.allow_name_override ? link.name : typedName || link?.name || "Anonymous";
|
|
252
253
|
if (presented && presentedId) {
|
|
253
|
-
const [existing] = await sql `
|
|
254
|
+
const [existing] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
254
255
|
SELECT id, name FROM reviewers
|
|
255
256
|
WHERE id = ${presentedId} AND project_id = ${project.id}
|
|
256
257
|
AND holder_secret_hash = ${sha256(presented)}
|
|
257
258
|
AND blocked_at IS NULL AND erased_at IS NULL
|
|
258
|
-
|
|
259
|
+
`);
|
|
259
260
|
// §4.4.1: "a mismatch does NOT error — it silently mints a new guest
|
|
260
261
|
// identity, because a stale storage entry must never lock a reviewer
|
|
261
262
|
// out." So this is an `if`, not a guard clause.
|
|
262
263
|
if (existing) {
|
|
263
264
|
reviewerId = existing.id;
|
|
264
265
|
if (typedName && (!link || link.allow_name_override)) {
|
|
265
|
-
await sql `UPDATE reviewers SET name = ${reviewerName}, last_seen_at = now() WHERE id = ${reviewerId}
|
|
266
|
+
await inOrg(sql, project.org_id, (tx) => tx `UPDATE reviewers SET name = ${reviewerName}, last_seen_at = now() WHERE id = ${reviewerId}`);
|
|
266
267
|
}
|
|
267
268
|
else {
|
|
268
|
-
await sql `UPDATE reviewers SET last_seen_at = now() WHERE id = ${reviewerId}
|
|
269
|
+
await inOrg(sql, project.org_id, (tx) => tx `UPDATE reviewers SET last_seen_at = now() WHERE id = ${reviewerId}`);
|
|
269
270
|
}
|
|
270
271
|
}
|
|
271
272
|
}
|
|
@@ -304,11 +305,11 @@ export function sessionRoutes(deps) {
|
|
|
304
305
|
reviewerId = inserted;
|
|
305
306
|
if (!reviewerId) {
|
|
306
307
|
// The conflict fired: this holder already has a row on this link.
|
|
307
|
-
const [again] = await sql `
|
|
308
|
+
const [again] = await inOrg(sql, project.org_id, (tx) => tx `
|
|
308
309
|
SELECT id FROM reviewers
|
|
309
310
|
WHERE project_id = ${project.id} AND review_link_id = ${link?.id ?? null}
|
|
310
311
|
AND holder_secret_hash = ${sha256(holderSecret)} AND kind = 'link'
|
|
311
|
-
|
|
312
|
+
`);
|
|
312
313
|
reviewerId = again?.id ?? null;
|
|
313
314
|
holderSecret = null;
|
|
314
315
|
}
|