integreat 0.8.5 → 0.8.7

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
@@ -230,9 +230,9 @@ to signal that this is an authenticated service.
230
230
 
231
231
  ### Endpoints
232
232
 
233
- A service will have at least one endpoint, but often there will be several. An
234
- endpoint is a definition of one of the ways Integreat may interact with a
235
- service. You decide how you want to set up the endpoints and what is the right
233
+ A service will have at least one endpoint, but often there will be several.
234
+ Endpoints are the definitions of the different ways Integreat may interact with
235
+ a service. You decide how you want to set up the endpoints and what is the right
236
236
  "endpoint design" for a service, but there might be one endpoint for each
237
237
  operation that can be done with a type of data.
238
238
 
@@ -259,8 +259,9 @@ different database operations (through the transporter).
259
259
 
260
260
  When you dispatch an action, Integreat will figure out what service and what
261
261
  endpoint to send the action to. The target service is often specified in the
262
- action payload with the `service` property, but if not, the default service of
263
- the schema specified with the payload `type` property, will be used.
262
+ action payload with the `targetService` (or shorthand `service`) property, but
263
+ if not, the default service of the schema specified with the payload `type`
264
+ property, will be used.
264
265
 
265
266
  The matching to an endpoint is done by finding the endpoint whose `match` object
266
267
  matches the action with most accuracy. The rules of the endpoint matching is
@@ -279,6 +280,12 @@ Here's the format of an endpoint definition:
279
280
  incoming: <boolean>,
280
281
  filters: {...}
281
282
  },
283
+ validate: [
284
+ {
285
+ condition: <mutation pipeline>,
286
+ failResponse: <response object>
287
+ }
288
+ ]
282
289
  mutation: <mutation pipeline>,
283
290
  options: {...},
284
291
  allowRawRequest: <boolean>,
@@ -297,6 +304,15 @@ specify a few things:
297
304
  the action you dispatch.
298
305
  - `match`: The match object is used to decide the right endpoint for an action.
299
306
  More one this in the [Match properties](#match-properties) section.
307
+ - `validate`: This is an array of condition that have to be met in order for
308
+ Integreat to proceed with the endpoint. This may sound similar to `match`, but
309
+ `validate` is only processed after a match is found, and if the validation
310
+ fails, no other endpoint is considered and the `failResponse` is returned as
311
+ the response from this action without ever running mutations or sending
312
+ anything to the service (or a `badrequest` response if no `failResponse` is
313
+ provided). The `condition` is a mutation pipeline that should return a truthy
314
+ value for the validation to pass. Any falsy value will cause the validation to
315
+ fail. If `validate` is missing or an empty array, no validation will be done.
300
316
  - `mutation`: A mutation pipeline for the endpoint. The pipeline is run for both
301
317
  actions going to a service and the response coming back, so keep this in mind
302
318
  when you set up this pipeline. See [Mutation pipelines](#mutations)
@@ -24,6 +24,10 @@ async function runAsIndividualActions(action, service, mapPerId) {
24
24
  if (!endpoint) {
25
25
  return createNoEndpointError(action, service.id);
26
26
  }
27
+ const validateResponse = await endpoint.validateAction(action);
28
+ if (validateResponse) {
29
+ return validateResponse;
30
+ }
27
31
  return combineResponses(action, await Promise.all(actions.map((action) => pLimit(1)(() => mapPerId(endpoint)(action)))));
28
32
  }
29
33
  const doRunIndividualIds = (action, endpoint) => Array.isArray(action.payload.id) &&
@@ -37,6 +41,10 @@ async function runOneOrMany(action, service, mapPerId) {
37
41
  if (!endpoint) {
38
42
  return createNoEndpointError(action, service.id);
39
43
  }
44
+ const validateResponse = await endpoint.validateAction(action);
45
+ if (validateResponse) {
46
+ return validateResponse;
47
+ }
40
48
  return mapPerId(endpoint)(action);
41
49
  }
42
50
  const runOne = (service) => (endpoint) => async function (action) {
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/handlers/get.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/handlers/get.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,OAAO,CAAA;AAC5B,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,yBAAyB,MAAM,uCAAuC,CAAA;AAK7E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;AAE/B,MAAM,eAAe,GAAG,CAAC,QAAkB,EAAE,EAAE,CAC7C,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAA;AAE5D,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAU,EAAE,EAAE,CACtD,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAEnD,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,SAAqB,EAAY,EAAE,CAC3E,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC,CAAC,mBAAmB,CACjB,uCAAuC,eAAe,CAAC,MAAM,CAAC,UAAU,CACzE;IACH,CAAC,CAAC;QACE,GAAG,MAAM,CAAC,QAAQ;QAClB,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC/B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAChE;KACF,CAAA;AAEP,MAAM,cAAc,GAAG,CAAC,QAAmB,EAAE,EAAE,CAC7C,QAAQ,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAA;AAEtC,MAAM,oBAAoB,GAAG,CAC3B,MAAc,EACd,EAAsB,EACd,EAAE,CAAC,CAAC;IACZ,GAAG,MAAM;IACT,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE;CACnC,CAAC,CAAA;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE,CAClE,mBAAmB,CACjB,wBAAwB,MAAM,CAAC,IAAI,wBAAwB,SAAS,IAAI,EACxE,YAAY,CACb,CAAA;AAEH,KAAK,UAAU,sBAAsB,CACnC,MAAc,EACd,OAAgB,EAChB,QAAuE;IAEvE,MAAM,OAAO,GAAI,MAAM,CAAC,OAAO,CAAC,EAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5D,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CACpC,CAAA;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;KACjD;IACD,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9D,IAAI,gBAAgB,EAAE;QACpB,OAAO,gBAAgB,CAAA;KACxB;IAED,OAAO,gBAAgB,CACrB,MAAM,EACN,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CACrE,CACF,CAAA;AACH,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,QAAmB,EAAE,EAAE,CACjE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,EAAE,UAAU;IACvB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;AAE3B,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,OAAgB,EAChB,QAAuE;IAEvE,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACnD,IAAI,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QACxC,OAAO,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;KACzD;IACD,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;KACjD;IACD,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9D,IAAI,gBAAgB,EAAE;QACpB,OAAO,gBAAgB,CAAA;KACxB;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC,QAAkB,EAAE,EAAE,CAC1D,KAAK,WAAW,MAAc;IAC5B,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClD,OAAO,MAAM,OAAO,CAAC,cAAc,CACjC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EACrC,QAAQ,CACT,CAAA;AACH,CAAC,CAAA;AAKH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,GAAG,CAC/B,MAAc,EACd,EAAE,UAAU,EAA0B;IAEtC,MAAM,EACJ,IAAI,EACJ,aAAa,EAAE,SAAS,EACxB,QAAQ,EAAE,UAAU,GACrB,GAAG,MAAM,CAAC,OAAO,CAAA;IAElB,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;QACxC,OAAO,mBAAmB,CACxB,mDAAmD,EACnD,UAAU,CACX,CAAA;KACF;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC3C,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;KACzD;IAED,MAAM,aAAa,GAAG,UAAU;QAC9B,CAAC,CAAC,aAAa,UAAU,GAAG;QAC5B,CAAC,CAAC,2BAA2B,IAAI,aAAa,EAAE,GAAG,CAAA;IACrD,KAAK,CAAC,kCAAkC,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CAAA;IAEpE,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAEnD,OAAO,MAAM,YAAY,CACvB,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,EACnC,OAAO,EACP,MAAM,CAAC,OAAO,CAAC,CAChB,CAAA;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ export * as middleware from './middleware/index.js';
8
8
  export * as adapters from './adapters/index.js';
9
9
  export { createAction } from './utils/action.js';
10
10
  export default {
11
- version: '0.8.5',
11
+ version: '0.8.7',
12
12
  create,
13
13
  mergeDefinitions,
14
14
  mergeResources,
@@ -17,6 +17,28 @@ function mutateAction(mutator, isRev, normalize = async (action) => action, seri
17
17
  return rev ? await serialize(mutatedAction) : mutatedAction;
18
18
  };
19
19
  }
20
+ function prepareValidator(validate, mapOptions) {
21
+ if (!Array.isArray(validate) || validate.length === 0) {
22
+ return async () => null;
23
+ }
24
+ const validators = validate.map(({ condition, failResponse }) => ({
25
+ validate: mapTransform(condition, mapOptions),
26
+ failResponse: typeof failResponse === 'string'
27
+ ? { status: 'badrequest', error: failResponse }
28
+ : failResponse,
29
+ }));
30
+ return async function validateAction(action) {
31
+ for (const { validate, failResponse } of validators) {
32
+ const result = validate(action);
33
+ if (!result)
34
+ return (failResponse || {
35
+ status: 'badrequest',
36
+ error: 'Did not satisfy endpoint validation',
37
+ });
38
+ }
39
+ return null;
40
+ };
41
+ }
20
42
  const flattenIfOneOrNone = (arr) => arr.length <= 1 ? arr[0] : arr;
21
43
  const setModifyFlag = (def) => isObject(def) ? { ...def, $modify: true } : def;
22
44
  const prepareAdapter = (options, serviceId, doSerialize = false) => function prepareAdapter(adapter) {
@@ -28,13 +50,14 @@ const prepareAdapter = (options, serviceId, doSerialize = false) => function pre
28
50
  const pipeAdapters = (adapters) => adapters.length > 0 ? pPipe(...adapters) : undefined;
29
51
  export default function createEndpoint(serviceId, serviceOptions, mapOptions, serviceMutation, prepareOptions = (options) => options, serviceAdapters = []) {
30
52
  return function (endpointDef) {
53
+ const { id, validate, allowRawRequest = false, allowRawResponse = false, match, adapters = [], } = endpointDef;
31
54
  const mutation = flattenIfOneOrNone([...ensureArray(serviceMutation), ...ensureArray(endpointDef.mutation)]
32
55
  .map(setModifyFlag)
33
56
  .filter(isNotNullOrUndefined));
34
57
  const mutator = mutation ? mapTransform(mutation, mapOptions) : null;
58
+ const validator = prepareValidator(validate, mapOptions);
35
59
  const options = { ...serviceOptions, ...endpointDef.options };
36
60
  const preparedOptions = prepareOptions(options, serviceId);
37
- const { id, allowRawRequest = false, allowRawResponse = false, match, adapters = [], } = endpointDef;
38
61
  const allAdapters = [...serviceAdapters, ...adapters];
39
62
  const normalize = pipeAdapters(allAdapters.map(prepareAdapter(options, serviceId, false)));
40
63
  allAdapters.reverse();
@@ -45,6 +68,7 @@ export default function createEndpoint(serviceId, serviceOptions, mapOptions, se
45
68
  allowRawResponse,
46
69
  match,
47
70
  options: preparedOptions,
71
+ validateAction: validator,
48
72
  mutateRequest: mutateAction(mutator, true, normalize, serialize),
49
73
  mutateResponse: mutateAction(mutator, false, normalize, serialize),
50
74
  isMatch: isMatch(endpointDef),
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/service/endpoints/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/service/endpoints/create.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { TransformDefinition } from 'map-transform/types.js';
2
- import type { Action, Condition, Adapter } from '../../types.js';
2
+ import type { Action, Response, Condition, Adapter } from '../../types.js';
3
3
  export type EndpointOptions = Record<string, unknown>;
4
4
  export interface MatchObject {
5
5
  action?: string | string[];
@@ -9,9 +9,14 @@ export interface MatchObject {
9
9
  filters?: Record<string, Condition | boolean | undefined>;
10
10
  incoming?: boolean;
11
11
  }
12
+ export interface ValidateObject {
13
+ condition: TransformDefinition;
14
+ failResponse?: Response | string;
15
+ }
12
16
  export interface EndpointDef {
13
17
  id?: string;
14
18
  match?: MatchObject;
19
+ validate?: ValidateObject[];
15
20
  options?: EndpointOptions;
16
21
  mutation?: TransformDefinition;
17
22
  adapters?: (string | Adapter)[];
@@ -22,6 +27,7 @@ export interface Endpoint {
22
27
  id?: string;
23
28
  match?: MatchObject;
24
29
  options: EndpointOptions;
30
+ validateAction: (action: Action) => Promise<Response | null>;
25
31
  mutateRequest: (action: Action, isIncoming?: boolean) => Promise<Action>;
26
32
  mutateResponse: (action: Action, isIncoming?: boolean) => Promise<Action>;
27
33
  isMatch: (action: Action, isIncoming?: boolean) => boolean;
@@ -1,5 +1,9 @@
1
1
  import { setResponseOnAction } from '../utils/action.js';
2
2
  export default async function mutateAndSend(service, endpoint, action) {
3
+ const validateResponse = await endpoint.validateAction(action);
4
+ if (validateResponse) {
5
+ return validateResponse;
6
+ }
3
7
  const authorizedAction = service.authorizeAction(action);
4
8
  const requestAction = await service.mutateRequest(authorizedAction, endpoint);
5
9
  const response = await service.send(requestAction);
@@ -1 +1 @@
1
- {"version":3,"file":"mutateAndSend.js","sourceRoot":"","sources":["../../src/utils/mutateAndSend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAKxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,aAAa,CACzC,OAAgB,EAChB,QAAkB,EAClB,MAAc;IAEd,MAAM,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IAC7E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClD,OAAO,MAAM,OAAO,CAAC,cAAc,CACjC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EACrC,QAAQ,CACT,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"mutateAndSend.js","sourceRoot":"","sources":["../../src/utils/mutateAndSend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAKxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,aAAa,CACzC,OAAgB,EAChB,QAAkB,EAClB,MAAc;IAEd,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9D,IAAI,gBAAgB,EAAE;QACpB,OAAO,gBAAgB,CAAA;KACxB;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;IAC7E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClD,OAAO,MAAM,OAAO,CAAC,cAAc,CACjC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EACrC,QAAQ,CACT,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "integreat",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "description": "Node.js integration layer",
5
5
  "author": "Kjell-Morten Bratsberg Thorsen <kjellmorten@integreat.io> (https://integreat.io/)",
6
6
  "license": "ISC",
@@ -54,11 +54,11 @@
54
54
  "rfdc": "^1.3.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@integreat/ts-dev-setup": "^4.1.0",
57
+ "@integreat/ts-dev-setup": "^4.1.1",
58
58
  "@types/sinon": "^10.0.15",
59
- "integreat-adapter-json": "^0.6.0",
60
- "integreat-transporter-http": "0.1.0",
61
- "nock": "^13.3.1",
59
+ "integreat-adapter-json": "^0.7.0",
60
+ "integreat-transporter-http": "0.1.1",
61
+ "nock": "^13.3.2",
62
62
  "sinon": "^15.2.0"
63
63
  }
64
64
  }