@haverstack/server 0.10.3 → 0.12.0
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.d.ts.map +1 -1
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -1
- package/dist/lib/canonicalJson.d.ts +7 -0
- package/dist/lib/canonicalJson.d.ts.map +1 -0
- package/dist/lib/canonicalJson.js +18 -0
- package/dist/lib/canonicalJson.js.map +1 -0
- package/dist/lib/historyPage.d.ts +12 -0
- package/dist/lib/historyPage.d.ts.map +1 -0
- package/dist/lib/historyPage.js +24 -0
- package/dist/lib/historyPage.js.map +1 -0
- package/dist/lib/ifMatch.d.ts +11 -0
- package/dist/lib/ifMatch.d.ts.map +1 -0
- package/dist/lib/ifMatch.js +11 -0
- package/dist/lib/ifMatch.js.map +1 -0
- package/dist/lib/installRequestStore.d.ts +46 -0
- package/dist/lib/installRequestStore.d.ts.map +1 -0
- package/dist/lib/installRequestStore.js +102 -0
- package/dist/lib/installRequestStore.js.map +1 -0
- package/dist/lib/json.d.ts +7 -1
- package/dist/lib/json.d.ts.map +1 -1
- package/dist/lib/json.js +18 -4
- package/dist/lib/json.js.map +1 -1
- package/dist/lib/queryWorker/pool.d.ts +2 -1
- package/dist/lib/queryWorker/pool.d.ts.map +1 -1
- package/dist/lib/queryWorker/pool.js.map +1 -1
- package/dist/lib/queryWorker/protocol.d.ts +3 -2
- package/dist/lib/queryWorker/protocol.d.ts.map +1 -1
- package/dist/lib/queryWorker/worker.js +3 -3
- package/dist/lib/queryWorker/worker.js.map +1 -1
- package/dist/lib/resumeBuffer.d.ts +4 -4
- package/dist/lib/resumeBuffer.d.ts.map +1 -1
- package/dist/lib/resumeBuffer.js +23 -9
- package/dist/lib/resumeBuffer.js.map +1 -1
- package/dist/lib/resumeCursor.d.ts +1 -1
- package/dist/lib/resumeCursor.d.ts.map +1 -1
- package/dist/lib/resumeCursor.js +3 -3
- package/dist/lib/resumeCursor.js.map +1 -1
- package/dist/lib/selfService.d.ts +2 -0
- package/dist/lib/selfService.d.ts.map +1 -0
- package/dist/lib/selfService.js +6 -0
- package/dist/lib/selfService.js.map +1 -0
- package/dist/middleware/auth.d.ts +10 -9
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +21 -10
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/errors.js +1 -1
- package/dist/middleware/errors.js.map +1 -1
- package/dist/middleware/params.d.ts +10 -0
- package/dist/middleware/params.d.ts.map +1 -0
- package/dist/middleware/params.js +18 -0
- package/dist/middleware/params.js.map +1 -0
- package/dist/routes/attachments.d.ts.map +1 -1
- package/dist/routes/attachments.js +24 -14
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +13 -23
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/changes.d.ts +1 -1
- package/dist/routes/changes.d.ts.map +1 -1
- package/dist/routes/changes.js +17 -18
- package/dist/routes/changes.js.map +1 -1
- package/dist/routes/entity.d.ts.map +1 -1
- package/dist/routes/entity.js +12 -8
- package/dist/routes/entity.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +2 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/installs.d.ts +13 -0
- package/dist/routes/installs.d.ts.map +1 -0
- package/dist/routes/installs.js +101 -0
- package/dist/routes/installs.js.map +1 -0
- package/dist/routes/records.d.ts.map +1 -1
- package/dist/routes/records.js +114 -173
- package/dist/routes/records.js.map +1 -1
- package/dist/routes/tokens.d.ts.map +1 -1
- package/dist/routes/tokens.js +22 -18
- package/dist/routes/tokens.js.map +1 -1
- package/dist/routes/types.d.ts.map +1 -1
- package/dist/routes/types.js +11 -25
- package/dist/routes/types.js.map +1 -1
- package/dist/routes/wellknown.d.ts.map +1 -1
- package/dist/routes/wellknown.js +6 -3
- package/dist/routes/wellknown.js.map +1 -1
- package/dist/shutdown.d.ts.map +1 -1
- package/dist/shutdown.js +1 -0
- package/dist/shutdown.js.map +1 -1
- package/dist/stack.d.ts +2 -0
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js +30 -8
- package/dist/stack.js.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +15 -4
- package/dist/testing.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/lib/queryLimit.d.ts +0 -6
- package/dist/lib/queryLimit.d.ts.map +0 -1
- package/dist/lib/queryLimit.js +0 -20
- package/dist/lib/queryLimit.js.map +0 -1
package/dist/routes/records.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
-
import {
|
|
2
|
+
import { knownParams } from '../middleware/params.js';
|
|
3
|
+
import { requireAuth } from '../middleware/auth.js';
|
|
3
4
|
import { readJson } from '../lib/json.js';
|
|
4
|
-
import { parseQueryBody, parseQueryParams, parseJournalParams,
|
|
5
|
-
import {
|
|
5
|
+
import { parseQueryBody, parseQueryParams, parseGetRecordParams, parseDeleteParams, parseJournalParams, parseVersionsParams, parseAssociationParams, parseUnsignedInt, createOptionsFromWireRecord, parseContentPatchBody, parseParentBody, parseUnlistedBody, parseAssociationEditsBody, parseAssociationsBody, parsePermissionsBody, parseMigrationBody, } from '@haverstack/core/wire';
|
|
6
|
+
import { readHistoryPage } from '../lib/historyPage.js';
|
|
7
|
+
import { ifMatchVersion } from '../lib/ifMatch.js';
|
|
6
8
|
import { serializeRecord, serializeVersion, serializeJournalEntry } from '@haverstack/wire-types';
|
|
7
|
-
import {
|
|
9
|
+
import { StackNotFoundError } from '@haverstack/core';
|
|
8
10
|
// ---------------------------------------------------------------------------
|
|
9
11
|
// Route factory
|
|
10
12
|
// ---------------------------------------------------------------------------
|
|
@@ -20,16 +22,16 @@ export function recordRoutes(ctx, queryTimeoutMs) {
|
|
|
20
22
|
const ownerEntityId = stack.ownerEntityId;
|
|
21
23
|
/** Scope to a session if authenticated, else the anonymous view. */
|
|
22
24
|
function scopeFor(auth) {
|
|
23
|
-
return auth ? stack.
|
|
25
|
+
return auth ? stack.asActor(auth) : stack.asEntity(null);
|
|
24
26
|
}
|
|
25
27
|
// POST /records/query — full query with content-field filters. Optional
|
|
26
28
|
// auth, like GET /records: a superset of the same query surface, so an
|
|
27
29
|
// anonymous caller gets the same public-record subset either way.
|
|
28
30
|
// Registered ahead of the /:id patterns, which would otherwise capture
|
|
29
31
|
// the literal "query" segment.
|
|
30
|
-
app.post('/query', async (c) => {
|
|
32
|
+
app.post('/query', knownParams(), async (c) => {
|
|
31
33
|
const auth = c.get('auth');
|
|
32
|
-
const query =
|
|
34
|
+
const query = parseQueryBody(await readJson(c));
|
|
33
35
|
const result = await queryWorker.query(auth, query, queryTimeoutMs);
|
|
34
36
|
const body = {
|
|
35
37
|
records: result.records.map(serializeRecord),
|
|
@@ -40,7 +42,7 @@ export function recordRoutes(ctx, queryTimeoutMs) {
|
|
|
40
42
|
// GET /records — query by native fields via URL params
|
|
41
43
|
app.get('/', async (c) => {
|
|
42
44
|
const auth = c.get('auth');
|
|
43
|
-
const query =
|
|
45
|
+
const query = parseQueryParams(new URL(c.req.url));
|
|
44
46
|
const result = await queryWorker.query(auth, query, queryTimeoutMs);
|
|
45
47
|
const body = {
|
|
46
48
|
records: result.records.map(serializeRecord),
|
|
@@ -48,240 +50,179 @@ export function recordRoutes(ctx, queryTimeoutMs) {
|
|
|
48
50
|
};
|
|
49
51
|
return c.json(body);
|
|
50
52
|
});
|
|
51
|
-
// POST /records — a full record body, but version,
|
|
52
|
-
//
|
|
53
|
+
// POST /records — a full record body, but version, createdBy and
|
|
54
|
+
// updatedBy are stamped here and never trusted from it. Everything else
|
|
53
55
|
// a wire record body can carry — which fields are forwarded as-is, which
|
|
54
56
|
// are owner-acting-alone-only, and which reduce to a boolean rather than
|
|
55
57
|
// their literal value — is `createOptionsFromWireRecord()`'s disposition
|
|
56
58
|
// to make, not this route's: see `@haverstack/core/wire` and
|
|
57
59
|
// docs/spec/wire-format.md § Records.
|
|
58
|
-
app.post('/', requireAuth(), async (c) => {
|
|
60
|
+
app.post('/', knownParams(), requireAuth(), async (c) => {
|
|
59
61
|
const auth = c.get('auth');
|
|
60
62
|
const body = await readJson(c);
|
|
61
63
|
const { typeId, content, options } = createOptionsFromWireRecord(body, auth, ownerEntityId);
|
|
62
|
-
const created = await stack.
|
|
64
|
+
const created = await stack.asActor(auth).create(typeId, content, options);
|
|
63
65
|
return c.json(serializeRecord(created), 200);
|
|
64
66
|
});
|
|
65
|
-
// GET /records/:id
|
|
67
|
+
// GET /records/:id — a tombstone answers 404 unless ?includeDeleted=true,
|
|
68
|
+
// as on GET /records. See docs/spec/wire-format.md § Records.
|
|
66
69
|
app.get('/:id', async (c) => {
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const record = await scopeFor(auth).get(id);
|
|
70
|
+
const opts = parseGetRecordParams(new URL(c.req.url));
|
|
71
|
+
const record = await scopeFor(c.get('auth')).get(c.req.param('id'), opts);
|
|
70
72
|
if (!record)
|
|
71
73
|
throw new StackNotFoundError('Record not found');
|
|
72
74
|
return c.json(serializeRecord(record));
|
|
73
75
|
});
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
76
|
+
// Every aspect of a record has one write endpoint, and each endpoint
|
|
77
|
+
// reads If-Match and answers with the record it produced. Which gate a
|
|
78
|
+
// write passes — write, reshare, the _attachment@1 immutable fields, the
|
|
79
|
+
// _grant@1 owner-only rule — is ScopedStack's to resolve, so a denial
|
|
80
|
+
// round-trips as the core error it is rather than a guess made here.
|
|
81
|
+
// See docs/spec/wire-format.md § Records and § Optimistic concurrency.
|
|
82
|
+
app.patch('/:id/content', knownParams(), requireAuth(), async (c) => {
|
|
83
|
+
const patch = parseContentPatchBody(await readJson(c));
|
|
84
|
+
const updated = await stack
|
|
85
|
+
.asActor(c.get('auth'))
|
|
86
|
+
.patchContent(c.req.param('id'), patch, ifMatchVersion(c));
|
|
87
|
+
return c.json(serializeRecord(updated));
|
|
88
|
+
});
|
|
89
|
+
app.put('/:id/parent', knownParams(), requireAuth(), async (c) => {
|
|
90
|
+
const { parentId } = parseParentBody(await readJson(c));
|
|
91
|
+
const updated = await stack
|
|
92
|
+
.asActor(c.get('auth'))
|
|
93
|
+
.setParent(c.req.param('id'), parentId, ifMatchVersion(c));
|
|
94
|
+
return c.json(serializeRecord(updated));
|
|
95
|
+
});
|
|
96
|
+
app.put('/:id/unlisted', knownParams(), requireAuth(), async (c) => {
|
|
97
|
+
const { unlisted } = parseUnlistedBody(await readJson(c));
|
|
96
98
|
const updated = await stack
|
|
97
|
-
.
|
|
98
|
-
.
|
|
99
|
+
.asActor(c.get('auth'))
|
|
100
|
+
.setUnlisted(c.req.param('id'), unlisted, ifMatchVersion(c));
|
|
99
101
|
return c.json(serializeRecord(updated));
|
|
100
102
|
});
|
|
101
|
-
// DELETE /records/:id (?
|
|
102
|
-
// a record: a soft delete with the tombstone it produced, a
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
// record, so there is no read-then-delete window for a concurrent write
|
|
108
|
-
// to fall into. See docs/spec/wire-format.md § Records and
|
|
109
|
-
// docs/spec/attachments.md § A purge strands the bytes it referenced.
|
|
103
|
+
// DELETE /records/:id (?purge=true for permanent). Both answer 200 with
|
|
104
|
+
// a record: a soft delete with the tombstone it produced, a purge with
|
|
105
|
+
// the record as it stood immediately before destruction. That body is
|
|
106
|
+
// the requester's only report of the files the purge stranded, and
|
|
107
|
+
// delete() captures it inside the same write that destroys the record.
|
|
108
|
+
// See docs/spec/attachments.md § A purge strands the bytes it referenced.
|
|
110
109
|
app.delete('/:id', requireAuth(), async (c) => {
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const { record } = await session.deleteAndReturn(id, {
|
|
116
|
-
hard,
|
|
117
|
-
ifVersion: parseIfMatch(c.req.header('If-Match')),
|
|
118
|
-
});
|
|
110
|
+
const { purge } = parseDeleteParams(new URL(c.req.url));
|
|
111
|
+
const { record } = await stack
|
|
112
|
+
.asActor(c.get('auth'))
|
|
113
|
+
.delete(c.req.param('id'), { purge, ...ifMatchVersion(c) });
|
|
119
114
|
if (!record)
|
|
120
115
|
throw new StackNotFoundError('Record not found');
|
|
121
116
|
return c.json(serializeRecord(record));
|
|
122
117
|
});
|
|
123
118
|
// POST /records/:id/undelete — reverses a soft delete; idempotent
|
|
124
|
-
app.post('/:id/undelete', requireAuth(), async (c) => {
|
|
125
|
-
const id = c.req.param('id');
|
|
126
|
-
const auth = c.get('auth');
|
|
119
|
+
app.post('/:id/undelete', knownParams(), requireAuth(), async (c) => {
|
|
127
120
|
const restored = await stack
|
|
128
|
-
.
|
|
129
|
-
.undelete(
|
|
121
|
+
.asActor(c.get('auth'))
|
|
122
|
+
.undelete(c.req.param('id'), ifMatchVersion(c));
|
|
130
123
|
return c.json(serializeRecord(restored));
|
|
131
124
|
});
|
|
132
125
|
// ------------------------------------------------------------------
|
|
133
|
-
// Permissions
|
|
126
|
+
// Permissions and associations
|
|
134
127
|
// ------------------------------------------------------------------
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
128
|
+
// Two surfaces, one shape: a POST edits the set with a list of adds and
|
|
129
|
+
// removes applied as one write, and a PUT replaces it. An element sent to
|
|
130
|
+
// the wrong surface is ScopedStack's 400, so nothing here inspects one.
|
|
131
|
+
// See docs/spec/wire-format.md § Permissions and § Associations.
|
|
132
|
+
app.get('/:id/permissions', knownParams(), async (c) => {
|
|
133
|
+
const record = await scopeFor(c.get('auth')).get(c.req.param('id'));
|
|
139
134
|
if (!record)
|
|
140
135
|
throw new StackNotFoundError('Record not found');
|
|
141
136
|
return c.json({ permissions: record.permissions ?? [] });
|
|
142
137
|
});
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
// here inspects the body. See docs/spec/access-control.md
|
|
149
|
-
// § Record-level permissions.
|
|
150
|
-
app.post('/:id/permissions', requireAuth(), async (c) => {
|
|
151
|
-
const id = c.req.param('id');
|
|
152
|
-
const auth = c.get('auth');
|
|
153
|
-
const body = await readJson(c);
|
|
154
|
-
const updated = await stack.forSession(auth).grantAccess(id, body);
|
|
138
|
+
app.post('/:id/permissions', knownParams(), requireAuth(), async (c) => {
|
|
139
|
+
const edits = parseAssociationEditsBody(await readJson(c));
|
|
140
|
+
const updated = await stack
|
|
141
|
+
.asActor(c.get('auth'))
|
|
142
|
+
.editAccess(c.req.param('id'), edits, ifMatchVersion(c));
|
|
155
143
|
return c.json(serializeRecord(updated));
|
|
156
144
|
});
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const body = await readJson(c);
|
|
163
|
-
const updated = await stack.forSession(auth).revokeAccess(id, body);
|
|
145
|
+
app.put('/:id/permissions', knownParams(), requireAuth(), async (c) => {
|
|
146
|
+
const permissions = parsePermissionsBody(await readJson(c));
|
|
147
|
+
const updated = await stack
|
|
148
|
+
.asActor(c.get('auth'))
|
|
149
|
+
.setAccess(c.req.param('id'), permissions, ifMatchVersion(c));
|
|
164
150
|
return c.json(serializeRecord(updated));
|
|
165
151
|
});
|
|
166
|
-
// ------------------------------------------------------------------
|
|
167
|
-
// Associations
|
|
168
|
-
// ------------------------------------------------------------------
|
|
169
152
|
app.get('/:id/associations', async (c) => {
|
|
170
|
-
const
|
|
171
|
-
const
|
|
172
|
-
const record = await scopeFor(auth).get(id);
|
|
153
|
+
const { kind, label } = parseAssociationParams(new URL(c.req.url));
|
|
154
|
+
const record = await scopeFor(c.get('auth')).get(c.req.param('id'));
|
|
173
155
|
if (!record)
|
|
174
156
|
throw new StackNotFoundError('Record not found');
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (kind)
|
|
178
|
-
assocs = assocs.filter((a) => a.kind === kind);
|
|
179
|
-
const label = c.req.query('label');
|
|
180
|
-
if (label)
|
|
181
|
-
assocs = assocs.filter((a) => a.label === label);
|
|
182
|
-
return c.json({ associations: assocs });
|
|
157
|
+
const associations = (record.associations ?? []).filter((a) => (kind === undefined || a.kind === kind) && (label === undefined || a.label === label));
|
|
158
|
+
return c.json({ associations });
|
|
183
159
|
});
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
app.post('/:id/associations', requireAuth(), async (c) => {
|
|
190
|
-
const id = c.req.param('id');
|
|
191
|
-
const auth = c.get('auth');
|
|
192
|
-
const body = await readJson(c);
|
|
193
|
-
if (!body.kind || !body.label)
|
|
194
|
-
throw new StackQueryError('kind and label are required');
|
|
195
|
-
const updated = await stack.forSession(auth).associate(id, body);
|
|
160
|
+
app.post('/:id/associations', knownParams(), requireAuth(), async (c) => {
|
|
161
|
+
const edits = parseAssociationEditsBody(await readJson(c));
|
|
162
|
+
const updated = await stack
|
|
163
|
+
.asActor(c.get('auth'))
|
|
164
|
+
.editAssociations(c.req.param('id'), edits, ifMatchVersion(c));
|
|
196
165
|
return c.json(serializeRecord(updated));
|
|
197
166
|
});
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const auth = c.get('auth');
|
|
204
|
-
const body = await readJson(c);
|
|
205
|
-
const updated = await stack.forSession(auth).dissociate(id, body);
|
|
167
|
+
app.put('/:id/associations', knownParams(), requireAuth(), async (c) => {
|
|
168
|
+
const associations = parseAssociationsBody(await readJson(c));
|
|
169
|
+
const updated = await stack
|
|
170
|
+
.asActor(c.get('auth'))
|
|
171
|
+
.setAssociations(c.req.param('id'), associations, ifMatchVersion(c));
|
|
206
172
|
return c.json(serializeRecord(updated));
|
|
207
173
|
});
|
|
208
174
|
// ------------------------------------------------------------------
|
|
209
175
|
// Journal
|
|
210
176
|
// ------------------------------------------------------------------
|
|
211
|
-
// GET /records/:id/journal — the change journal, oldest first.
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
//
|
|
215
|
-
//
|
|
216
|
-
//
|
|
217
|
-
// non-resharer gets are both ScopedStack.getJournal()'s, so this route
|
|
218
|
-
// decodes the window, bounds the page and serializes. `cursor` is the
|
|
219
|
-
// only end-of-log signal — a page filled to the ceiling carries the seq
|
|
220
|
-
// to resume from, whether or not the log ends there. See
|
|
221
|
-
// docs/spec/journal.md and docs/spec/wire-format.md § Journal.
|
|
177
|
+
// GET /records/:id/journal — the change journal, oldest first. Never
|
|
178
|
+
// answered empty for a record this server doesn't hold: an empty log
|
|
179
|
+
// means "nothing changed" unconditionally, so a missing or purged record
|
|
180
|
+
// is the 404 ScopedStack raises. The mutate-surface gate and the
|
|
181
|
+
// authority-element projection are both ScopedStack.getJournal()'s.
|
|
182
|
+
// See docs/spec/journal.md and docs/spec/wire-format.md § Journal.
|
|
222
183
|
app.get('/:id/journal', async (c) => {
|
|
223
184
|
const id = c.req.param('id');
|
|
224
|
-
const auth = c.get('auth');
|
|
225
185
|
const query = parseJournalParams(new URL(c.req.url));
|
|
226
|
-
const
|
|
227
|
-
const
|
|
228
|
-
const body = {
|
|
229
|
-
entries: entries.map(serializeJournalEntry),
|
|
230
|
-
cursor: entries.length > 0 && entries.length === limit ? entries[entries.length - 1].seq : null,
|
|
231
|
-
};
|
|
186
|
+
const scoped = scopeFor(c.get('auth'));
|
|
187
|
+
const { rows, cursor } = await readHistoryPage(query.limit, (limit) => scoped.getJournal(id, { ...query, limit }), (entry) => entry.seq);
|
|
188
|
+
const body = { entries: rows.map(serializeJournalEntry), cursor };
|
|
232
189
|
return c.json(body);
|
|
233
190
|
});
|
|
234
191
|
// ------------------------------------------------------------------
|
|
235
192
|
// Versions
|
|
236
193
|
// ------------------------------------------------------------------
|
|
194
|
+
// Newest first, paged like the journal. See docs/spec/wire-format.md § Versions.
|
|
237
195
|
app.get('/:id/versions', async (c) => {
|
|
238
196
|
const id = c.req.param('id');
|
|
239
|
-
const
|
|
240
|
-
const
|
|
241
|
-
|
|
197
|
+
const query = parseVersionsParams(new URL(c.req.url));
|
|
198
|
+
const scoped = scopeFor(c.get('auth'));
|
|
199
|
+
const { rows, cursor } = await readHistoryPage(query.limit, (limit) => scoped.getVersions(id, { ...query, limit }), (version) => version.version);
|
|
200
|
+
const body = { versions: rows.map(serializeVersion), cursor };
|
|
201
|
+
return c.json(body);
|
|
242
202
|
});
|
|
243
|
-
app.get('/:id/versions/:version', async (c) => {
|
|
244
|
-
const
|
|
245
|
-
const vNum = parsePositiveInt(c.req.param('version'), 'version number');
|
|
246
|
-
const auth = c.get('auth');
|
|
247
|
-
const version = await scopeFor(auth).getVersion(id, vNum);
|
|
203
|
+
app.get('/:id/versions/:version', knownParams(), async (c) => {
|
|
204
|
+
const version = await scopeFor(c.get('auth')).getVersion(c.req.param('id'), parseUnsignedInt(c.req.param('version'), 'version number'));
|
|
248
205
|
if (!version)
|
|
249
206
|
throw new StackNotFoundError('Version not found');
|
|
250
207
|
return c.json(serializeVersion(version));
|
|
251
208
|
});
|
|
252
209
|
// POST /records/:id/restore/:version — creates new version, does not rewrite history
|
|
253
|
-
app.post('/:id/restore/:version', requireAuth(), async (c) => {
|
|
254
|
-
const id = c.req.param('id');
|
|
255
|
-
const vNum = parsePositiveInt(c.req.param('version'), 'version number');
|
|
256
|
-
const auth = c.get('auth');
|
|
210
|
+
app.post('/:id/restore/:version', knownParams(), requireAuth(), async (c) => {
|
|
257
211
|
const restored = await stack
|
|
258
|
-
.
|
|
259
|
-
.restoreVersion(id,
|
|
212
|
+
.asActor(c.get('auth'))
|
|
213
|
+
.restoreVersion(c.req.param('id'), parseUnsignedInt(c.req.param('version'), 'version number'), ifMatchVersion(c));
|
|
260
214
|
return c.json(serializeRecord(restored));
|
|
261
215
|
});
|
|
262
216
|
// POST /records/:id/migrate — the only way typeId changes after creation.
|
|
263
|
-
// The body carries the full post-migration content, computed
|
|
264
|
-
//
|
|
265
|
-
//
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const id = c.req.param('id');
|
|
270
|
-
const auth = c.get('auth');
|
|
271
|
-
const body = await readJson(c);
|
|
272
|
-
if (!body.toTypeId || typeof body.toTypeId !== 'string')
|
|
273
|
-
throw new StackQueryError('toTypeId is required');
|
|
274
|
-
if (!body.content || typeof body.content !== 'object')
|
|
275
|
-
throw new StackQueryError('content is required');
|
|
276
|
-
if (!(await stack.getType(body.toTypeId)))
|
|
277
|
-
throw new StackValidationError([
|
|
278
|
-
{ path: 'toTypeId', message: `Unknown type: "${body.toTypeId}"` },
|
|
279
|
-
]);
|
|
217
|
+
// The body carries the full post-migration content, computed by the
|
|
218
|
+
// type's owning app. Who may commit one — the owner, or an installed app
|
|
219
|
+
// within the families its install claims — is ScopedStack's to decide.
|
|
220
|
+
// See docs/spec/wire-format.md § Migration commit.
|
|
221
|
+
app.post('/:id/migrate', knownParams(), requireAuth(), async (c) => {
|
|
222
|
+
const { toTypeId, content } = parseMigrationBody(await readJson(c));
|
|
280
223
|
const migrated = await stack
|
|
281
|
-
.
|
|
282
|
-
.commitMigration(id,
|
|
283
|
-
ifVersion: parseIfMatch(c.req.header('If-Match')),
|
|
284
|
-
});
|
|
224
|
+
.asActor(c.get('auth'))
|
|
225
|
+
.commitMigration(c.req.param('id'), toTypeId, content, ifMatchVersion(c));
|
|
285
226
|
return c.json(serializeRecord(migrated));
|
|
286
227
|
});
|
|
287
228
|
return app;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/routes/records.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/routes/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/routes/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/routes/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAqE3D"}
|
package/dist/routes/tokens.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
+
import { knownParams } from '../middleware/params.js';
|
|
2
3
|
import { requireOwner } from '../middleware/auth.js';
|
|
3
4
|
import { readJson } from '../lib/json.js';
|
|
4
5
|
import { parseDate } from '@haverstack/wire-types';
|
|
@@ -8,22 +9,25 @@ export function tokenRoutes(ctx) {
|
|
|
8
9
|
const app = new Hono();
|
|
9
10
|
const { tokens, stack } = ctx;
|
|
10
11
|
const ownerEntityId = stack.ownerEntityId;
|
|
11
|
-
// POST /tokens — issue a new token (owner only).
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
12
|
+
// POST /tokens — issue a new token (owner only). The body names an Actor:
|
|
13
|
+
// `principalId` is the identity the token authenticates as (default: the
|
|
14
|
+
// owner), and `subjectId` asserts a delegation out of band — the subject
|
|
15
|
+
// that principal acts for (default: the principal itself), per
|
|
16
|
+
// docs/spec/wire-format.md § The session a token names.
|
|
17
|
+
app.post('/', knownParams(), requireOwner(ownerEntityId), async (c) => {
|
|
18
|
+
const body = await readJson(c, ['principalId', 'subjectId', 'label', 'expiresAt']);
|
|
19
|
+
if (body.principalId !== undefined && !isValidDid(body.principalId))
|
|
20
|
+
throw new StackValidationError([{ path: 'principalId', message: 'Must be a DID' }]);
|
|
21
|
+
if (body.subjectId !== undefined && !isValidDid(body.subjectId))
|
|
22
|
+
throw new StackValidationError([{ path: 'subjectId', message: 'Must be a DID' }]);
|
|
23
|
+
const principalId = body.principalId ?? ownerEntityId;
|
|
24
|
+
const subjectId = body.subjectId ?? principalId;
|
|
25
|
+
if (body.label !== undefined && typeof body.label !== 'string')
|
|
26
|
+
throw new StackValidationError([{ path: 'label', message: 'Must be a string' }]);
|
|
27
|
+
const expiresAt = typeof body.expiresAt === 'string' ? parseDate(body.expiresAt) : undefined;
|
|
28
|
+
if (body.expiresAt !== undefined && !expiresAt)
|
|
24
29
|
throw new StackValidationError([{ path: 'expiresAt', message: 'Invalid date' }]);
|
|
25
|
-
const { id, token } = await tokens.createToken(principalId, {
|
|
26
|
-
onBehalfOf: body.onBehalfOf,
|
|
30
|
+
const { id, token } = await tokens.createToken({ subjectId, principalId }, {
|
|
27
31
|
label: body.label,
|
|
28
32
|
expiresAt,
|
|
29
33
|
});
|
|
@@ -34,19 +38,19 @@ export function tokenRoutes(ctx) {
|
|
|
34
38
|
id,
|
|
35
39
|
token,
|
|
36
40
|
principalId,
|
|
37
|
-
subjectId
|
|
41
|
+
subjectId,
|
|
38
42
|
label: stored.label ?? null,
|
|
39
43
|
createdAt: stored.createdAt.toISOString(),
|
|
40
44
|
expiresAt: stored.expiresAt?.toISOString() ?? null,
|
|
41
45
|
}, 201);
|
|
42
46
|
});
|
|
43
47
|
// GET /tokens — list all DB-managed tokens; never returns token values
|
|
44
|
-
app.get('/', requireOwner(ownerEntityId), async (c) => {
|
|
48
|
+
app.get('/', knownParams(), requireOwner(ownerEntityId), async (c) => {
|
|
45
49
|
const list = await tokens.listTokens();
|
|
46
50
|
return c.json({ tokens: list.map(serializeToken) });
|
|
47
51
|
});
|
|
48
52
|
// DELETE /tokens/:id — revoke a token by its ID
|
|
49
|
-
app.delete('/:id', requireOwner(ownerEntityId), async (c) => {
|
|
53
|
+
app.delete('/:id', knownParams(), requireOwner(ownerEntityId), async (c) => {
|
|
50
54
|
await tokens.revokeToken(c.req.param('id'));
|
|
51
55
|
return c.body(null, 204);
|
|
52
56
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/routes/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/routes/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routes/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routes/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CA0B1D"}
|