diff --git a/libs/event-emitter/src/events/redmine-events.gateway.ts b/libs/event-emitter/src/events/redmine-events.gateway.ts index 9e95f37..b9e20ae 100644 --- a/libs/event-emitter/src/events/redmine-events.gateway.ts +++ b/libs/event-emitter/src/events/redmine-events.gateway.ts @@ -63,23 +63,27 @@ export class RedmineEventsGateway { } addIssues(issues: number[]): void { - issues.forEach(issue => { + issues.forEach((issue) => { if (!this.issuesChangesQueue.isItemExists(issue)) { this.issuesChangesQueue.add([issue]); } }); } + getQueueSize(): number { + return this.issuesChangesQueue.getQueueSize(); + } + private sendWebHookFullDataEvents(data: RedmineIssueData[]): void { - const webhooks = this.config.get("webhooks"); - webhooks.forEach(webhook => { + const webhooks = this.config.get('webhooks'); + webhooks.forEach((webhook) => { let config = undefined; if (webhook.apiKeyName && webhook.apiKeyValue) { - config = {headers: {}}; + config = { headers: {} }; config.headers[webhook.apiKeyName] = webhook.apiKeyValue; } axios.post(webhook.url, data, config).catch((err) => { - console.error('Error at webhook send request:', err) + console.error('Error at webhook send request:', err); }); }); } diff --git a/libs/event-emitter/src/main/main.controller.ts b/libs/event-emitter/src/main/main.controller.ts index 0697441..c3227cd 100644 --- a/libs/event-emitter/src/main/main.controller.ts +++ b/libs/event-emitter/src/main/main.controller.ts @@ -16,4 +16,9 @@ export class MainController { async appendIssues(@Body() issues: number[]): Promise { this.redmineEventsGateway.addIssues(issues); } + + @Get('get-issues-queue-size') + getIssuesQueueSize(): number { + return this.redmineEventsGateway.getQueueSize(); + } } diff --git a/libs/event-emitter/src/queue/queue.ts b/libs/event-emitter/src/queue/queue.ts index 58a1b70..4adc608 100644 --- a/libs/event-emitter/src/queue/queue.ts +++ b/libs/event-emitter/src/queue/queue.ts @@ -1,7 +1,6 @@ -import { Subject } from "rxjs"; +import { Subject } from 'rxjs'; export class Queue { - private items: T[] = []; queue: Subject = new Subject(); @@ -9,7 +8,7 @@ export class Queue { constructor( private updateInterval: number, private itemsLimit: number, - private transformationFn: ((arg: Array) => Promise>) + private transformationFn: (arg: Array) => Promise>, ) {} add(values: T[]): void { @@ -29,6 +28,10 @@ export class Queue { this.updateTimeout = null; } + getQueueSize(): number { + return this.items.length; + } + private updateTimeout; private async update(): Promise { @@ -41,5 +44,4 @@ export class Queue { this.update(); }, this.updateInterval); } - -} \ No newline at end of file +} diff --git a/package.json b/package.json index 505de10..a2c4ff0 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "imap-simple": "^5.1.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", + "rss-parser": "^3.12.0", "rxjs": "^7.2.0", "socket.io": "^4.4.1" }, diff --git a/yarn.lock b/yarn.lock index 8f09da4..a84f0d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2081,6 +2081,11 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.2: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -4252,6 +4257,14 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rss-parser@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/rss-parser/-/rss-parser-3.12.0.tgz#b8888699ea46304a74363fbd8144671b2997984c" + integrity sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A== + dependencies: + entities "^2.0.3" + xml2js "^0.4.19" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -4293,6 +4306,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -5147,6 +5165,19 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml2js@^0.4.19: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"