Skip to content

Commit f07ccdd

Browse files
ymc9jawadst
andauthored
feat: RESTful style server API handler (#405)
Co-authored-by: Jawad <jawad.stouli@gmail.com>
1 parent 86c57fd commit f07ccdd

20 files changed

Lines changed: 5710 additions & 2124 deletions

File tree

packages/next/src/request-handler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ async function handleRequest(
168168
message: err.message,
169169
});
170170
} else {
171-
logError(options, undefined, (err as Error).message);
171+
const _err = err as Error;
172+
logError(options, undefined, _err.message + (_err.stack ? '\n' + _err.stack : ''));
172173
res.status(500).send({
173174
message: (err as Error).message,
174175
});

packages/runtime/src/enhancements/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './omit';
22
export * from './password';
33
export * from './policy';
44
export * from './preset';
5+
export * from './utils';

packages/runtime/src/enhancements/policy/policy-utils.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ import { getVersion } from '../../version';
1818
import { resolveField } from '../model-meta';
1919
import { NestedWriteVisitor, VisitorContext } from '../nested-write-vistor';
2020
import { ModelMeta, PolicyDef, PolicyFunc } from '../types';
21-
import { enumerate, getModelFields, prismaClientKnownRequestError, prismaClientUnknownRequestError } from '../utils';
21+
import {
22+
enumerate,
23+
getIdFields,
24+
getModelFields,
25+
prismaClientKnownRequestError,
26+
prismaClientUnknownRequestError,
27+
} from '../utils';
2228
import { Logger } from './logger';
2329

2430
/**
@@ -858,15 +864,7 @@ export class PolicyUtil {
858864
* Gets "id" field for a given model.
859865
*/
860866
getIdFields(model: string) {
861-
const fields = this.modelMeta.fields[lowerCaseFirst(model)];
862-
if (!fields) {
863-
throw this.unknownError(`Unable to load fields for ${model}`);
864-
}
865-
const result = Object.values(fields).filter((f) => f.isId);
866-
if (result.length === 0) {
867-
throw this.unknownError(`model ${model} does not have an id field`);
868-
}
869-
return result;
867+
return getIdFields(this.modelMeta, model);
870868
}
871869

872870
/**

packages/runtime/src/enhancements/utils.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
/* eslint-disable @typescript-eslint/no-var-requires */
22

33
import { AUXILIARY_FIELDS } from '@zenstackhq/sdk';
4+
import { lowerCaseFirst } from 'lower-case-first';
45
import path from 'path';
56
import * as util from 'util';
67
import { DbClientContract } from '../types';
8+
import { ModelMeta } from './types';
79

810
/**
911
* Wraps a value into array if it's not already one
@@ -19,6 +21,21 @@ export function getModelFields(data: object) {
1921
return data ? Object.keys(data).filter((f) => !AUXILIARY_FIELDS.includes(f)) : [];
2022
}
2123

24+
/**
25+
* Gets id fields for the given model.
26+
*/
27+
export function getIdFields(modelMeta: ModelMeta, model: string) {
28+
const fields = modelMeta.fields[lowerCaseFirst(model)];
29+
if (!fields) {
30+
throw new Error(`Unable to load fields for ${model}`);
31+
}
32+
const result = Object.values(fields).filter((f) => f.isId);
33+
if (result.length === 0) {
34+
throw new Error(`model ${model} does not have an id field`);
35+
}
36+
return result;
37+
}
38+
2239
/**
2340
* Array or scalar
2441
*/
@@ -35,6 +52,9 @@ export function enumerate<T>(x: Enumerable<T>) {
3552
}
3653
}
3754

55+
/**
56+
* Formats an object for pretty printing.
57+
*/
3858
export function formatObject(value: unknown) {
3959
return util.formatWithOptions({ depth: 10 }, value);
4060
}

packages/server/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,19 @@
2727
"@zenstackhq/runtime": "workspace:*",
2828
"@zenstackhq/sdk": "workspace:*",
2929
"change-case": "^4.1.2",
30+
"lower-case-first": "^2.0.2",
3031
"tiny-invariant": "^1.3.1",
32+
"ts-japi": "^1.8.0",
3133
"upper-case-first": "^2.0.2",
34+
"url-pattern": "^1.0.3",
35+
"zod": "3.21.1",
3236
"zod-validation-error": "^0.2.1"
3337
},
3438
"devDependencies": {
3539
"@types/body-parser": "^1.19.2",
3640
"@types/express": "^4.17.17",
3741
"@types/jest": "^29.5.0",
42+
"@types/lower-case-first": "^1.0.1",
3843
"@types/supertest": "^2.0.12",
3944
"@types/upper-case-first": "^1.1.2",
4045
"@zenstackhq/testtools": "workspace:*",

0 commit comments

Comments
 (0)