@universis/webhooks 1.2.1 → 1.3.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
@@ -22,6 +22,18 @@ Install service in your Universis API Server configuration:
22
22
  }
23
23
  ```
24
24
 
25
+ Include `@universis/webhooks` schema loader under `settings/schema`:
26
+
27
+ ```json
28
+ {
29
+ "schema": [
30
+ {
31
+ "loaderType": "@universis/webhooks#SchemaLoader"
32
+ }
33
+ ]
34
+ }
35
+ ```
36
+
25
37
  ## Configuration
26
38
 
27
39
  The service can be configured with the following options:
@@ -65,6 +77,7 @@ To create a new webhook, send a POST request to `/api/webhooks` with the followi
65
77
  "config": {
66
78
  "url": "https://example.com/webhook",
67
79
  "contentType": "application/json"
80
+ }
68
81
  }
69
82
  ```
70
83
 
@@ -7,8 +7,6 @@ var _data = require("@themost/data");
7
7
 
8
8
 
9
9
 
10
-
11
- var _SchemaLoader = require("./SchemaLoader");
12
10
  var _superagent = _interopRequireDefault(require("superagent"));
13
11
  var _query = require("@themost/query");
14
12
  var _jsonLogger = require("@themost/json-logger");
@@ -20,19 +18,6 @@ var _OnWebHookAction = require("./listeners/OnWebHookAction");function _interopR
20
18
  class WebHookService extends _common.ApplicationService {
21
19
  constructor(app) {
22
20
  super(app);
23
- /**
24
- * @type {import('@themost/data').DefaultSchemaLoaderStrategy}
25
- */
26
- const schemaLoader = app.getConfiguration().getStrategy(_data.SchemaLoaderStrategy);
27
- schemaLoader.loaders.push(new _SchemaLoader.SchemaLoader(app.getConfiguration()));
28
- /**
29
- * @type {import('@themost/data').ODataModelBuilder}
30
- */
31
- const builder = app.getService(_data.ODataModelBuilder);
32
- if (builder) {
33
- builder.clean(true);
34
- }
35
- // extend universis api scope access configuration
36
21
  if (app && app.container) {
37
22
  app.container.subscribe((container) => {
38
23
  if (container) {
@@ -45,7 +30,6 @@ class WebHookService extends _common.ApplicationService {
45
30
  }
46
31
  });
47
32
  }
48
-
49
33
  // configure logger
50
34
  // get options from configuration
51
35
  const options = Object.assign({
@@ -1 +1 @@
1
- {"version":3,"file":"WebHookService.js","names":["_common","require","_scope","_data","_SchemaLoader","_superagent","_interopRequireDefault","_query","_jsonLogger","_path","_rotatingFileStream","_dataModelFilter","_OnWebHookAction","e","__esModule","default","WebHookService","ApplicationService","constructor","app","schemaLoader","getConfiguration","getStrategy","SchemaLoaderStrategy","loaders","push","SchemaLoader","builder","getService","ODataModelBuilder","clean","container","subscribe","scopeAccess","ScopeAccessConfiguration","elements","unshift","WebHookScopeAccessElements","options","Object","assign","logLevel","logFormat","logDir","path","join","process","cwd","getSourceAt","resolve","logFile","logStream","createStream","interval","logger","JsonLogger","level","format","stdout","stderr","info","self","setTimeout","refresh","context","getApplication","createContext","items","model","asQueryable","take","silent","getAllItems","length","item","about","Promise","reject","afterSave","state","DataObjectState","Insert","target","err","warn","name","error","finalizeAsync","filterObjectAsync","filter","parser","DataModelFilterParser","$expand","$where","parseAsync","q","DataQueryable","query","primaryKey","id","prepare","Delete","where","equal","exists","count","emit","event","extraArgs","previous","application","newContext","x","action","active","select","config","username","owner","when","skip","findArgs","keys","forEach","key","value","and","viewAdapter","WebHooks","targetModel","entitySet","getEntityTypeEntitySet","origin","list","getList","total","user","send","url","result","request","set","contentType","entityType","lastResponse","status","db","executeAsync","QueryExpression","update","JSON","stringify","debug","exports"],"sources":["../src/WebHookService.js"],"sourcesContent":["// noinspection NpmUsedModulesInstalled\n\nimport {ApplicationService} from '@themost/common';\nimport {WebHookScopeAccessElements} from './config/scope.access';\nimport {\n DataObjectState,\n DataQueryable,\n ODataModelBuilder,\n SchemaLoaderStrategy\n} from '@themost/data';\nimport {SchemaLoader} from './SchemaLoader';\nimport request from 'superagent';\nimport {QueryExpression} from '@themost/query';\nimport { JsonLogger } from '@themost/json-logger';\nimport path from 'path';\nimport { createStream } from 'rotating-file-stream';\nimport {DataModelFilterParser} from '@themost/data/data-model-filter.parser';\nimport { afterSave } from './listeners/OnWebHookAction';\n\nclass WebHookService extends ApplicationService {\n constructor(app) {\n super(app);\n /**\n * @type {import('@themost/data').DefaultSchemaLoaderStrategy}\n */\n const schemaLoader = app.getConfiguration().getStrategy(SchemaLoaderStrategy);\n schemaLoader.loaders.push(new SchemaLoader(app.getConfiguration()));\n /**\n * @type {import('@themost/data').ODataModelBuilder}\n */\n const builder = app.getService(ODataModelBuilder);\n if (builder) {\n builder.clean(true);\n }\n // extend universis api scope access configuration\n if (app && app.container) {\n app.container.subscribe((container) => {\n if (container) {\n // add extra scope access elements\n const scopeAccess = app.getConfiguration().getStrategy(function ScopeAccessConfiguration() {\n });\n if (scopeAccess != null) {\n scopeAccess.elements.unshift(...WebHookScopeAccessElements);\n }\n }\n });\n }\n\n // configure logger\n // get options from configuration\n const options = Object.assign({\n logLevel: 'info',\n logFormat: 'raw',\n logDir: path.join(process.cwd(), 'log')\n }, app.getConfiguration().getSourceAt('settings/universis/webhooks'));\n const logDir = options.logDir ? path.resolve(options.logDir) : path.join(process.cwd(), 'log');\n const logFile = 'webhooks.log';\n // create a rotating write stream\n // noinspection JSValidateTypes\n const logStream = createStream(logFile, {\n interval: '1d', // rotate daily\n path: logDir\n });\n this.logger = new JsonLogger({\n level: options.logLevel,\n format: options.logFormat,\n stdout: logStream,\n stderr: logStream\n });\n this.logger.info(`Universis WebHookService initialized with log level \"${options.logLevel}\"`);\n\n if (app) {\n const self = this;\n setTimeout(() => {\n (async () => {\n await self.refresh();\n })();\n }, 1000);\n }\n\n }\n\n /**\n * Refresh web hook actions\n * @returns {Promise<void>}\n */\n async refresh() {\n /**\n * @type {import('@themost/data').DataContext}\n */\n let context;\n try {\n // noinspection JSUnresolvedReference\n context = this.getApplication().createContext();\n this.logger.info('Registering existing web hook actions');\n const items = await context.model('WebHookAction').asQueryable().take(-1).silent().getAllItems();\n if (items.length > 0) {\n this.logger.info(`Found ${items.length} web hook action(s). The operation will automatically register event listeners to the underlying data models.`);\n }\n for (const item of items) {\n const model = context.model(item.about);\n if (model) {\n await new Promise((resolve, reject) => {\n afterSave({ state: DataObjectState.Insert, target: item, model}, (err) => {\n if (err) {\n return reject(err);\n }\n return resolve();\n });\n });\n } else {\n this.logger.warn(`Cannot register web hook action with name \"${item.name || 'unknown'}\" because model \"${item.about}\" does not exist.`);\n }\n }\n } catch(err) {\n this.logger.error('An error occurred when registering existing web hooks');\n this.logger.error(err);\n } finally {\n if (context) {\n await context.finalizeAsync()\n }\n }\n }\n\n /**\n *\n * @param {import('@themost/data').DataModel} model\n * @param {*} target\n * @param {string} filter\n * @param {number} state\n * @returns {Promise<boolean>}\n */\n async filterObjectAsync(model, target, filter, state) {\n const parser = new DataModelFilterParser(model);\n const { $expand, $where } = await parser.parseAsync(filter)\n const q = new DataQueryable(model);\n Object.assign(q.query, {\n $where,\n $expand\n });\n const { primaryKey } = model;\n const id = target[primaryKey];\n q.prepare();\n if (state !== DataObjectState.Delete) {\n q.where(primaryKey).equal(id);\n }\n const exists = await q.count();\n return (exists > 0);\n }\n\n /**\n * Emit web hook events\n * @param {import('@themost/data').DataEventArgs} event\n * @param {{action?: string, emit?: boolean}} extraArgs\n */\n emit(event, extraArgs) {\n const context = event.model.context;\n // get previous and current state of the entity\n const { previous, target, state, model } = event;\n /**\n * @type {import('@themost/express').ExpressDataApplication|import('@themost/common').ApplicationBase}\n */\n const application = context.application;\n // noinspection JSUnresolvedReference\n /**\n * @type {import('@themost/express').ExpressDataContext|import('@themost/data').DataContext}\n */\n const newContext = application.createContext();\n const about = model.name;\n const self = this;\n (async function() {\n // noinspection JSUnresolvedReference\n const q = newContext.model('WebHook').asQueryable().where((x, about, state) => {\n // noinspection JSBitwiseOperatorUsage\n return (x.action.about === about) && (x.action.state === state) && (x.active === true);\n }, about, state).select((x) => {\n return {\n id: x.id,\n config: x.config,\n action: x.action,\n about: x.action.about,\n emit: x.emit,\n username: x.owner.name,\n filter: x.action.filter,\n when: x.action.when\n }\n }).silent().take(25).skip(0);\n // apply extra arguments for finding web hooks\n const findArgs = Object.assign({ emit: true }, extraArgs || {});\n q.prepare();\n Object.keys(findArgs).forEach((key) => {\n const value = findArgs[key];\n q.query.$where ? q.and(key).equal(value) : q.where(key).equal(value);\n });\n\n const { viewAdapter: WebHooks } = newContext.model('WebHook');\n const targetModel = newContext.model(about);\n // get entity set\n const builder = application.getService(ODataModelBuilder);\n const entitySet = builder.getEntityTypeEntitySet(targetModel.name)\n const { primaryKey: key } = targetModel;\n // get origin\n const origin = context.getConfiguration().getSourceAt('settings/universis/api/origin');\n /**\n * @type {{total: number, skip: number, value: Array<{ id: string,config: { url: string, insecure: boolean, secret?: string, contentType: string }, emit: boolean, username: string,action: string,about: string,filter: string,when: string}>}} list\n */\n let list = await q.getList();\n if (list.total > 0) {\n while (list.total >= (list.skip + list.value.length)) {\n for (const item of list.value) {\n // set context user\n newContext.user = {\n name: item.username || 'anonymous'\n }\n try {\n let send = true;\n if (state === DataObjectState.Insert) {\n // validate the current state of a new object\n const filter = item.when || item.filter;\n send = await self.filterObjectAsync(targetModel, target, filter, state);\n } else {\n // validate previous state\n send = await self.filterObjectAsync(targetModel, previous, item.when, state);\n // validate current state\n if (send && item.filter) {\n if (state === DataObjectState.Delete) {\n send = await self.filterObjectAsync(targetModel, previous, item.filter, state);\n } else {\n send = await self.filterObjectAsync(targetModel, target, item.filter, state);\n }\n }\n }\n if (send) {\n self.logger.info(`Sending web hook for model \"${about}\" to url \"${item.config.url}\"`);\n // send web hook request\n const result = await request('post', item.config.url)\n .set('Content-Type', item.config.contentType)\n .send({\n event: item.action,\n entityType: targetModel.name,\n entitySet: entitySet && entitySet.name,\n origin: origin,\n target: {\n id: (state === DataObjectState.Insert) ? target[key] : previous[key],\n }\n });\n const lastResponse = {\n status: result.status\n };\n self.logger.info(`Web hook for model \"${about}\" to url ${item.config.url} returned status ${result.status}`);\n // update last response with an ad-hoc query\n await newContext.db.executeAsync(\n new QueryExpression().update(WebHooks).set({\n lastResponse: JSON.stringify(lastResponse),\n }).where('id').equal(item.id)\n , []);\n } else {\n self.logger.debug(`Web hook for model \"${about}\" and object with identifier ${target[key]} to url \"${item.config.url}\" was filtered and not sent`);\n }\n } catch (err) {\n self.logger.error(`Error sending web hook for model \"${about}\" to url \"${item.config.url}\"`);\n self.logger.error(err);\n }\n }\n list = await q.take(25).skip(list.skip + list.value.length);\n }\n }\n })();\n }\n\n}\n\nexport {\n WebHookService\n}"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"WebHookService.js","names":["_common","require","_scope","_data","_superagent","_interopRequireDefault","_query","_jsonLogger","_path","_rotatingFileStream","_dataModelFilter","_OnWebHookAction","e","__esModule","default","WebHookService","ApplicationService","constructor","app","container","subscribe","scopeAccess","getConfiguration","getStrategy","ScopeAccessConfiguration","elements","unshift","WebHookScopeAccessElements","options","Object","assign","logLevel","logFormat","logDir","path","join","process","cwd","getSourceAt","resolve","logFile","logStream","createStream","interval","logger","JsonLogger","level","format","stdout","stderr","info","self","setTimeout","refresh","context","getApplication","createContext","items","model","asQueryable","take","silent","getAllItems","length","item","about","Promise","reject","afterSave","state","DataObjectState","Insert","target","err","warn","name","error","finalizeAsync","filterObjectAsync","filter","parser","DataModelFilterParser","$expand","$where","parseAsync","q","DataQueryable","query","primaryKey","id","prepare","Delete","where","equal","exists","count","emit","event","extraArgs","previous","application","newContext","x","action","active","select","config","username","owner","when","skip","findArgs","keys","forEach","key","value","and","viewAdapter","WebHooks","targetModel","builder","getService","ODataModelBuilder","entitySet","getEntityTypeEntitySet","origin","list","getList","total","user","send","url","result","request","set","contentType","entityType","lastResponse","status","db","executeAsync","QueryExpression","update","JSON","stringify","debug","exports"],"sources":["../src/WebHookService.js"],"sourcesContent":["// noinspection NpmUsedModulesInstalled\n\nimport {ApplicationService} from '@themost/common';\nimport {WebHookScopeAccessElements} from './config/scope.access';\nimport {\n DataObjectState,\n DataQueryable,\n ODataModelBuilder,\n} from '@themost/data';\nimport request from 'superagent';\nimport {QueryExpression} from '@themost/query';\nimport { JsonLogger } from '@themost/json-logger';\nimport path from 'path';\nimport { createStream } from 'rotating-file-stream';\nimport {DataModelFilterParser} from '@themost/data/data-model-filter.parser';\nimport { afterSave } from './listeners/OnWebHookAction';\n\nclass WebHookService extends ApplicationService {\n constructor(app) {\n super(app);\n if (app && app.container) {\n app.container.subscribe((container) => {\n if (container) {\n // add extra scope access elements\n const scopeAccess = app.getConfiguration().getStrategy(function ScopeAccessConfiguration() {\n });\n if (scopeAccess != null) {\n scopeAccess.elements.unshift(...WebHookScopeAccessElements);\n }\n }\n });\n }\n // configure logger\n // get options from configuration\n const options = Object.assign({\n logLevel: 'info',\n logFormat: 'raw',\n logDir: path.join(process.cwd(), 'log')\n }, app.getConfiguration().getSourceAt('settings/universis/webhooks'));\n const logDir = options.logDir ? path.resolve(options.logDir) : path.join(process.cwd(), 'log');\n const logFile = 'webhooks.log';\n // create a rotating write stream\n // noinspection JSValidateTypes\n const logStream = createStream(logFile, {\n interval: '1d', // rotate daily\n path: logDir\n });\n this.logger = new JsonLogger({\n level: options.logLevel,\n format: options.logFormat,\n stdout: logStream,\n stderr: logStream\n });\n this.logger.info(`Universis WebHookService initialized with log level \"${options.logLevel}\"`);\n\n if (app) {\n const self = this;\n setTimeout(() => {\n (async () => {\n await self.refresh();\n })();\n }, 1000);\n }\n\n }\n\n /**\n * Refresh web hook actions\n * @returns {Promise<void>}\n */\n async refresh() {\n /**\n * @type {import('@themost/data').DataContext}\n */\n let context;\n try {\n // noinspection JSUnresolvedReference\n context = this.getApplication().createContext();\n this.logger.info('Registering existing web hook actions');\n const items = await context.model('WebHookAction').asQueryable().take(-1).silent().getAllItems();\n if (items.length > 0) {\n this.logger.info(`Found ${items.length} web hook action(s). The operation will automatically register event listeners to the underlying data models.`);\n }\n for (const item of items) {\n const model = context.model(item.about);\n if (model) {\n await new Promise((resolve, reject) => {\n afterSave({ state: DataObjectState.Insert, target: item, model}, (err) => {\n if (err) {\n return reject(err);\n }\n return resolve();\n });\n });\n } else {\n this.logger.warn(`Cannot register web hook action with name \"${item.name || 'unknown'}\" because model \"${item.about}\" does not exist.`);\n }\n }\n } catch(err) {\n this.logger.error('An error occurred when registering existing web hooks');\n this.logger.error(err);\n } finally {\n if (context) {\n await context.finalizeAsync()\n }\n }\n }\n\n /**\n *\n * @param {import('@themost/data').DataModel} model\n * @param {*} target\n * @param {string} filter\n * @param {number} state\n * @returns {Promise<boolean>}\n */\n async filterObjectAsync(model, target, filter, state) {\n const parser = new DataModelFilterParser(model);\n const { $expand, $where } = await parser.parseAsync(filter)\n const q = new DataQueryable(model);\n Object.assign(q.query, {\n $where,\n $expand\n });\n const { primaryKey } = model;\n const id = target[primaryKey];\n q.prepare();\n if (state !== DataObjectState.Delete) {\n q.where(primaryKey).equal(id);\n }\n const exists = await q.count();\n return (exists > 0);\n }\n\n /**\n * Emit web hook events\n * @param {import('@themost/data').DataEventArgs} event\n * @param {{action?: string, emit?: boolean}} extraArgs\n */\n emit(event, extraArgs) {\n const context = event.model.context;\n // get previous and current state of the entity\n const { previous, target, state, model } = event;\n /**\n * @type {import('@themost/express').ExpressDataApplication|import('@themost/common').ApplicationBase}\n */\n const application = context.application;\n // noinspection JSUnresolvedReference\n /**\n * @type {import('@themost/express').ExpressDataContext|import('@themost/data').DataContext}\n */\n const newContext = application.createContext();\n const about = model.name;\n const self = this;\n (async function() {\n // noinspection JSUnresolvedReference\n const q = newContext.model('WebHook').asQueryable().where((x, about, state) => {\n // noinspection JSBitwiseOperatorUsage\n return (x.action.about === about) && (x.action.state === state) && (x.active === true);\n }, about, state).select((x) => {\n return {\n id: x.id,\n config: x.config,\n action: x.action,\n about: x.action.about,\n emit: x.emit,\n username: x.owner.name,\n filter: x.action.filter,\n when: x.action.when\n }\n }).silent().take(25).skip(0);\n // apply extra arguments for finding web hooks\n const findArgs = Object.assign({ emit: true }, extraArgs || {});\n q.prepare();\n Object.keys(findArgs).forEach((key) => {\n const value = findArgs[key];\n q.query.$where ? q.and(key).equal(value) : q.where(key).equal(value);\n });\n\n const { viewAdapter: WebHooks } = newContext.model('WebHook');\n const targetModel = newContext.model(about);\n // get entity set\n const builder = application.getService(ODataModelBuilder);\n const entitySet = builder.getEntityTypeEntitySet(targetModel.name)\n const { primaryKey: key } = targetModel;\n // get origin\n const origin = context.getConfiguration().getSourceAt('settings/universis/api/origin');\n /**\n * @type {{total: number, skip: number, value: Array<{ id: string,config: { url: string, insecure: boolean, secret?: string, contentType: string }, emit: boolean, username: string,action: string,about: string,filter: string,when: string}>}} list\n */\n let list = await q.getList();\n if (list.total > 0) {\n while (list.total >= (list.skip + list.value.length)) {\n for (const item of list.value) {\n // set context user\n newContext.user = {\n name: item.username || 'anonymous'\n }\n try {\n let send = true;\n if (state === DataObjectState.Insert) {\n // validate the current state of a new object\n const filter = item.when || item.filter;\n send = await self.filterObjectAsync(targetModel, target, filter, state);\n } else {\n // validate previous state\n send = await self.filterObjectAsync(targetModel, previous, item.when, state);\n // validate current state\n if (send && item.filter) {\n if (state === DataObjectState.Delete) {\n send = await self.filterObjectAsync(targetModel, previous, item.filter, state);\n } else {\n send = await self.filterObjectAsync(targetModel, target, item.filter, state);\n }\n }\n }\n if (send) {\n self.logger.info(`Sending web hook for model \"${about}\" to url \"${item.config.url}\"`);\n // send web hook request\n const result = await request('post', item.config.url)\n .set('Content-Type', item.config.contentType)\n .send({\n event: item.action,\n entityType: targetModel.name,\n entitySet: entitySet && entitySet.name,\n origin: origin,\n target: {\n id: (state === DataObjectState.Insert) ? target[key] : previous[key],\n }\n });\n const lastResponse = {\n status: result.status\n };\n self.logger.info(`Web hook for model \"${about}\" to url ${item.config.url} returned status ${result.status}`);\n // update last response with an ad-hoc query\n await newContext.db.executeAsync(\n new QueryExpression().update(WebHooks).set({\n lastResponse: JSON.stringify(lastResponse),\n }).where('id').equal(item.id)\n , []);\n } else {\n self.logger.debug(`Web hook for model \"${about}\" and object with identifier ${target[key]} to url \"${item.config.url}\" was filtered and not sent`);\n }\n } catch (err) {\n self.logger.error(`Error sending web hook for model \"${about}\" to url \"${item.config.url}\"`);\n self.logger.error(err);\n }\n }\n list = await q.take(25).skip(list.skip + list.value.length);\n }\n }\n })();\n }\n\n}\n\nexport {\n WebHookService\n}"],"mappings":"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","ignoreList":[]}
@@ -16,6 +16,7 @@
16
16
  "description": "The identifier of the item.",
17
17
  "type": "Guid",
18
18
  "primary": true,
19
+ "nullable": false,
19
20
  "readonly": true,
20
21
  "value": {
21
22
  "$uuid": 1
@@ -1,21 +1,21 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.WebHookScopeAccessElements = void 0;const WebHookScopeAccessElements = exports.WebHookScopeAccessElements = [
2
2
  {
3
3
  'scope': [
4
- 'webhooks:read'],
4
+ 'webhooks:write'],
5
5
 
6
6
  'resource': '/api/WebHooks/?',
7
7
  'access': [
8
- 'read']
8
+ 'read',
9
+ 'write']
9
10
 
10
11
  },
11
12
  {
12
13
  'scope': [
13
- 'webhooks:write'],
14
+ 'webhooks:read'],
14
15
 
15
16
  'resource': '/api/WebHooks/?',
16
17
  'access': [
17
- 'read',
18
- 'write']
18
+ 'read']
19
19
 
20
20
  }];
21
21
  //# sourceMappingURL=scope.access.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scope.access.js","names":["WebHookScopeAccessElements","exports"],"sources":["../../src/config/scope.access.js"],"sourcesContent":["const WebHookScopeAccessElements = [\n {\n 'scope': [\n 'webhooks:read',\n ],\n 'resource': '/api/WebHooks/?',\n 'access': [\n 'read'\n ]\n },\n {\n 'scope': [\n 'webhooks:write',\n ],\n 'resource': '/api/WebHooks/?',\n 'access': [\n 'read',\n 'write'\n ]\n }\n];\n\nexport {\n WebHookScopeAccessElements\n}"],"mappings":"uHAAA,MAAMA,0BAA0B,GAAAC,OAAA,CAAAD,0BAAA,GAAG;AAC/B;EACI,OAAO,EAAE;EACL,eAAe,CAClB;;EACD,UAAU,EAAE,iBAAiB;EAC7B,QAAQ,EAAE;EACN,MAAM;;AAEd,CAAC;AACD;EACI,OAAO,EAAE;EACL,gBAAgB,CACnB;;EACD,UAAU,EAAE,iBAAiB;EAC7B,QAAQ,EAAE;EACN,MAAM;EACN,OAAO;;AAEf,CAAC,CACJ","ignoreList":[]}
1
+ {"version":3,"file":"scope.access.js","names":["WebHookScopeAccessElements","exports"],"sources":["../../src/config/scope.access.js"],"sourcesContent":["const WebHookScopeAccessElements = [\n {\n 'scope': [\n 'webhooks:write'\n ],\n 'resource': '/api/WebHooks/?',\n 'access': [\n 'read',\n 'write'\n ]\n },\n {\n 'scope': [\n 'webhooks:read',\n ],\n 'resource': '/api/WebHooks/?',\n 'access': [\n 'read'\n ]\n }\n];\n\nexport {\n WebHookScopeAccessElements\n}"],"mappings":"uHAAA,MAAMA,0BAA0B,GAAAC,OAAA,CAAAD,0BAAA,GAAG;AAC/B;EACI,OAAO,EAAE;EACL,gBAAgB,CACnB;;EACD,UAAU,EAAE,iBAAiB;EAC7B,QAAQ,EAAE;EACN,MAAM;EACN,OAAO;;AAEf,CAAC;AACD;EACI,OAAO,EAAE;EACL,eAAe,CAClB;;EACD,UAAU,EAAE,iBAAiB;EAC7B,QAAQ,EAAE;EACN,MAAM;;AAEd,CAAC,CACJ","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@universis/webhooks",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Universis Webhooks API Library",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -32,7 +32,7 @@
32
32
  "peerDependencies": {
33
33
  "@themost/common": "^2",
34
34
  "@themost/data": "^2",
35
- "@themost/express": "^1",
35
+ "@themost/express": "^2",
36
36
  "@themost/query": "^2",
37
37
  "@themost/xml": "^2"
38
38
  },
@@ -6,9 +6,7 @@ import {
6
6
  DataObjectState,
7
7
  DataQueryable,
8
8
  ODataModelBuilder,
9
- SchemaLoaderStrategy
10
9
  } from '@themost/data';
11
- import {SchemaLoader} from './SchemaLoader';
12
10
  import request from 'superagent';
13
11
  import {QueryExpression} from '@themost/query';
14
12
  import { JsonLogger } from '@themost/json-logger';
@@ -20,19 +18,6 @@ import { afterSave } from './listeners/OnWebHookAction';
20
18
  class WebHookService extends ApplicationService {
21
19
  constructor(app) {
22
20
  super(app);
23
- /**
24
- * @type {import('@themost/data').DefaultSchemaLoaderStrategy}
25
- */
26
- const schemaLoader = app.getConfiguration().getStrategy(SchemaLoaderStrategy);
27
- schemaLoader.loaders.push(new SchemaLoader(app.getConfiguration()));
28
- /**
29
- * @type {import('@themost/data').ODataModelBuilder}
30
- */
31
- const builder = app.getService(ODataModelBuilder);
32
- if (builder) {
33
- builder.clean(true);
34
- }
35
- // extend universis api scope access configuration
36
21
  if (app && app.container) {
37
22
  app.container.subscribe((container) => {
38
23
  if (container) {
@@ -45,7 +30,6 @@ class WebHookService extends ApplicationService {
45
30
  }
46
31
  });
47
32
  }
48
-
49
33
  // configure logger
50
34
  // get options from configuration
51
35
  const options = Object.assign({
@@ -16,6 +16,7 @@
16
16
  "description": "The identifier of the item.",
17
17
  "type": "Guid",
18
18
  "primary": true,
19
+ "nullable": false,
19
20
  "readonly": true,
20
21
  "value": {
21
22
  "$uuid": 1
@@ -1,21 +1,21 @@
1
1
  const WebHookScopeAccessElements = [
2
2
  {
3
3
  'scope': [
4
- 'webhooks:read',
4
+ 'webhooks:write'
5
5
  ],
6
6
  'resource': '/api/WebHooks/?',
7
7
  'access': [
8
- 'read'
8
+ 'read',
9
+ 'write'
9
10
  ]
10
11
  },
11
12
  {
12
13
  'scope': [
13
- 'webhooks:write',
14
+ 'webhooks:read',
14
15
  ],
15
16
  'resource': '/api/WebHooks/?',
16
17
  'access': [
17
- 'read',
18
- 'write'
18
+ 'read'
19
19
  ]
20
20
  }
21
21
  ];