@datacapy/server 0.1.0 → 0.2.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/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  # @datacapy/server
4
4
 
5
+ Part of the [DataCapy monorepo](https://github.com/datacapy/datacapy).
6
+
5
7
  An HTTP API layer for [Datacapy](../../README.md) applications. You describe
6
8
  each endpoint in a plain config object; @datacapy/server maps it to an
7
9
  [Express](https://expressjs.com) route, validates and casts the request data,
@@ -28,7 +30,7 @@ which roles the request has. See [Access control](#access-control).
28
30
  ## Install
29
31
 
30
32
  ```bash
31
- npm install @datacapy/server
33
+ pnpm add @datacapy/server
32
34
  ```
33
35
 
34
36
  It depends on `@datacapy/om` (models, services, repositories) and `express`.
@@ -341,14 +343,14 @@ A role is defined by a class extending `ServerAclRoleAssessor`. Register it with
341
343
  | `this.repos` | The model's repositories, for lookups |
342
344
 
343
345
  ```ts
344
- class ProjectAdmin extends ServerAclRoleAssessor {
346
+ class WorkspaceAdmin extends ServerAclRoleAssessor {
345
347
  constructor() {
346
- super('projectAdmin')
348
+ super('workspaceAdmin')
347
349
  }
348
350
 
349
- async hasRole({ jwt, projectId }) {
351
+ async hasRole({ jwt, workspaceId }) {
350
352
  const ids: string[] = jwt?.adminOf ?? []
351
- return ids.includes(projectId)
353
+ return ids.includes(workspaceId)
352
354
  }
353
355
  }
354
356
  ```
@@ -380,7 +382,7 @@ Use conditions only for roles you allow, and put them last.
380
382
  `initContext`, and never declare request data whose name matches an ACL
381
383
  context key.
382
384
  - Scope by role, not by a check inside the method. For an endpoint that acts on
383
- one project, use a role that checks the caller's rights on the `projectId`
385
+ one workspace, use a role that checks the caller's rights on the `workspaceId`
384
386
  argument, rather than a generic role plus a lookup.
385
387
 
386
388
  ## Body parsing
@@ -415,9 +417,7 @@ Use this to switch endpoints off per environment without editing the config.
415
417
  new Server({
416
418
  port: 3838,
417
419
  path: '/api',
418
- model: {
419
- /* ModelManager config */
420
- },
420
+ model: {/* ModelManager config */},
421
421
  })
422
422
  new Server(config, existingModelManager)
423
423
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"request-data-parser.d.ts","sourceRoot":"","sources":["../../src/remote-object/request-data-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAM/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAgD;gBAExD,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAOxE,gBAAgB,CACd,iBAAiB,EAAE,GAAG,EACtB,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACrB;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAgBzB,OAAO,CAAC,mBAAmB;IAuC3B,mBAAmB,CAAC,iBAAiB,EAAE,GAAG,GAAG,GAAG;IA8B1C,mBAAmB,CACvB,WAAW,EAAE,GAAG,EAChB,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CAQ/C"}
1
+ {"version":3,"file":"request-data-parser.d.ts","sourceRoot":"","sources":["../../src/remote-object/request-data-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAM/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAgD;gBAExD,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAOxE,gBAAgB,CACd,iBAAiB,EAAE,GAAG,EACtB,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACrB;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAgBzB,OAAO,CAAC,mBAAmB;IAkD3B,mBAAmB,CAAC,iBAAiB,EAAE,GAAG,GAAG,GAAG;IA8B1C,mBAAmB,CACvB,WAAW,EAAE,GAAG,EAChB,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CAQ/C"}
@@ -31,6 +31,14 @@ class RequestDataParser {
31
31
  case 'header':
32
32
  value = container.request.get(srcPath);
33
33
  break;
34
+ case 'request':
35
+ value = om_1.ObjectPathAccessor.getPath(srcPath, container.request);
36
+ if (value === undefined) {
37
+ value = srcPath
38
+ .split('.')
39
+ .reduce((acc, key) => acc === null || acc === void 0 ? void 0 : acc[key], container.request);
40
+ }
41
+ break;
34
42
  case 'container':
35
43
  value = om_1.ObjectPathAccessor.getPath(srcPath, container);
36
44
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"request-data-parser.js","sourceRoot":"","sources":["../../src/remote-object/request-data-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"request-data-parser.js","sourceRoot":"","sources":["../../src/remote-object/request-data-parser.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { HttpServerManagerInterface, LoggerInterface } from './interfaces';
4
4
  import { ServerConfig } from '../server-config';
5
5
  export declare class HttpServerManager implements HttpServerManagerInterface {
6
6
  private server;
7
+ private connections;
7
8
  private app;
8
9
  private config;
9
10
  private logger;
@@ -11,6 +12,6 @@ export declare class HttpServerManager implements HttpServerManagerInterface {
11
12
  constructor(app: express.Application, config: ServerConfig, logger: LoggerInterface, onShutdown: () => Promise<void>);
12
13
  start(): Promise<void>;
13
14
  shutdown(): Promise<any>;
14
- getServer(): _Http.Server | null;
15
+ getServer(): _Http.Server;
15
16
  }
16
17
  //# sourceMappingURL=http-server-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-server-manager.d.ts","sourceRoot":"","sources":["../../src/server/http-server-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,CAAA;AAC7B,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAM/C,qBAAa,iBAAkB,YAAW,0BAA0B;IAClE,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAqB;gBAGrC,GAAG,EAAE,OAAO,CAAC,WAAW,EACxB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAS3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAK9B,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;CAGjC"}
1
+ {"version":3,"file":"http-server-manager.d.ts","sourceRoot":"","sources":["../../src/server/http-server-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,CAAA;AAE7B,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAM/C,qBAAa,iBAAkB,YAAW,0BAA0B;IAClE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAqB;gBAGrC,GAAG,EAAE,OAAO,CAAC,WAAW,EACxB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAa3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAkB9B,SAAS,IAAI,KAAK,CAAC,MAAM;CAG1B"}
@@ -1,16 +1,55 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.HttpServerManager = void 0;
37
+ const _Http = __importStar(require("http"));
4
38
  class HttpServerManager {
5
39
  constructor(app, config, logger, onShutdown) {
40
+ this.connections = new Set();
6
41
  this.app = app;
7
42
  this.config = config;
8
43
  this.logger = logger;
9
44
  this.onShutdown = onShutdown;
10
- this.server = null;
45
+ this.server = _Http.createServer(this.app);
46
+ this.server.on('connection', (socket) => {
47
+ this.connections.add(socket);
48
+ socket.on('close', () => this.connections.delete(socket));
49
+ });
11
50
  }
12
51
  async start() {
13
- this.server = this.app.listen(this.config.port, () => {
52
+ this.server.listen(this.config.port, () => {
14
53
  this.logger.info('Listening on port ' + this.config.port);
15
54
  });
16
55
  process.on('SIGINT', () => {
@@ -30,7 +69,18 @@ class HttpServerManager {
30
69
  }
31
70
  async shutdown() {
32
71
  this.logger.info('Shutting down');
33
- return this.server ? this.server.close() : undefined;
72
+ return new Promise((resolve, reject) => {
73
+ this.server.close((error) => {
74
+ if (error && error.code !== 'ERR_SERVER_NOT_RUNNING') {
75
+ reject(error);
76
+ return;
77
+ }
78
+ resolve();
79
+ });
80
+ for (const socket of this.connections) {
81
+ socket.destroy();
82
+ }
83
+ });
34
84
  }
35
85
  getServer() {
36
86
  return this.server;
@@ -1 +1 @@
1
- {"version":3,"file":"http-server-manager.js","sourceRoot":"","sources":["../../src/server/http-server-manager.ts"],"names":[],"mappings":";;;AAUA,MAAa,iBAAiB;IAO5B,YACE,GAAwB,EACxB,MAAoB,EACpB,MAAuB,EACvB,UAA+B;QAE/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,UAAU,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,IAAI,CAAC,CAAA;YACV,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,UAAU,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,IAAI,CAAC,CAAA;YACV,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF;AAlDD,8CAkDC"}
1
+ {"version":3,"file":"http-server-manager.js","sourceRoot":"","sources":["../../src/server/http-server-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAW7B,MAAa,iBAAiB;IAQ5B,YACE,GAAwB,EACxB,MAAoB,EACpB,MAAuB,EACvB,UAA+B;QAVzB,gBAAW,GAAgB,IAAI,GAAG,EAAE,CAAA;QAY1C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAc,EAAE,EAAE;YAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC5B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,UAAU,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,IAAI,CAAC,CAAA;YACV,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,UAAU,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC,EAAE,IAAI,CAAC,CAAA;YACV,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACjC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAA6B,EAAE,EAAE;gBAElD,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;oBACrD,MAAM,CAAC,KAAK,CAAC,CAAA;oBACb,OAAM;gBACR,CAAC;gBACD,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;YAEF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM,CAAC,OAAO,EAAE,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF;AApED,8CAoEC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@datacapy/server",
3
3
  "type": "commonjs",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "description": "Datacapy server: REST API server over the object model",
6
6
  "main": "dist/index",
7
7
  "types": "dist/index.d.ts",
@@ -21,11 +21,11 @@
21
21
  "@types/bcrypt": "^6.0.0",
22
22
  "@types/express": "^5.0.6",
23
23
  "@types/jest": "^30.0.0",
24
- "@types/node": "^25.9.8",
25
- "eslint": "^10.11.0",
24
+ "@types/node": "^26.6.4",
25
+ "eslint": "^10.12.0",
26
26
  "husky": "^9.1.7",
27
27
  "jest": "^30.5.2",
28
- "lint-staged": "^15.5.2",
28
+ "lint-staged": "^17.6.0",
29
29
  "prettier": "3.9.9",
30
30
  "ts-jest": "^29.4.14",
31
31
  "ts-node": "^10.9.2",
@@ -37,8 +37,8 @@
37
37
  "body-parser": "^2.3.0",
38
38
  "express": "^5.2.1",
39
39
  "merge": "^2.1.1",
40
- "mongodb": "^6.21.0",
41
- "@datacapy/om": "0.1.0"
40
+ "mongodb": "^7.6.0",
41
+ "@datacapy/om": "0.2.0"
42
42
  },
43
43
  "files": [
44
44
  "/dist",