@isahaq/kosh-server 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +21 -2
- package/dist/api/client.d.ts +18 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +380 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/idempotency.d.ts +23 -0
- package/dist/api/idempotency.d.ts.map +1 -0
- package/dist/api/idempotency.js +52 -0
- package/dist/api/idempotency.js.map +1 -0
- package/dist/api/metadata.d.ts +65 -0
- package/dist/api/metadata.d.ts.map +1 -0
- package/dist/api/metadata.js +88 -0
- package/dist/api/metadata.js.map +1 -0
- package/dist/api/navigation.d.ts +46 -0
- package/dist/api/navigation.d.ts.map +1 -0
- package/dist/api/navigation.js +131 -0
- package/dist/api/navigation.js.map +1 -0
- package/dist/api/openapi.d.ts +22 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +349 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/api/rest.d.ts +28 -0
- package/dist/api/rest.d.ts.map +1 -0
- package/dist/api/rest.js +435 -0
- package/dist/api/rest.js.map +1 -0
- package/dist/api/views.d.ts +67 -0
- package/dist/api/views.d.ts.map +1 -0
- package/dist/api/views.js +307 -0
- package/dist/api/views.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +26 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth/admins.d.ts +26 -0
- package/dist/auth/admins.d.ts.map +1 -0
- package/dist/auth/admins.js +70 -0
- package/dist/auth/admins.js.map +1 -0
- package/dist/auth/base.d.ts +12 -0
- package/dist/auth/base.d.ts.map +1 -0
- package/dist/auth/base.js +192 -0
- package/dist/auth/base.js.map +1 -0
- package/dist/auth/crypto.d.ts +20 -0
- package/dist/auth/crypto.d.ts.map +1 -0
- package/dist/auth/crypto.js +100 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/install.d.ts +24 -0
- package/dist/auth/install.d.ts.map +1 -0
- package/dist/auth/install.js +18 -0
- package/dist/auth/install.js.map +1 -0
- package/dist/auth/routes.d.ts +20 -0
- package/dist/auth/routes.d.ts.map +1 -0
- package/dist/auth/routes.js +56 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/service.d.ts +108 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +477 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +78 -0
- package/dist/errors.js.map +1 -0
- package/dist/identity.d.ts +49 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +58 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/orm.d.ts +14 -0
- package/dist/orm.d.ts.map +1 -0
- package/dist/orm.js +12 -0
- package/dist/orm.js.map +1 -0
- package/dist/registry.d.ts +19 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +26 -0
- package/dist/registry.js.map +1 -0
- package/dist/server.d.ts +93 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/telemetry.d.ts +23 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +38 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +63 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generated REST API (RFC 0002 §6.3): one set of routes serving every installed model from Shutro's metadata.
|
|
3
|
+
* Each request runs in its own Shutro transaction as the caller, so ACL, record rules, field groups, company scope,
|
|
4
|
+
* compare-and-set and constraints are Shutro's, never re-implemented here.
|
|
5
|
+
*
|
|
6
|
+
* - `GET /api/v1/models/:model` search (filter, order, fields, limit, offset, count)
|
|
7
|
+
* - `POST /api/v1/models/:model` create (Idempotency-Key)
|
|
8
|
+
* - `GET /api/v1/models/:model/:id` read (ETag)
|
|
9
|
+
* - `PATCH /api/v1/models/:model/:id` update (If-Match → 412, Idempotency-Key)
|
|
10
|
+
* - `DELETE /api/v1/models/:model/:id` delete (Idempotency-Key)
|
|
11
|
+
* - `POST /api/v1/models/:model/aggregate` grouped totals
|
|
12
|
+
* - `POST /api/v1/models/:model/onchange` form assistance
|
|
13
|
+
* - `POST /api/v1/models/:model/:id/transitions/:name` state transition (Idempotency-Key)
|
|
14
|
+
* - `POST /api/v1/models/:model/export` export (needs `export`; audited)
|
|
15
|
+
* - `POST /api/v1/models/:model/import` import rows (needs `import` and `create`; audited)
|
|
16
|
+
* - `GET /api/v1/meta/:model` the caller's view of the model (needs `read`)
|
|
17
|
+
* - `GET /api/v1/openapi.json` the OpenAPI 3.1 document
|
|
18
|
+
*/
|
|
19
|
+
import type { FastifyInstance } from 'fastify';
|
|
20
|
+
import type { Driver } from '../orm.js';
|
|
21
|
+
import { type ApiModel } from './metadata.js';
|
|
22
|
+
/** Registers the generated routes for `models`. */
|
|
23
|
+
export declare function registerRestApi(app: FastifyInstance, options: {
|
|
24
|
+
readonly models: ReadonlyMap<string, ApiModel>;
|
|
25
|
+
readonly driver: Driver;
|
|
26
|
+
readonly openapi: () => unknown;
|
|
27
|
+
}): void;
|
|
28
|
+
//# sourceMappingURL=rest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../src/api/rest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAG7E,OAAO,KAAK,EAAE,MAAM,EAAO,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAiB,KAAK,QAAQ,EAAiB,MAAM,eAAe,CAAC;AA2M5E,mDAAmD;AACnD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE;IACP,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;CACjC,GACA,IAAI,CAkXN"}
|
package/dist/api/rest.js
ADDED
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { audit } from '../audit.js';
|
|
2
|
+
import { HttpProblem } from '../errors.js';
|
|
3
|
+
import { idempotent } from './idempotency.js';
|
|
4
|
+
import { defaultFields } from './metadata.js';
|
|
5
|
+
const ref = (env, model) => env.model(model);
|
|
6
|
+
const PERMS = ['read', 'write', 'create', 'unlink', 'export', 'import'];
|
|
7
|
+
const EXPORT_LIMIT = 100_000;
|
|
8
|
+
/** CSV exports stream up to this many rows, EXPORT_PAGE at a time. */
|
|
9
|
+
const STREAM_LIMIT = 10_000_000;
|
|
10
|
+
const EXPORT_PAGE = 5_000;
|
|
11
|
+
const IMPORT_LIMIT = 10_000;
|
|
12
|
+
/** A CSV cell (RFC 4180), with formula-like text neutralized (spreadsheet injection). */
|
|
13
|
+
function csvCell(value) {
|
|
14
|
+
if (value === null || value === undefined)
|
|
15
|
+
return '';
|
|
16
|
+
let text = value instanceof Date
|
|
17
|
+
? value.toISOString()
|
|
18
|
+
: Array.isArray(value)
|
|
19
|
+
? value.join(';')
|
|
20
|
+
: typeof value === 'object'
|
|
21
|
+
? JSON.stringify(value)
|
|
22
|
+
: String(value);
|
|
23
|
+
if (/^[=+\-@\t\r]/.test(text) && !/^-?\d+(\.\d+)?$/.test(text))
|
|
24
|
+
text = `'${text}`;
|
|
25
|
+
return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
|
|
26
|
+
}
|
|
27
|
+
function problem(status, type, title, detail, hint) {
|
|
28
|
+
return new HttpProblem(status, type, title, detail, hint);
|
|
29
|
+
}
|
|
30
|
+
function list(text) {
|
|
31
|
+
return typeof text === 'string' && text.trim() !== ''
|
|
32
|
+
? text
|
|
33
|
+
.split(',')
|
|
34
|
+
.map((s) => s.trim())
|
|
35
|
+
.filter((s) => s !== '')
|
|
36
|
+
: [];
|
|
37
|
+
}
|
|
38
|
+
function parseFilter(text) {
|
|
39
|
+
if (text === undefined || text === '')
|
|
40
|
+
return undefined;
|
|
41
|
+
let value;
|
|
42
|
+
try {
|
|
43
|
+
value = JSON.parse(String(text));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw problem(400, 'invalid-filter', 'Invalid filter', 'filter is not valid JSON.', 'Pass a Shutro domain as JSON, e.g. {"name":{"ilike":"acme%"}}.');
|
|
47
|
+
}
|
|
48
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
49
|
+
throw problem(400, 'invalid-filter', 'Invalid filter', 'filter must be a JSON object (a Shutro domain).');
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function parseOrder(model, text) {
|
|
53
|
+
return list(text).map((term) => {
|
|
54
|
+
const [key = '', direction = 'asc', extra] = term.split(/\s+/);
|
|
55
|
+
const field = model.byKey.get(key);
|
|
56
|
+
if (field === undefined ||
|
|
57
|
+
!field.stored ||
|
|
58
|
+
extra !== undefined ||
|
|
59
|
+
(direction !== 'asc' && direction !== 'desc'))
|
|
60
|
+
throw problem(400, 'invalid-order', 'Invalid order', `Cannot order ${model.name} by '${term}'.`, "Use stored fields: 'name asc,id desc'.");
|
|
61
|
+
return `${key} ${direction}`;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** The fields to return: requested ones (checked to exist), or the defaults the caller may read. */
|
|
65
|
+
function fieldsOf(model, env, requested) {
|
|
66
|
+
const keys = list(requested);
|
|
67
|
+
if (keys.length === 0)
|
|
68
|
+
return defaultFields(model).filter((f) => env.access.canField(model.name, f.key, 'read'));
|
|
69
|
+
return keys.map((key) => {
|
|
70
|
+
const field = model.byKey.get(key);
|
|
71
|
+
if (field === undefined || field.kind === 'binary')
|
|
72
|
+
throw problem(400, 'invalid-fields', 'Invalid fields', `'${key}' is not a readable field of ${model.name}.`);
|
|
73
|
+
return field;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Loads what the response needs (restricted fields are refused by Shutro: 403) and returns plain rows. */
|
|
77
|
+
async function rows(records, fields) {
|
|
78
|
+
if (records.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
const scalar = fields
|
|
81
|
+
.filter((f) => f.kind !== 'one2many' && f.kind !== 'many2many')
|
|
82
|
+
.map((f) => f.key);
|
|
83
|
+
const x2many = fields
|
|
84
|
+
.filter((f) => f.kind === 'one2many' || f.kind === 'many2many')
|
|
85
|
+
.map((f) => f.key);
|
|
86
|
+
let loaded = await records.load([...new Set(['id', ...scalar])]);
|
|
87
|
+
if (x2many.length > 0)
|
|
88
|
+
loaded = await loaded.load(Object.fromEntries(x2many.map((k) => [k, true])));
|
|
89
|
+
return loaded.read(['id', ...fields.map((f) => f.key).filter((k) => k !== 'id')]);
|
|
90
|
+
}
|
|
91
|
+
function etagOf(records) {
|
|
92
|
+
const updatedAt = records.length === 1 ? records.first()['updatedAt'] : undefined;
|
|
93
|
+
return updatedAt instanceof Date ? `"${updatedAt.getTime()}"` : undefined;
|
|
94
|
+
}
|
|
95
|
+
function ifMatch(request) {
|
|
96
|
+
const header = request.headers['if-match'];
|
|
97
|
+
if (header === undefined)
|
|
98
|
+
return undefined;
|
|
99
|
+
const m = /^(?:W\/)?"(\d+)"$/.exec(String(header).trim());
|
|
100
|
+
if (m === null)
|
|
101
|
+
throw problem(400, 'invalid-if-match', 'Invalid If-Match', 'If-Match must be an ETag returned by this API.');
|
|
102
|
+
return new Date(Number(m[1]));
|
|
103
|
+
}
|
|
104
|
+
async function record(env, model, id, fields) {
|
|
105
|
+
const set = await ref(env, model.name).browse([id]).load(['id', 'updatedAt']);
|
|
106
|
+
const [row] = await rows(set, fields ?? fieldsOf(model, env, undefined));
|
|
107
|
+
const etag = etagOf(set);
|
|
108
|
+
return { status: 200, body: row, ...(etag === undefined ? {} : { headers: { etag } }) };
|
|
109
|
+
}
|
|
110
|
+
async function send(reply, outcome) {
|
|
111
|
+
for (const [name, value] of Object.entries(outcome.headers ?? {}))
|
|
112
|
+
reply.header(name, value);
|
|
113
|
+
if (outcome.replayed === true)
|
|
114
|
+
reply.header('idempotent-replayed', 'true');
|
|
115
|
+
await reply.status(outcome.status).send(outcome.body);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* JSON has no dates: datetime fields arrive as ISO strings and become `Date`s (Shutro stores them in UTC); other
|
|
119
|
+
* kinds are left to Shutro's own validation. Applied to create, update and import values.
|
|
120
|
+
*/
|
|
121
|
+
function coerceValues(model, values) {
|
|
122
|
+
const out = { ...values };
|
|
123
|
+
for (const [key, value] of Object.entries(values)) {
|
|
124
|
+
if (model.byKey.get(key)?.kind !== 'datetime' || typeof value !== 'string')
|
|
125
|
+
continue;
|
|
126
|
+
const date = new Date(value);
|
|
127
|
+
if (!Number.isNaN(date.getTime()))
|
|
128
|
+
out[key] = date;
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
function idOf(params) {
|
|
133
|
+
const id = Number(params.id);
|
|
134
|
+
if (!Number.isSafeInteger(id) || id <= 0)
|
|
135
|
+
throw problem(400, 'invalid-id', 'Invalid id', 'The record id must be a positive integer.');
|
|
136
|
+
return id;
|
|
137
|
+
}
|
|
138
|
+
/** Registers the generated routes for `models`. */
|
|
139
|
+
export function registerRestApi(app, options) {
|
|
140
|
+
const { models, driver } = options;
|
|
141
|
+
const modelOf = (params) => {
|
|
142
|
+
const name = String(params.model ?? '');
|
|
143
|
+
const model = models.get(name);
|
|
144
|
+
if (model === undefined)
|
|
145
|
+
throw problem(404, 'unknown-model', 'Unknown model', `No installed model is named '${name}'.`);
|
|
146
|
+
return model;
|
|
147
|
+
};
|
|
148
|
+
const query = (request) => (request.query ?? {});
|
|
149
|
+
const body = (request) => {
|
|
150
|
+
const b = request.body;
|
|
151
|
+
if (typeof b !== 'object' || b === null || Array.isArray(b))
|
|
152
|
+
throw problem(400, 'invalid-body', 'Invalid body', 'The body must be a JSON object.');
|
|
153
|
+
return b;
|
|
154
|
+
};
|
|
155
|
+
app.get('/api/v1/models/:model', async (request) => {
|
|
156
|
+
const model = modelOf(request.params);
|
|
157
|
+
const q = query(request);
|
|
158
|
+
const limit = q['limit'] === undefined ? 80 : Number(q['limit']);
|
|
159
|
+
const offset = q['offset'] === undefined ? 0 : Number(q['offset']);
|
|
160
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 1000)
|
|
161
|
+
throw problem(400, 'invalid-limit', 'Invalid limit', 'limit must be 1–1000.');
|
|
162
|
+
if (!Number.isInteger(offset) || offset < 0)
|
|
163
|
+
throw problem(400, 'invalid-offset', 'Invalid offset', 'offset must be 0 or more.');
|
|
164
|
+
const where = parseFilter(q['filter']);
|
|
165
|
+
const order = parseOrder(model, q['order']);
|
|
166
|
+
return request.env(async (env) => {
|
|
167
|
+
const fields = fieldsOf(model, env, q['fields']);
|
|
168
|
+
const found = await ref(env, model.name).search({
|
|
169
|
+
...(where === undefined ? {} : { where }),
|
|
170
|
+
...(order.length > 0 ? { order } : {}),
|
|
171
|
+
limit,
|
|
172
|
+
offset,
|
|
173
|
+
});
|
|
174
|
+
const items = await rows(found, fields);
|
|
175
|
+
if (q['count'] !== 'true')
|
|
176
|
+
return { items };
|
|
177
|
+
const [total] = (await ref(env, model.name).aggregate({
|
|
178
|
+
...(where === undefined ? {} : { where }),
|
|
179
|
+
measures: { count: 'count' },
|
|
180
|
+
}));
|
|
181
|
+
return { items, count: total?.count ?? 0 };
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
app.post('/api/v1/models/:model', async (request, reply) => {
|
|
185
|
+
const model = modelOf(request.params);
|
|
186
|
+
const values = body(request);
|
|
187
|
+
const outcome = await request.env((env) => idempotent(request, env, driver, async () => {
|
|
188
|
+
const created = await ref(env, model.name).create([coerceValues(model, values)]);
|
|
189
|
+
await env.flush(); // computes and constraints run now: the response shows the stored record
|
|
190
|
+
const result = await record(env, model, created.ids[0]);
|
|
191
|
+
return {
|
|
192
|
+
...result,
|
|
193
|
+
status: 201,
|
|
194
|
+
headers: {
|
|
195
|
+
...result.headers,
|
|
196
|
+
location: `/api/v1/models/${model.name}/${created.ids[0]}`,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}));
|
|
200
|
+
await send(reply, outcome);
|
|
201
|
+
});
|
|
202
|
+
app.get('/api/v1/models/:model/:id', async (request, reply) => {
|
|
203
|
+
const model = modelOf(request.params);
|
|
204
|
+
const id = idOf(request.params);
|
|
205
|
+
const outcome = await request.env((env) => record(env, model, id, list(query(request)['fields']).length > 0
|
|
206
|
+
? fieldsOf(model, env, query(request)['fields'])
|
|
207
|
+
: undefined));
|
|
208
|
+
await send(reply, outcome);
|
|
209
|
+
});
|
|
210
|
+
app.patch('/api/v1/models/:model/:id', async (request, reply) => {
|
|
211
|
+
const model = modelOf(request.params);
|
|
212
|
+
const id = idOf(request.params);
|
|
213
|
+
const values = body(request);
|
|
214
|
+
const expected = ifMatch(request);
|
|
215
|
+
const outcome = await request.env((env) => idempotent(request, env, driver, async () => {
|
|
216
|
+
await ref(env, model.name)
|
|
217
|
+
.browse([id])
|
|
218
|
+
.write(coerceValues(model, values), expected === undefined ? {} : { expect: { updatedAt: expected } });
|
|
219
|
+
await env.flush();
|
|
220
|
+
return record(env, model, id);
|
|
221
|
+
}));
|
|
222
|
+
await send(reply, outcome);
|
|
223
|
+
});
|
|
224
|
+
app.delete('/api/v1/models/:model/:id', async (request, reply) => {
|
|
225
|
+
const model = modelOf(request.params);
|
|
226
|
+
const id = idOf(request.params);
|
|
227
|
+
const expected = ifMatch(request);
|
|
228
|
+
const outcome = await request.env((env) => idempotent(request, env, driver, async () => {
|
|
229
|
+
const target = ref(env, model.name).browse([id]);
|
|
230
|
+
if (expected !== undefined)
|
|
231
|
+
await target.write({}, { expect: { updatedAt: expected } }); // locks and compares
|
|
232
|
+
await target.unlink();
|
|
233
|
+
return { status: 200, body: { deleted: 1 } };
|
|
234
|
+
}));
|
|
235
|
+
await send(reply, outcome);
|
|
236
|
+
});
|
|
237
|
+
app.post('/api/v1/models/:model/aggregate', async (request) => {
|
|
238
|
+
const model = modelOf(request.params);
|
|
239
|
+
const q = body(request);
|
|
240
|
+
return request.env(async (env) => ({ rows: await ref(env, model.name).aggregate(q) }));
|
|
241
|
+
});
|
|
242
|
+
app.post('/api/v1/models/:model/onchange', async (request) => {
|
|
243
|
+
const model = modelOf(request.params);
|
|
244
|
+
const input = body(request);
|
|
245
|
+
return request.env((env) => ref(env, model.name).onchange(input));
|
|
246
|
+
});
|
|
247
|
+
app.post('/api/v1/models/:model/:id/transitions/:name', async (request, reply) => {
|
|
248
|
+
const model = modelOf(request.params);
|
|
249
|
+
const id = idOf(request.params);
|
|
250
|
+
const name = String(request.params.name ?? '');
|
|
251
|
+
if (!model.transitions.includes(name))
|
|
252
|
+
throw problem(404, 'unknown-transition', 'Unknown transition', `${model.name} has no transition '${name}'.`, `Transitions: ${model.transitions.join(', ') || 'none'}.`);
|
|
253
|
+
const outcome = await request.env((env) => idempotent(request, env, driver, async () => {
|
|
254
|
+
const target = ref(env, model.name).browse([id]);
|
|
255
|
+
await target[name].call(target);
|
|
256
|
+
await env.flush();
|
|
257
|
+
return record(env, model, id);
|
|
258
|
+
}));
|
|
259
|
+
await send(reply, outcome);
|
|
260
|
+
});
|
|
261
|
+
// Name search (many2one pickers, display names of ids): the model's record name, within ACL and rules.
|
|
262
|
+
app.get('/api/v1/models/:model/names', async (request) => {
|
|
263
|
+
const model = modelOf(request.params);
|
|
264
|
+
const q = query(request);
|
|
265
|
+
const ids = list(q['ids']).map(Number);
|
|
266
|
+
if (ids.some((id) => !Number.isSafeInteger(id) || id <= 0))
|
|
267
|
+
throw problem(400, 'invalid-ids', 'Invalid ids', 'ids is a comma-separated list of record ids.');
|
|
268
|
+
const limit = q['limit'] === undefined ? 8 : Number(q['limit']);
|
|
269
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 100)
|
|
270
|
+
throw problem(400, 'invalid-limit', 'Invalid limit', 'limit must be 1–100.');
|
|
271
|
+
const recName = model.recName;
|
|
272
|
+
const text = typeof q['q'] === 'string' ? q['q'].trim() : '';
|
|
273
|
+
return request.env(async (env) => {
|
|
274
|
+
const where = ids.length > 0
|
|
275
|
+
? { id: { in: ids } }
|
|
276
|
+
: text === '' || recName === null
|
|
277
|
+
? undefined
|
|
278
|
+
: { [recName]: { ilike: `%${text.replace(/[\\%_]/g, (c) => `\\${c}`)}%` } };
|
|
279
|
+
const found = await ref(env, model.name).search({
|
|
280
|
+
...(where === undefined ? {} : { where }),
|
|
281
|
+
...(ids.length > 0 ? {} : { limit }),
|
|
282
|
+
});
|
|
283
|
+
const loaded = found.length === 0 ? found : await found.load(['displayName']);
|
|
284
|
+
return { items: loaded.length === 0 ? [] : loaded.read(['displayName']) };
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
app.post('/api/v1/models/:model/export', async (request, reply) => {
|
|
288
|
+
const model = modelOf(request.params);
|
|
289
|
+
const q = body(request);
|
|
290
|
+
const format = q['format'] ?? 'csv';
|
|
291
|
+
if (format !== 'csv' && format !== 'json')
|
|
292
|
+
throw problem(400, 'invalid-format', 'Invalid format', 'format is csv or json (xlsx: @isahaq/kosh-reporting).');
|
|
293
|
+
const max = format === 'csv' ? STREAM_LIMIT : EXPORT_LIMIT;
|
|
294
|
+
const limit = q['limit'] === undefined ? max : Number(q['limit']);
|
|
295
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > max)
|
|
296
|
+
throw problem(400, 'invalid-limit', 'Invalid limit', `limit must be 1–${max}.`);
|
|
297
|
+
const where = q['filter'] === undefined ? undefined : parseFilter(JSON.stringify(q['filter']));
|
|
298
|
+
const order = parseOrder(model, Array.isArray(q['order']) ? q['order'].join(',') : q['order']);
|
|
299
|
+
const fieldsParam = Array.isArray(q['fields']) ? q['fields'].join(',') : q['fields'];
|
|
300
|
+
const record = (env, fields, count) => audit(env, {
|
|
301
|
+
kind: 'data.export',
|
|
302
|
+
summary: `Exported ${count} ${model.name} record(s) as ${format}.`,
|
|
303
|
+
targetModel: model.name,
|
|
304
|
+
details: { fields: fields.map((f) => f.key), count, filter: where ?? null },
|
|
305
|
+
ip: request.ip,
|
|
306
|
+
});
|
|
307
|
+
if (format === 'json') {
|
|
308
|
+
const result = await request.env(async (env) => {
|
|
309
|
+
env.access.check(model.name, 'export'); // 403 without the export permission
|
|
310
|
+
const fields = fieldsOf(model, env, fieldsParam);
|
|
311
|
+
const found = await ref(env, model.name).search({
|
|
312
|
+
...(where === undefined ? {} : { where }),
|
|
313
|
+
...(order.length > 0 ? { order } : {}),
|
|
314
|
+
limit,
|
|
315
|
+
});
|
|
316
|
+
const items = await rows(found, fields);
|
|
317
|
+
await record(env, fields, items.length);
|
|
318
|
+
return items;
|
|
319
|
+
});
|
|
320
|
+
await reply.send({ items: result });
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
// CSV is streamed: the header row at once, then pages of EXPORT_PAGE rows (keyset by id, or offset with a custom
|
|
324
|
+
// order), all in one transaction (a consistent snapshot), the cache released after each page (bounded memory).
|
|
325
|
+
let streaming = false;
|
|
326
|
+
try {
|
|
327
|
+
await request.env(async (env) => {
|
|
328
|
+
env.access.check(model.name, 'export');
|
|
329
|
+
const fields = fieldsOf(model, env, fieldsParam);
|
|
330
|
+
const keys = ['id', ...fields.map((f) => f.key).filter((k) => k !== 'id')];
|
|
331
|
+
reply.hijack();
|
|
332
|
+
streaming = true;
|
|
333
|
+
reply.raw.writeHead(200, {
|
|
334
|
+
...reply.getHeaders(),
|
|
335
|
+
'content-type': 'text/csv; charset=utf-8',
|
|
336
|
+
'content-disposition': `attachment; filename="${model.name}.csv"`,
|
|
337
|
+
});
|
|
338
|
+
const write = (text) => reply.raw.write(text)
|
|
339
|
+
? Promise.resolve()
|
|
340
|
+
: new Promise((resolve) => reply.raw.once('drain', () => resolve()));
|
|
341
|
+
await write(`${keys.map(csvCell).join(',')}\r\n`);
|
|
342
|
+
let count = 0;
|
|
343
|
+
let last = 0;
|
|
344
|
+
while (count < limit && !reply.raw.destroyed) {
|
|
345
|
+
const size = Math.min(EXPORT_PAGE, limit - count);
|
|
346
|
+
const keyset = order.length === 0;
|
|
347
|
+
const pageWhere = keyset
|
|
348
|
+
? where === undefined
|
|
349
|
+
? { id: { gt: last } }
|
|
350
|
+
: { and: [where, { id: { gt: last } }] }
|
|
351
|
+
: where;
|
|
352
|
+
const found = await ref(env, model.name).search({
|
|
353
|
+
...(pageWhere === undefined ? {} : { where: pageWhere }),
|
|
354
|
+
order: keyset ? ['id asc'] : [...order, 'id asc'],
|
|
355
|
+
limit: size,
|
|
356
|
+
...(keyset ? {} : { offset: count }),
|
|
357
|
+
});
|
|
358
|
+
if (found.length === 0)
|
|
359
|
+
break;
|
|
360
|
+
const page = await rows(found, fields);
|
|
361
|
+
await write(page.map((r) => `${keys.map((k) => csvCell(r[k])).join(',')}\r\n`).join(''));
|
|
362
|
+
count += page.length;
|
|
363
|
+
last = page[page.length - 1]?.['id'];
|
|
364
|
+
env.releaseCache(model.name);
|
|
365
|
+
if (page.length < size)
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
await record(env, fields, count);
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
if (!streaming)
|
|
373
|
+
throw error; // before the first byte: a normal problem response
|
|
374
|
+
request.log.error({ err: error }, 'export failed while streaming');
|
|
375
|
+
reply.raw.destroy(); // the client sees an aborted download, not a short but valid file
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
reply.raw.end(); // after the commit: the export and its audit event exist together
|
|
379
|
+
});
|
|
380
|
+
app.post('/api/v1/models/:model/import', async (request, reply) => {
|
|
381
|
+
const model = modelOf(request.params);
|
|
382
|
+
const input = body(request)['rows'];
|
|
383
|
+
if (!Array.isArray(input) || input.length === 0 || input.length > IMPORT_LIMIT)
|
|
384
|
+
throw problem(400, 'invalid-rows', 'Invalid rows', `rows must be a non-empty array of at most ${IMPORT_LIMIT} objects.`);
|
|
385
|
+
for (const row of input)
|
|
386
|
+
if (typeof row !== 'object' || row === null || Array.isArray(row))
|
|
387
|
+
throw problem(400, 'invalid-rows', 'Invalid rows', 'Each row is an object of field values.');
|
|
388
|
+
const outcome = await request.env((env) => idempotent(request, env, driver, async () => {
|
|
389
|
+
env.access.check(model.name, 'import'); // and `create`, checked by Shutro
|
|
390
|
+
const created = await ref(env, model.name).create(input.map((row) => coerceValues(model, row)));
|
|
391
|
+
await env.flush(); // all-or-nothing: constraints run before the response
|
|
392
|
+
await audit(env, {
|
|
393
|
+
kind: 'data.import',
|
|
394
|
+
summary: `Imported ${created.ids.length} ${model.name} record(s).`,
|
|
395
|
+
targetModel: model.name,
|
|
396
|
+
details: { count: created.ids.length },
|
|
397
|
+
ip: request.ip,
|
|
398
|
+
});
|
|
399
|
+
return { status: 201, body: { created: created.ids } };
|
|
400
|
+
}));
|
|
401
|
+
await send(reply, outcome);
|
|
402
|
+
});
|
|
403
|
+
app.get('/api/v1/meta/:model', async (request) => {
|
|
404
|
+
const model = modelOf(request.params);
|
|
405
|
+
return request.env(async (env) => {
|
|
406
|
+
env.access.check(model.name, 'read');
|
|
407
|
+
return {
|
|
408
|
+
name: model.name,
|
|
409
|
+
label: model.label,
|
|
410
|
+
operations: Object.fromEntries(PERMS.map((p) => [p, env.access.can(model.name, p)])),
|
|
411
|
+
transitions: model.transitions,
|
|
412
|
+
onchange: model.onchange,
|
|
413
|
+
fields: model.fields
|
|
414
|
+
.filter((f) => env.access.canField(model.name, f.key, 'read'))
|
|
415
|
+
.map((f) => ({
|
|
416
|
+
key: f.key,
|
|
417
|
+
kind: f.kind,
|
|
418
|
+
label: f.label,
|
|
419
|
+
required: f.required,
|
|
420
|
+
readonly: f.readonly || !env.access.canField(model.name, f.key, 'write'),
|
|
421
|
+
...(f.target === null ? {} : { target: f.target }),
|
|
422
|
+
...(f.options === null
|
|
423
|
+
? {}
|
|
424
|
+
: { options: f.options.map(([value, label]) => ({ value, label })) }),
|
|
425
|
+
})),
|
|
426
|
+
};
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
app.get('/api/v1/openapi.json', async (request) => {
|
|
430
|
+
if (request.identity === null)
|
|
431
|
+
throw problem(401, 'unauthenticated', 'Not authenticated', 'The API description needs an authenticated user.', 'Sign in first.');
|
|
432
|
+
return options.openapi();
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/api/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Views, actions and searches (RFC 0004): collected from the manifests, extended by anchors in dependency order,
|
|
3
|
+
* validated against the installed models when the server starts, and served per user: fields the user may not read
|
|
4
|
+
* are removed, fields they may not write are marked read-only, and buttons for transitions they may not run are
|
|
5
|
+
* dropped (RFC 0003). The server re-checks every write anyway; this keeps the UI honest, not secure.
|
|
6
|
+
*
|
|
7
|
+
* - `GET /api/v1/views/:id` one view, for the user, with the metadata of its fields
|
|
8
|
+
* - `GET /api/v1/views?model=&type=` the model's view of that type
|
|
9
|
+
* - `GET /api/v1/search/:model` the search definition, for the user
|
|
10
|
+
*/
|
|
11
|
+
import type { KoshModule } from '@isahaq/kosh-modules-sdk';
|
|
12
|
+
import { type ResolvedView, type SearchSpec, type ViewDefinition, type ViewType, type WindowAction } from '@isahaq/kosh-views';
|
|
13
|
+
import type { FastifyInstance } from 'fastify';
|
|
14
|
+
import type { Env } from '../orm.js';
|
|
15
|
+
import type { ApiModel } from './metadata.js';
|
|
16
|
+
/** A field as the UI needs it to render and edit. */
|
|
17
|
+
export interface ViewField {
|
|
18
|
+
readonly key: string;
|
|
19
|
+
readonly kind: string;
|
|
20
|
+
readonly label: string;
|
|
21
|
+
readonly required: boolean;
|
|
22
|
+
readonly readonly: boolean;
|
|
23
|
+
readonly target?: string;
|
|
24
|
+
readonly options?: readonly {
|
|
25
|
+
readonly value: string;
|
|
26
|
+
readonly label: string;
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
/** What `GET /api/v1/views/:id` returns. */
|
|
30
|
+
export interface ServedView {
|
|
31
|
+
readonly view: ViewDefinition;
|
|
32
|
+
/** Model → field key → metadata, for every field the view shows (including line columns). */
|
|
33
|
+
readonly fields: Readonly<Record<string, Readonly<Record<string, ViewField>>>>;
|
|
34
|
+
/** Transitions of the model the user may run, with their source and target states. */
|
|
35
|
+
readonly transitions: readonly {
|
|
36
|
+
name: string;
|
|
37
|
+
field: string;
|
|
38
|
+
from: readonly string[];
|
|
39
|
+
to: string;
|
|
40
|
+
}[];
|
|
41
|
+
/** The view's model may be written, created, deleted by the user. */
|
|
42
|
+
readonly operations: {
|
|
43
|
+
readonly create: boolean;
|
|
44
|
+
readonly write: boolean;
|
|
45
|
+
readonly unlink: boolean;
|
|
46
|
+
};
|
|
47
|
+
/** Fields whose changes run the model's onchange (form assistance). */
|
|
48
|
+
readonly onchange: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
/** The views, actions and searches of a loaded module set. */
|
|
51
|
+
export declare class ViewRegistry {
|
|
52
|
+
#private;
|
|
53
|
+
readonly views: ReadonlyMap<string, ResolvedView>;
|
|
54
|
+
readonly actions: ReadonlyMap<string, WindowAction>;
|
|
55
|
+
readonly searches: ReadonlyMap<string, SearchSpec>;
|
|
56
|
+
/** @throws {ServerConfigError} for invalid or conflicting views, actions and searches */
|
|
57
|
+
constructor(modules: readonly KoshModule[], models: ReadonlyMap<string, ApiModel>);
|
|
58
|
+
/** The first view of `type` for `model`, in module order. */
|
|
59
|
+
defaultView(model: string, type: ViewType): string | undefined;
|
|
60
|
+
/** The view for `env`'s user. @throws {AccessError} without read access */
|
|
61
|
+
serve(env: Env, id: string): ServedView;
|
|
62
|
+
/** The search definition for `env`'s user: options on fields they may not read are left out. */
|
|
63
|
+
serveSearch(env: Env, model: string): SearchSpec;
|
|
64
|
+
/** Registers the routes. */
|
|
65
|
+
register(app: FastifyInstance): void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/api/views.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAKL,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,QAAQ,EAIb,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,eAAe,CAAC;AAExD,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClF;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;QACxB,EAAE,EAAE,MAAM,CAAC;KACZ,EAAE,CAAC;IACJ,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAsBD,8DAA8D;AAC9D,qBAAa,YAAY;;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAGnD,yFAAyF;IACzF,YAAY,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,EAyEhF;IAED,6DAA6D;IAC7D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAG7D;IAED,2EAA2E;IAC3E,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,CAmJtC;IAED,gGAAgG;IAChG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAiB/C;IAQD,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAiCnC;CACF"}
|