From d3689fd6226d1666cc82cd109e86858440afde6e Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Tue, 28 Sep 2021 21:24:27 -0400 Subject: [PATCH 1/8] got service running, start backend service --- .env.example | 2 + Readme.md | 4 +- apps/chat-backend/package.json | 7 +- apps/chat-backend/src/app.module.ts | 7 +- .../url-shortner/url-shortner.service.spec.ts | 18 ++ .../url-shortner/url-shortner.service.ts | 33 +++ common-services.yml | 9 + common/config/rush/pnpm-lock.yaml | 227 ++++++++++++++---- docker-compose.yml | 5 + scripts/get-url-shortner-api-key.sh | 17 ++ 10 files changed, 274 insertions(+), 55 deletions(-) create mode 100644 apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts create mode 100644 apps/chat-backend/src/services/url-shortner/url-shortner.service.ts create mode 100644 scripts/get-url-shortner-api-key.sh diff --git a/.env.example b/.env.example index 565731f..df0a7c2 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,7 @@ SHORT_DOMAIN_HOST SHORT_DOMAIN_SCHEMA +SHORT_DOMAIN_PORT GEOLITE_LICENSE_KEY BACKEND_PORT REDIS_PORT +URL_API_KEY diff --git a/Readme.md b/Readme.md index 45f037f..25924f8 100644 --- a/Readme.md +++ b/Readme.md @@ -26,4 +26,6 @@ mkdir ./keys && cd ./keys rush docker-up:dev # start UI project separately cd ./apps/chat-frontend/ && rushx start:dev -``` \ No newline at end of file +``` + +Url Shortner docs: https://shlink.io/documentation/ diff --git a/apps/chat-backend/package.json b/apps/chat-backend/package.json index 4ee8947..85e67a7 100644 --- a/apps/chat-backend/package.json +++ b/apps/chat-backend/package.json @@ -39,7 +39,10 @@ "socket.io": "^4.0.0", "redis": "~3.1.2", "socket.io-redis": "~6.1.1", - "jsonwebtoken": "~8.5.1" + "jsonwebtoken": "~8.5.1", + "@nestjs/axios": "~0.0.2", + "axios": "~0.21.4", + "rxjs": "~7.3.0" }, "devDependencies": { "@nestjs/cli": "^8.0.0", @@ -83,4 +86,4 @@ "coverageDirectory": "../coverage", "testEnvironment": "node" } -} \ No newline at end of file +} diff --git a/apps/chat-backend/src/app.module.ts b/apps/chat-backend/src/app.module.ts index f5fbebe..41e5fb2 100644 --- a/apps/chat-backend/src/app.module.ts +++ b/apps/chat-backend/src/app.module.ts @@ -4,10 +4,11 @@ import { ChatGateway } from './chat/chat.gateway'; import { AlertGateway } from './alert/alert.gateway'; import { AlertController } from './alert/alert.controller'; import { JwtTokenService } from './services/jwt-token/jwt-token.service'; - +import { UrlShortnerService } from './services/url-shortner/url-shortner.service'; +import { HttpModule } from '@nestjs/axios'; @Module({ - imports: [ConfigModule.forRoot()], + imports: [ConfigModule.forRoot(), HttpModule], controllers: [AlertController], - providers: [ChatGateway, AlertGateway, JwtTokenService] + providers: [ChatGateway, AlertGateway, JwtTokenService, UrlShortnerService] }) export class AppModule {} diff --git a/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts new file mode 100644 index 0000000..f6868ea --- /dev/null +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { UrlShortnerService } from './url-shortner.service'; + +describe('UrlShortnerService', () => { + let service: UrlShortnerService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [UrlShortnerService], + }).compile(); + + service = module.get(UrlShortnerService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts new file mode 100644 index 0000000..afdf903 --- /dev/null +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import { HttpService } from '@nestjs/axios'; +import { AxiosResponse } from 'axios'; +import { Observable } from 'rxjs'; + +export interface UrlShortnerResponse { + shortCode: string; + shortUrl: string; + longUrl: string; + dateCreated: string; +} + +@Injectable() +export class UrlShortnerService { + private baseUrl: string; + constructor(private httpService: HttpService) { + this.baseUrl = `${process.env.SHORT_DOMAIN_SCHEMA}://${process.env.SHORT_DOMAIN_HOST}`; + } + + createShortUrl(url: string): Observable> { + return this.httpService.post( + `${this.baseUrl}/rest/v2/short-urls`, + { + longUrl: url + }, + { + headers: { + 'X-Api-Key': `{${process.env.URL_API_KEY}}` + } + } + ); + } +} diff --git a/common-services.yml b/common-services.yml index 4cc709d..0157670 100644 --- a/common-services.yml +++ b/common-services.yml @@ -5,6 +5,7 @@ services: ports: - '80:80' - '443:443' + restart: always volumes: - ./certs/:/etc/nginx/ssl redis-base: @@ -13,3 +14,11 @@ services: ports: - '${REDIS_PORT}:${REDIS_PORT}' restart: always + url-shortner-base: + image: shlinkio/shlink:stable + ports: + - '${SHORT_DOMAIN_PORT}:${SHORT_DOMAIN_PORT}' + environment: + - SHORT_DOMAIN_HOST=${SHORT_DOMAIN_HOST} + - SHORT_DOMAIN_SCHEMA=${SHORT_DOMAIN_SCHEMA} + - GEOLITE_LICENSE_KEY=${GEOLITE_LICENSE_KEY} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 87bda67..2e077b6 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -17,6 +17,7 @@ specifiers: '@auth0/angular-jwt': ~5.0.2 '@nebular/eva-icons': 7.0.0 '@nebular/theme': ^7.0.0 + '@nestjs/axios': ~0.0.2 '@nestjs/cli': ^8.0.0 '@nestjs/common': ^8.0.0 '@nestjs/config': ~1.0.1 @@ -41,6 +42,7 @@ specifiers: '@types/supertest': ^2.0.11 '@typescript-eslint/eslint-plugin': ^4.28.2 '@typescript-eslint/parser': ^4.28.2 + axios: ~0.21.4 bootstrap: ~5.1.0 codelyzer: ^6.0.0 crypto-browserify: ~3.12.0 @@ -66,7 +68,7 @@ specifiers: reflect-metadata: ^0.1.13 rimraf: ^3.0.2 rxjs: ~6.6.7 - socket.io: ~4.0.0 + socket.io: ^4.0.0 socket.io-redis: ~6.1.1 supertest: ^6.1.3 ts-jest: ^27.0.3 @@ -94,6 +96,7 @@ dependencies: '@auth0/angular-jwt': 5.0.2_@angular+common@11.2.14 '@nebular/eva-icons': 7.0.0_fce40857be57853c6ee52ce868e4bca2 '@nebular/theme': 7.0.0_366e1deee14c799f0e7c0a230d57b62f + '@nestjs/axios': 0.0.2_7e872a3ae58d5fbaf015bd8be835d7cf '@nestjs/cli': 8.1.1 '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc '@nestjs/config': 1.0.1_7e872a3ae58d5fbaf015bd8be835d7cf @@ -103,7 +106,7 @@ dependencies: '@nestjs/schematics': 8.0.2 '@nestjs/testing': 8.0.6_0f6569408de1f55b1e6481ed04272f1a '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 - '@rush-temp/chat-backend': file:projects/chat-backend.tgz_rxjs@6.6.7 + '@rush-temp/chat-backend': file:projects/chat-backend.tgz '@rush-temp/chat-frontend': file:projects/chat-frontend.tgz '@schematics/angular': 8.0.6 '@socket.io/cluster-adapter': 0.1.0 @@ -118,6 +121,7 @@ dependencies: '@types/supertest': 2.0.11 '@typescript-eslint/eslint-plugin': 4.29.2_061bcf7d10a51dd5ea7168c21da6ce0b '@typescript-eslint/parser': 4.29.2_eslint@7.32.0 + axios: 0.21.4 bootstrap: 5.1.0 codelyzer: 6.0.2_tslint@6.1.3 crypto-browserify: 3.12.0 @@ -143,7 +147,7 @@ dependencies: reflect-metadata: 0.1.13 rimraf: 3.0.2 rxjs: 6.6.7 - socket.io: 4.0.2 + socket.io: 4.1.3 socket.io-redis: 6.1.1 supertest: 6.1.6 ts-jest: 27.0.5_@types+jest@26.0.24+jest@27.0.6 @@ -2317,6 +2321,36 @@ packages: tslib: 2.3.1 dev: false + /@nestjs/axios/0.0.2_7e872a3ae58d5fbaf015bd8be835d7cf: + resolution: {integrity: sha512-T0EKw91tJ+/XhmDYsr4DrRJ+grn0VEOZ6zAkuJfKM4ltBqwI5dTM8T8BumGqVZ3iGe5YTo/PMb/o8oilJaajwg==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^6.0.0 || ^7.0.0 + dependencies: + '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc + axios: 0.21.4 + reflect-metadata: 0.1.13 + rxjs: 6.6.7 + transitivePeerDependencies: + - debug + dev: false + + /@nestjs/axios/0.0.2_e2399148d990aa1f9a4b6ba2ac7a5b74: + resolution: {integrity: sha512-T0EKw91tJ+/XhmDYsr4DrRJ+grn0VEOZ6zAkuJfKM4ltBqwI5dTM8T8BumGqVZ3iGe5YTo/PMb/o8oilJaajwg==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^6.0.0 || ^7.0.0 + dependencies: + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + axios: 0.21.4 + reflect-metadata: 0.1.13 + rxjs: 7.3.0 + transitivePeerDependencies: + - debug + dev: false + /@nestjs/cli/8.1.1: resolution: {integrity: sha512-Jo/vYyrDHJhRIoFevO+A955KX7aLSAV6gn0sbIJBDTKiha1yxfgEbHOk8qP24gNFLwiDn2CKbwph2g6z0v/mNw==} engines: {node: '>= 10.13.0', npm: '>= 6.11.0'} @@ -2348,6 +2382,32 @@ packages: - webpack-cli dev: false + /@nestjs/common/8.0.6_486826780eeff986d3746a62b5df4b6b: + resolution: {integrity: sha512-mSD000iYJDN2wjL2hbygCVNVvzvi3VW5EDc25gK1Bj3wUU2HR8m1qOAUBqcCaGIuvBb2cD/pnVkKklnsY0rKhw==} + peerDependencies: + cache-manager: '*' + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + axios: 0.21.1 + iterare: 1.2.1 + reflect-metadata: 0.1.13 + rxjs: 7.3.0 + tslib: 2.3.0 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + dev: false + /@nestjs/common/8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc: resolution: {integrity: sha512-mSD000iYJDN2wjL2hbygCVNVvzvi3VW5EDc25gK1Bj3wUU2HR8m1qOAUBqcCaGIuvBb2cD/pnVkKklnsY0rKhw==} peerDependencies: @@ -2392,6 +2452,56 @@ packages: uuid: 8.3.2 dev: false + /@nestjs/config/1.0.1_e2399148d990aa1f9a4b6ba2ac7a5b74: + resolution: {integrity: sha512-azMl4uYlFIhYsywFxPJT81RxF3Pnn0TZW3EEmr0Wa0Wex8R2xpvBNrCcrOgW3TB1xGMP7eqBrlfsVh5ZP82szg==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 + reflect-metadata: ^0.1.13 + rxjs: ^6.0.0 || ^7.2.0 + dependencies: + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + lodash.get: 4.4.2 + lodash.has: 4.5.2 + lodash.set: 4.3.2 + reflect-metadata: 0.1.13 + rxjs: 7.3.0 + uuid: 8.3.2 + dev: false + + /@nestjs/core/8.0.6_29489e331a4938cf69ca8b008049576b: + resolution: {integrity: sha512-PIGL4TMjVkAsiv5hJinaTx3WdoftYh7pJDwIUQPvRZPLhboGbOJlVapN0Cw5SL7XgNWojQiAsbgLmnGJVDO3Sw==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/microservices': ^8.0.0 + '@nestjs/platform-express': ^8.0.0 + '@nestjs/websockets': ^8.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + dependencies: + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea + '@nestjs/websockets': 8.0.6_d9cb7157596bf7c6176480174d173b36 + '@nuxtjs/opencollective': 0.3.2 + fast-safe-stringify: 2.0.8 + iterare: 1.2.1 + object-hash: 2.2.0 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.13 + rxjs: 7.3.0 + tslib: 2.3.0 + uuid: 8.3.2 + dev: false + /@nestjs/core/8.0.6_2ecfd39b89d7693a33c80114858b8d42: resolution: {integrity: sha512-PIGL4TMjVkAsiv5hJinaTx3WdoftYh7pJDwIUQPvRZPLhboGbOJlVapN0Cw5SL7XgNWojQiAsbgLmnGJVDO3Sw==} requiresBuild: true @@ -2439,6 +2549,24 @@ packages: tslib: 2.3.0 dev: false + /@nestjs/platform-socket.io/8.0.6_875c1aa90becd3a53d7e39e33971fbfe: + resolution: {integrity: sha512-974Yt8Jz7P69n4EqfR1mMzFFlb0Z+6bFCv0OAP3HrdZ71T/l4rd6OQ4+vhFvAMCxFmCh/JNWNZnYCY7e4x7oOA==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/websockets': ^8.0.0 + rxjs: ^7.1.0 + dependencies: + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + '@nestjs/websockets': 8.0.6_d9cb7157596bf7c6176480174d173b36 + rxjs: 7.3.0 + socket.io: 4.1.3 + tslib: 2.3.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /@nestjs/platform-socket.io/8.0.6_8860b0a72a5477011bab3476adc49ae3: resolution: {integrity: sha512-974Yt8Jz7P69n4EqfR1mMzFFlb0Z+6bFCv0OAP3HrdZ71T/l4rd6OQ4+vhFvAMCxFmCh/JNWNZnYCY7e4x7oOA==} peerDependencies: @@ -2524,6 +2652,28 @@ packages: tslib: 2.3.0 dev: false + /@nestjs/websockets/8.0.6_d9cb7157596bf7c6176480174d173b36: + resolution: {integrity: sha512-xwPkzjdu0q9CKtrVaH5p+pyPHGa8M705voDsazcZVIsTy8f5n/P1sAmYEbQSe7vq6KqGgvp+B6axW7f63/8EKA==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + '@nestjs/platform-socket.io': ^8.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + dependencies: + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + '@nestjs/core': 8.0.6_29489e331a4938cf69ca8b008049576b + '@nestjs/platform-socket.io': 8.0.6_875c1aa90becd3a53d7e39e33971fbfe + iterare: 1.2.1 + object-hash: 2.2.0 + reflect-metadata: 0.1.13 + rxjs: 7.3.0 + tslib: 2.3.0 + dev: false + /@ngtools/webpack/11.2.14_84d7e8866544a90079ce6d24006eb83f: resolution: {integrity: sha512-6q57tEWtUJRsxfTKE19L20iXvNesfVy8hrVdyzVk64DZQh0lIl4/xZT4d5bJCWOuQQDaAeZK4YbEFcYJn7k1yw==} engines: {node: '>= 10.13.0', npm: ^6.11.0 || ^7.5.6, yarn: '>= 1.13.0'} @@ -4022,6 +4172,14 @@ packages: - debug dev: false + /axios/0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.14.2 + transitivePeerDependencies: + - debug + dev: false + /axobject-query/2.0.2: resolution: {integrity: sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==} dependencies: @@ -5889,23 +6047,6 @@ packages: - utf-8-validate dev: false - /engine.io/5.0.0: - resolution: {integrity: sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==} - engines: {node: '>=10.0.0'} - dependencies: - accepts: 1.3.7 - base64id: 2.0.0 - cookie: 0.4.1 - cors: 2.8.5 - debug: 4.3.2 - engine.io-parser: 4.0.2 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /engine.io/5.1.1: resolution: {integrity: sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==} engines: {node: '>=10.0.0'} @@ -11517,6 +11658,12 @@ packages: tslib: 1.14.1 dev: false + /rxjs/7.3.0: + resolution: {integrity: sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==} + dependencies: + tslib: 2.1.0 + dev: false + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false @@ -11962,25 +12109,6 @@ packages: - utf-8-validate dev: false - /socket.io/4.0.2: - resolution: {integrity: sha512-1sVnsumrYTshhH2LWUtmzNvuZqkEOAG5PxcHpKu1r/sIDhzACTdo9XbvonVB2M90Y2CkTZnCWT6hlaKEkdBu5Q==} - engines: {node: '>=10.0.0'} - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.12 - '@types/node': 16.6.2 - accepts: 1.3.7 - base64id: 2.0.0 - debug: 4.3.2 - engine.io: 5.0.0 - socket.io-adapter: 2.2.0 - socket.io-parser: 4.0.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - /socket.io/4.1.3: resolution: {integrity: sha512-tLkaY13RcO4nIRh1K2hT5iuotfTaIQw7cVIe0FUykN3SuQi0cm7ALxuyT5/CtDswOMWUzMGTibxYNx/gU7In+Q==} engines: {node: '>=10.0.0'} @@ -14067,21 +14195,21 @@ packages: resolution: {integrity: sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==} dev: false - file:projects/chat-backend.tgz_rxjs@6.6.7: - resolution: {integrity: sha512-iMweA3qq3W99byvqHuECeziudEwSntjYIE8f3aBXgKjUpdbazOLQIblmrUtLeWnd9QbJpMnWHJGP5CYG3eBkjw==, tarball: file:projects/chat-backend.tgz} - id: file:projects/chat-backend.tgz + file:projects/chat-backend.tgz: + resolution: {integrity: sha512-NJe3L92w/fMe2FwXQaLyuqa6J9x43YGbKo1deKHUVMa8G9IJTHdWcwQTHoyBDlokIolKpQ8QG6n83IpClJO0oQ==, tarball: file:projects/chat-backend.tgz} name: '@rush-temp/chat-backend' version: 0.0.0 dependencies: + '@nestjs/axios': 0.0.2_e2399148d990aa1f9a4b6ba2ac7a5b74 '@nestjs/cli': 8.1.1 - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/config': 1.0.1_7e872a3ae58d5fbaf015bd8be835d7cf - '@nestjs/core': 8.0.6_2ecfd39b89d7693a33c80114858b8d42 + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + '@nestjs/config': 1.0.1_e2399148d990aa1f9a4b6ba2ac7a5b74 + '@nestjs/core': 8.0.6_29489e331a4938cf69ca8b008049576b '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea - '@nestjs/platform-socket.io': 8.0.6_8860b0a72a5477011bab3476adc49ae3 + '@nestjs/platform-socket.io': 8.0.6_875c1aa90becd3a53d7e39e33971fbfe '@nestjs/schematics': 8.0.2_typescript@4.3.5 '@nestjs/testing': 8.0.6_0f6569408de1f55b1e6481ed04272f1a - '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 + '@nestjs/websockets': 8.0.6_d9cb7157596bf7c6176480174d173b36 '@socket.io/cluster-adapter': 0.1.0 '@socket.io/sticky': 1.0.1 '@types/express': 4.17.13 @@ -14092,6 +14220,7 @@ packages: '@types/supertest': 2.0.11 '@typescript-eslint/eslint-plugin': 4.29.2_b01b7137116ac50f0745961d9cf72d34 '@typescript-eslint/parser': 4.29.2_eslint@7.32.0+typescript@4.3.5 + axios: 0.21.4 eslint: 7.32.0 eslint-config-prettier: 8.3.0_eslint@7.32.0 eslint-plugin-prettier: 3.4.0_5a48a349ffec60f5257b5f148f5199c3 @@ -14102,7 +14231,8 @@ packages: redis: 3.1.2 reflect-metadata: 0.1.13 rimraf: 3.0.2 - socket.io: 4.0.2 + rxjs: 7.3.0 + socket.io: 4.1.3 socket.io-redis: 6.1.1 supertest: 6.1.6 ts-jest: 27.0.5_52cc4273aa16028085013af47e479e10 @@ -14124,7 +14254,6 @@ packages: - class-validator - debug - node-notifier - - rxjs - supports-color - utf-8-validate - webpack diff --git a/docker-compose.yml b/docker-compose.yml index 542c886..a30ac73 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,7 @@ services: dockerfile: ./apps/chat-backend/Dockerfile ports: - '${BACKEND_PORT}:${BACKEND_PORT}' + restart: always depends_on: - 'redis' redis: @@ -18,3 +19,7 @@ services: service: nginx-base depends_on: - chat-backend + url-shortner: + extends: + file: common-services.yml + service: url-shortner-base diff --git a/scripts/get-url-shortner-api-key.sh b/scripts/get-url-shortner-api-key.sh new file mode 100644 index 0000000..b30dcde --- /dev/null +++ b/scripts/get-url-shortner-api-key.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +API_KEY_OUTPUT=$(docker exec -it session-chat_url-shortner_1 shlink api-key:generate --no-ansi) +OUTPUT_ARRAY=($API_KEY_OUTPUT) +OUTPUT_STATUS="${OUTPUT_ARRAY[0]}" + +if [ $OUTPUT_STATUS != "[OK]"]; then + exit 0 +fi + +IFS=':' +OUTPUT_SPLIT=($API_KEY_OUTPUT) +unset IFS + +API_KEY=$(echo "$OUTPUT_SPLIT" | tr -d '"') + +docker exec -it session-chat_chat-backend_1 URL_API_KEY="$API_KEY" From 58d15602e001803999ea1a5be2ca7348a366aae0 Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Fri, 1 Oct 2021 12:22:14 -0400 Subject: [PATCH 2/8] tested and fixed new startup scripts --- common/config/rush/pnpm-lock.yaml | 662 +++++++++++++++++++++++---- docker-compose.yml | 6 +- scripts/get-url-shortner-api-key.sh | 15 +- scripts/url-shortner-docker-start.sh | 15 + 4 files changed, 602 insertions(+), 96 deletions(-) create mode 100644 scripts/url-shortner-docker-start.sh diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 2e077b6..37ec51c 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2,6 +2,11 @@ lockfileVersion: 5.3 specifiers: '@angular-devkit/build-angular': ~0.1102.14 + '@angular-eslint/builder': 4.3.0 + '@angular-eslint/eslint-plugin': 4.3.0 + '@angular-eslint/eslint-plugin-template': 4.3.0 + '@angular-eslint/schematics': 4.3.0 + '@angular-eslint/template-parser': 4.3.0 '@angular/animations': ~11.2.14 '@angular/cdk': ^11.2.13 '@angular/cli': ~11.2.14 @@ -32,21 +37,20 @@ specifiers: '@schematics/angular': ~8.0.0 '@socket.io/cluster-adapter': ~0.1.0 '@socket.io/sticky': ~1.0.1 + '@types/create-hash': ~1.2.2 '@types/express': ^4.17.13 '@types/jasmine': ~3.6.0 '@types/jasminewd2': ~2.0.3 '@types/jest': ^26.0.24 '@types/jsonwebtoken': ~8.5.5 '@types/lodash': ~4.14.172 + '@types/randombytes': ~2.0.0 '@types/redis': ~2.8.31 '@types/supertest': ^2.0.11 - '@typescript-eslint/eslint-plugin': ^4.28.2 - '@typescript-eslint/parser': ^4.28.2 axios: ~0.21.4 bootstrap: ~5.1.0 - codelyzer: ^6.0.0 + create-hash: ~1.2.0 crypto-browserify: ~3.12.0 - eslint: ^7.30.0 eslint-config-prettier: ^8.3.0 eslint-plugin-prettier: ^3.4.0 eva-icons: ^1.1.1 @@ -64,10 +68,12 @@ specifiers: pm2: ^5.1.0 prettier: ^2.3.2 protractor: ~7.0.0 + puppeteer: ~10.4.0 + randombytes: ~2.1.0 + readable-stream: ~3.6.0 redis: ~3.1.2 reflect-metadata: ^0.1.13 rimraf: ^3.0.2 - rxjs: ~6.6.7 socket.io: ^4.0.0 socket.io-redis: ~6.1.1 supertest: ^6.1.3 @@ -81,53 +87,57 @@ specifiers: dependencies: '@angular-devkit/build-angular': 0.1102.14_d70971c3275c68653145b7b3b815b80a + '@angular-eslint/builder': 4.3.0_@angular+cli@11.2.14 + '@angular-eslint/eslint-plugin': 4.3.0_@angular+compiler@11.2.14 + '@angular-eslint/eslint-plugin-template': 4.3.0_38ecc431be2070cea73a777a80466a7d + '@angular-eslint/schematics': 4.3.0_969763885a0a3a7b1088644dae241c20 + '@angular-eslint/template-parser': 4.3.0_@angular+compiler@11.2.14 '@angular/animations': 11.2.14_@angular+core@11.2.14 '@angular/cdk': 11.2.13_fdd764655c71a68a8cf886ddd9a243b9 '@angular/cli': 11.2.14 - '@angular/common': 11.2.14_@angular+core@11.2.14+rxjs@6.6.7 + '@angular/common': 11.2.14_@angular+core@11.2.14 '@angular/compiler': 11.2.14 '@angular/compiler-cli': 11.2.14_@angular+compiler@11.2.14 - '@angular/core': 11.2.14_rxjs@6.6.7+zone.js@0.10.3 - '@angular/forms': 11.2.14_3c7adb9250e2c2c2751a0e8da273743b + '@angular/core': 11.2.14_zone.js@0.10.3 + '@angular/forms': 11.2.14_2c0acfbe51f4a76b165967dc1cc9b495 '@angular/language-service': 11.2.14 '@angular/platform-browser': 11.2.14_cc220f0cf26568bab1577f0589f48c4b '@angular/platform-browser-dynamic': 11.2.14_85d62dd5beb851f0d1c066e080f8fa0d - '@angular/router': 11.2.14_3c7adb9250e2c2c2751a0e8da273743b + '@angular/router': 11.2.14_2c0acfbe51f4a76b165967dc1cc9b495 '@auth0/angular-jwt': 5.0.2_@angular+common@11.2.14 '@nebular/eva-icons': 7.0.0_fce40857be57853c6ee52ce868e4bca2 - '@nebular/theme': 7.0.0_366e1deee14c799f0e7c0a230d57b62f - '@nestjs/axios': 0.0.2_7e872a3ae58d5fbaf015bd8be835d7cf + '@nebular/theme': 7.0.0_d29f9cb17cc5c94dc55333f6002c3673 + '@nestjs/axios': 0.0.2_a4257392a62a1fbdb75d53a51ca9cc62 '@nestjs/cli': 8.1.1 - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/config': 1.0.1_7e872a3ae58d5fbaf015bd8be835d7cf - '@nestjs/core': 8.0.6_2ecfd39b89d7693a33c80114858b8d42 + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 + '@nestjs/config': 1.0.1_a4257392a62a1fbdb75d53a51ca9cc62 + '@nestjs/core': 8.0.6_bc52f06b1e1f74cc8ee5457f032df2b2 '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea - '@nestjs/platform-socket.io': 8.0.6_8860b0a72a5477011bab3476adc49ae3 + '@nestjs/platform-socket.io': 8.0.6_6004b6ba107ec5da3ff25d7ea09df9d0 '@nestjs/schematics': 8.0.2 '@nestjs/testing': 8.0.6_0f6569408de1f55b1e6481ed04272f1a - '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 + '@nestjs/websockets': 8.0.6_2f4293bf5a600e2484c0343beea38d28 '@rush-temp/chat-backend': file:projects/chat-backend.tgz '@rush-temp/chat-frontend': file:projects/chat-frontend.tgz '@schematics/angular': 8.0.6 '@socket.io/cluster-adapter': 0.1.0 '@socket.io/sticky': 1.0.1 + '@types/create-hash': 1.2.2 '@types/express': 4.17.13 '@types/jasmine': 3.6.11 '@types/jasminewd2': 2.0.10 '@types/jest': 26.0.24 '@types/jsonwebtoken': 8.5.5 '@types/lodash': 4.14.172 + '@types/randombytes': 2.0.0 '@types/redis': 2.8.31 '@types/supertest': 2.0.11 - '@typescript-eslint/eslint-plugin': 4.29.2_061bcf7d10a51dd5ea7168c21da6ce0b - '@typescript-eslint/parser': 4.29.2_eslint@7.32.0 axios: 0.21.4 bootstrap: 5.1.0 - codelyzer: 6.0.2_tslint@6.1.3 + create-hash: 1.2.0 crypto-browserify: 3.12.0 - eslint: 7.32.0 - eslint-config-prettier: 8.3.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.0_5a48a349ffec60f5257b5f148f5199c3 + eslint-config-prettier: 8.3.0 + eslint-plugin-prettier: 3.4.0_ae3805332b62cec006ed24a9ec35ea79 eva-icons: 1.1.3 jasmine-core: 3.6.0 jasmine-spec-reporter: 5.0.2 @@ -139,14 +149,16 @@ dependencies: karma-jasmine: 4.0.1_karma@6.3.4 karma-jasmine-html-reporter: 1.7.0_fb490aaaf4cac2563aa07855d18f8066 lodash: 4.17.21 - ngx-socket-io: 4.1.0_f492959a76b3b0e4754dd8b45ae9f4ef + ngx-socket-io: 4.1.0_fdd764655c71a68a8cf886ddd9a243b9 pm2: 5.1.0 prettier: 2.3.2 protractor: 7.0.0 + puppeteer: 10.4.0 + randombytes: 2.1.0 + readable-stream: 3.6.0 redis: 3.1.2 reflect-metadata: 0.1.13 rimraf: 3.0.2 - rxjs: 6.6.7 socket.io: 4.1.3 socket.io-redis: 6.1.1 supertest: 6.1.6 @@ -523,12 +535,160 @@ packages: rxjs: 6.4.0 dev: false + /@angular-eslint/builder/4.3.0_@angular+cli@11.2.14: + resolution: {integrity: sha512-OzCA4jyELbHt8pyRuW6asib26rc+Ihr2SDjp+uoMivfpqjWVPOw0CvvEZj4SbpGvYOHtcAezyS526D2q2tKHvg==} + peerDependencies: + '@angular/cli': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular/cli': 11.2.14 + dev: false + + /@angular-eslint/builder/4.3.0_a04cfb94d00ab321177c5e05ef63ba4a: + resolution: {integrity: sha512-OzCA4jyELbHt8pyRuW6asib26rc+Ihr2SDjp+uoMivfpqjWVPOw0CvvEZj4SbpGvYOHtcAezyS526D2q2tKHvg==} + peerDependencies: + '@angular/cli': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular/cli': 11.2.14 + eslint: 7.32.0 + typescript: 4.0.8 + dev: false + + /@angular-eslint/eslint-plugin-template/4.3.0_38ecc431be2070cea73a777a80466a7d: + resolution: {integrity: sha512-5DuCvEa3cYx0G2mZtECAwgJ19xJWAFZ8Fu8mIkKDiof1dcUISs1PvECJ6NhdzfxEJp0McPQn1jtOK0IDRX1eJw==} + peerDependencies: + '@angular-eslint/template-parser': '*' + '@angular/compiler': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular-eslint/template-parser': 4.3.0_@angular+compiler@11.2.14 + '@angular/compiler': 11.2.14 + '@typescript-eslint/experimental-utils': 4.16.1 + aria-query: 4.2.2 + axobject-query: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@angular-eslint/eslint-plugin-template/4.3.0_39fe200250ce323fa9ec9c488a50f82d: + resolution: {integrity: sha512-5DuCvEa3cYx0G2mZtECAwgJ19xJWAFZ8Fu8mIkKDiof1dcUISs1PvECJ6NhdzfxEJp0McPQn1jtOK0IDRX1eJw==} + peerDependencies: + '@angular-eslint/template-parser': '*' + '@angular/compiler': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular-eslint/template-parser': 4.3.0_8cc68e0533860fa85394503fb838aec1 + '@angular/compiler': 11.2.14 + '@typescript-eslint/experimental-utils': 4.16.1_eslint@7.32.0+typescript@4.0.8 + aria-query: 4.2.2 + axobject-query: 2.2.0 + eslint: 7.32.0 + typescript: 4.0.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@angular-eslint/eslint-plugin/4.3.0_8cc68e0533860fa85394503fb838aec1: + resolution: {integrity: sha512-an0fyKzPmpWp9OnstZYXFSCvKnc14F8xfl+HXqvynOiBK63cWTZLlzO+7Z4t3pQiSuiXsEYleRPktWkNWGv0tQ==} + peerDependencies: + '@angular/compiler': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular/compiler': 11.2.14 + '@typescript-eslint/experimental-utils': 4.16.1_eslint@7.32.0+typescript@4.0.8 + eslint: 7.32.0 + typescript: 4.0.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@angular-eslint/eslint-plugin/4.3.0_@angular+compiler@11.2.14: + resolution: {integrity: sha512-an0fyKzPmpWp9OnstZYXFSCvKnc14F8xfl+HXqvynOiBK63cWTZLlzO+7Z4t3pQiSuiXsEYleRPktWkNWGv0tQ==} + peerDependencies: + '@angular/compiler': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular/compiler': 11.2.14 + '@typescript-eslint/experimental-utils': 4.16.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@angular-eslint/schematics/4.3.0_969763885a0a3a7b1088644dae241c20: + resolution: {integrity: sha512-zHEpvWoT0mdylQw/K7+RccBK2rJq0to6ZbIp9i65+RZZTHbscaJaDISFvBHm5RNwEhoWI7sJ14ci66pnpAxx3g==} + peerDependencies: + '@angular/cli': '>= 11.2.0 < 12.0.0' + dependencies: + '@angular-eslint/eslint-plugin': 4.3.0_@angular+compiler@11.2.14 + '@angular-eslint/eslint-plugin-template': 4.3.0_38ecc431be2070cea73a777a80466a7d + '@angular/cli': 11.2.14 + ignore: 5.1.8 + strip-json-comments: 3.1.1 + tmp: 0.2.1 + transitivePeerDependencies: + - '@angular-eslint/template-parser' + - '@angular/compiler' + - eslint + - supports-color + - typescript + dev: false + + /@angular-eslint/schematics/4.3.0_ee5f1abc1d59a7ed20175ac3008816f8: + resolution: {integrity: sha512-zHEpvWoT0mdylQw/K7+RccBK2rJq0to6ZbIp9i65+RZZTHbscaJaDISFvBHm5RNwEhoWI7sJ14ci66pnpAxx3g==} + peerDependencies: + '@angular/cli': '>= 11.2.0 < 12.0.0' + dependencies: + '@angular-eslint/eslint-plugin': 4.3.0_8cc68e0533860fa85394503fb838aec1 + '@angular-eslint/eslint-plugin-template': 4.3.0_39fe200250ce323fa9ec9c488a50f82d + '@angular/cli': 11.2.14 + ignore: 5.1.8 + strip-json-comments: 3.1.1 + tmp: 0.2.1 + transitivePeerDependencies: + - '@angular-eslint/template-parser' + - '@angular/compiler' + - eslint + - supports-color + - typescript + dev: false + + /@angular-eslint/template-parser/4.3.0_8cc68e0533860fa85394503fb838aec1: + resolution: {integrity: sha512-TH+UCrDmOWNLgNgTTR46+wpvgJ3q9Vf9kzqUA5vUNbg/Hhrdbi++DPeCiKagSAXkNBQavqcmyYuT9fzUReIDIg==} + peerDependencies: + '@angular/compiler': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular/compiler': 11.2.14 + eslint: 7.32.0 + eslint-scope: 5.1.1 + typescript: 4.0.8 + dev: false + + /@angular-eslint/template-parser/4.3.0_@angular+compiler@11.2.14: + resolution: {integrity: sha512-TH+UCrDmOWNLgNgTTR46+wpvgJ3q9Vf9kzqUA5vUNbg/Hhrdbi++DPeCiKagSAXkNBQavqcmyYuT9fzUReIDIg==} + peerDependencies: + '@angular/compiler': '>= 11.2.0 < 12.0.0' + eslint: '*' + typescript: '*' + dependencies: + '@angular/compiler': 11.2.14 + eslint-scope: 5.1.1 + dev: false + /@angular/animations/11.2.14_@angular+core@11.2.14: resolution: {integrity: sha512-Heq/nNrCmb3jbkusu+BQszOecfFI/31Oxxj+CDQkqqYpBcswk6bOJLoEE472o+vmgxaXbgeflU9qbIiCQhpMFA==} peerDependencies: '@angular/core': 11.2.14 dependencies: - '@angular/core': 11.2.14_rxjs@6.6.7+zone.js@0.10.3 + '@angular/core': 11.2.14_zone.js@0.10.3 tslib: 2.3.1 dev: false @@ -538,8 +698,8 @@ packages: '@angular/common': ^11.0.0 || ^12.0.0-0 '@angular/core': ^11.0.0 || ^12.0.0-0 dependencies: - '@angular/common': 11.2.14_@angular+core@11.2.14+rxjs@6.6.7 - '@angular/core': 11.2.14_rxjs@6.6.7+zone.js@0.10.3 + '@angular/common': 11.2.14_@angular+core@11.2.14 + '@angular/core': 11.2.14_zone.js@0.10.3 tslib: 2.3.1 optionalDependencies: parse5: 5.1.1 @@ -577,6 +737,16 @@ packages: - supports-color dev: false + /@angular/common/11.2.14_@angular+core@11.2.14: + resolution: {integrity: sha512-ZSLV/3j7eCTyLf/8g4yBFLWySjiLz3vLJAGWscYoUpnJWMnug1VRu6zoF/COxCbtORgE+Wz6K0uhfS6MziBGVw==} + peerDependencies: + '@angular/core': 11.2.14 + rxjs: ^6.5.3 + dependencies: + '@angular/core': 11.2.14_zone.js@0.10.3 + tslib: 2.3.1 + dev: false + /@angular/common/11.2.14_@angular+core@11.2.14+rxjs@6.6.7: resolution: {integrity: sha512-ZSLV/3j7eCTyLf/8g4yBFLWySjiLz3vLJAGWscYoUpnJWMnug1VRu6zoF/COxCbtORgE+Wz6K0uhfS6MziBGVw==} peerDependencies: @@ -670,6 +840,16 @@ packages: zone.js: 0.10.3 dev: false + /@angular/core/11.2.14_zone.js@0.10.3: + resolution: {integrity: sha512-vpR4XqBGitk1Faph37CSpemwIYTmJ3pdIVNoHKP6jLonpWu+0azkchf0f7oD8/2ivj2F81opcIw0tcsy/D/5Vg==} + peerDependencies: + rxjs: ^6.5.3 + zone.js: ^0.10.2 || ^0.11.3 + dependencies: + tslib: 2.3.1 + zone.js: 0.10.3 + dev: false + /@angular/core/9.0.0_ed6f97b6c42afc3b298adb4ba822fb67: resolution: {integrity: sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==} peerDependencies: @@ -682,6 +862,20 @@ packages: zone.js: 0.10.3 dev: false + /@angular/forms/11.2.14_2c0acfbe51f4a76b165967dc1cc9b495: + resolution: {integrity: sha512-4LWqY6KEIk1AZQFnk+4PJSOCamlD4tumuVN06gO4D0dZo9Cx+GcvW6pM6N0CPubRvPs3sScCnu20WT11HNWC1w==} + peerDependencies: + '@angular/common': 11.2.14 + '@angular/core': 11.2.14 + '@angular/platform-browser': 11.2.14 + rxjs: ^6.5.3 + dependencies: + '@angular/common': 11.2.14_@angular+core@11.2.14 + '@angular/core': 11.2.14_zone.js@0.10.3 + '@angular/platform-browser': 11.2.14_cc220f0cf26568bab1577f0589f48c4b + tslib: 2.3.1 + dev: false + /@angular/forms/11.2.14_3c7adb9250e2c2c2751a0e8da273743b: resolution: {integrity: sha512-4LWqY6KEIk1AZQFnk+4PJSOCamlD4tumuVN06gO4D0dZo9Cx+GcvW6pM6N0CPubRvPs3sScCnu20WT11HNWC1w==} peerDependencies: @@ -709,9 +903,9 @@ packages: '@angular/core': 11.2.14 '@angular/platform-browser': 11.2.14 dependencies: - '@angular/common': 11.2.14_@angular+core@11.2.14+rxjs@6.6.7 + '@angular/common': 11.2.14_@angular+core@11.2.14 '@angular/compiler': 11.2.14 - '@angular/core': 11.2.14_rxjs@6.6.7+zone.js@0.10.3 + '@angular/core': 11.2.14_zone.js@0.10.3 '@angular/platform-browser': 11.2.14_cc220f0cf26568bab1577f0589f48c4b tslib: 2.3.1 dev: false @@ -727,8 +921,22 @@ packages: optional: true dependencies: '@angular/animations': 11.2.14_@angular+core@11.2.14 - '@angular/common': 11.2.14_@angular+core@11.2.14+rxjs@6.6.7 - '@angular/core': 11.2.14_rxjs@6.6.7+zone.js@0.10.3 + '@angular/common': 11.2.14_@angular+core@11.2.14 + '@angular/core': 11.2.14_zone.js@0.10.3 + tslib: 2.3.1 + dev: false + + /@angular/router/11.2.14_2c0acfbe51f4a76b165967dc1cc9b495: + resolution: {integrity: sha512-3aYBmj+zrEL9yf/ntIQxHIYaWShZOBKP3U07X2mX+TPMpGlvHDnR7L6bWhQVZwewzMMz7YVR16ldg50IFuAlfA==} + peerDependencies: + '@angular/common': 11.2.14 + '@angular/core': 11.2.14 + '@angular/platform-browser': 11.2.14 + rxjs: ^6.5.3 + dependencies: + '@angular/common': 11.2.14_@angular+core@11.2.14 + '@angular/core': 11.2.14_zone.js@0.10.3 + '@angular/platform-browser': 11.2.14_cc220f0cf26568bab1577f0589f48c4b tslib: 2.3.1 dev: false @@ -752,7 +960,7 @@ packages: peerDependencies: '@angular/common': '>=9.0.0' dependencies: - '@angular/common': 11.2.14_@angular+core@11.2.14+rxjs@6.6.7 + '@angular/common': 11.2.14_@angular+core@11.2.14 tslib: 2.3.1 dev: false @@ -1909,6 +2117,14 @@ packages: esutils: 2.0.3 dev: false + /@babel/runtime-corejs3/7.15.4: + resolution: {integrity: sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.18.1 + regenerator-runtime: 0.13.7 + dev: false + /@babel/runtime/7.12.5: resolution: {integrity: sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==} dependencies: @@ -2296,7 +2512,7 @@ packages: '@nebular/theme': 7.0.0 eva-icons: ^1.1.2 dependencies: - '@nebular/theme': 7.0.0_366e1deee14c799f0e7c0a230d57b62f + '@nebular/theme': 7.0.0_d29f9cb17cc5c94dc55333f6002c3673 eva-icons: 1.1.3 dev: false @@ -2321,17 +2537,36 @@ packages: tslib: 2.3.1 dev: false - /@nestjs/axios/0.0.2_7e872a3ae58d5fbaf015bd8be835d7cf: + /@nebular/theme/7.0.0_d29f9cb17cc5c94dc55333f6002c3673: + resolution: {integrity: sha512-0S9Pans6eevkSgg8aoNG7dypkLeOUsTRLMoBsp7LjjuBIDLGJr9/zf9d8sPZ8uaJvPG1AIOtw89KGwNnhatIGA==} + peerDependencies: + '@angular/animations': ^11.0.0 + '@angular/cdk': ^11.0.0 + '@angular/common': ^11.0.0 + '@angular/core': ^11.0.0 + '@angular/router': ^11.0.0 + rxjs: ^6.5.4 + tslib: ^2.0.0 + dependencies: + '@angular/animations': 11.2.14_@angular+core@11.2.14 + '@angular/cdk': 11.2.13_fdd764655c71a68a8cf886ddd9a243b9 + '@angular/common': 11.2.14_@angular+core@11.2.14 + '@angular/core': 11.2.14_zone.js@0.10.3 + '@angular/router': 11.2.14_2c0acfbe51f4a76b165967dc1cc9b495 + intersection-observer: 0.7.0 + tslib: 2.3.1 + dev: false + + /@nestjs/axios/0.0.2_a4257392a62a1fbdb75d53a51ca9cc62: resolution: {integrity: sha512-T0EKw91tJ+/XhmDYsr4DrRJ+grn0VEOZ6zAkuJfKM4ltBqwI5dTM8T8BumGqVZ3iGe5YTo/PMb/o8oilJaajwg==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 axios: 0.21.4 reflect-metadata: 0.1.13 - rxjs: 6.6.7 transitivePeerDependencies: - debug dev: false @@ -2408,7 +2643,7 @@ packages: - debug dev: false - /@nestjs/common/8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc: + /@nestjs/common/8.0.6_reflect-metadata@0.1.13: resolution: {integrity: sha512-mSD000iYJDN2wjL2hbygCVNVvzvi3VW5EDc25gK1Bj3wUU2HR8m1qOAUBqcCaGIuvBb2cD/pnVkKklnsY0rKhw==} peerDependencies: cache-manager: '*' @@ -2427,28 +2662,26 @@ packages: axios: 0.21.1 iterare: 1.2.1 reflect-metadata: 0.1.13 - rxjs: 6.6.7 tslib: 2.3.0 uuid: 8.3.2 transitivePeerDependencies: - debug dev: false - /@nestjs/config/1.0.1_7e872a3ae58d5fbaf015bd8be835d7cf: + /@nestjs/config/1.0.1_a4257392a62a1fbdb75d53a51ca9cc62: resolution: {integrity: sha512-azMl4uYlFIhYsywFxPJT81RxF3Pnn0TZW3EEmr0Wa0Wex8R2xpvBNrCcrOgW3TB1xGMP7eqBrlfsVh5ZP82szg==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 reflect-metadata: ^0.1.13 rxjs: ^6.0.0 || ^7.2.0 dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 dotenv: 10.0.0 dotenv-expand: 5.1.0 lodash.get: 4.4.2 lodash.has: 4.5.2 lodash.set: 4.3.2 reflect-metadata: 0.1.13 - rxjs: 6.6.7 uuid: 8.3.2 dev: false @@ -2502,7 +2735,7 @@ packages: uuid: 8.3.2 dev: false - /@nestjs/core/8.0.6_2ecfd39b89d7693a33c80114858b8d42: + /@nestjs/core/8.0.6_bc52f06b1e1f74cc8ee5457f032df2b2: resolution: {integrity: sha512-PIGL4TMjVkAsiv5hJinaTx3WdoftYh7pJDwIUQPvRZPLhboGbOJlVapN0Cw5SL7XgNWojQiAsbgLmnGJVDO3Sw==} requiresBuild: true peerDependencies: @@ -2520,16 +2753,15 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea - '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 + '@nestjs/websockets': 8.0.6_2f4293bf5a600e2484c0343beea38d28 '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.0.8 iterare: 1.2.1 object-hash: 2.2.0 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 - rxjs: 6.6.7 tslib: 2.3.0 uuid: 8.3.2 dev: false @@ -2540,8 +2772,8 @@ packages: '@nestjs/common': ^8.0.0 '@nestjs/core': ^8.0.0 dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/core': 8.0.6_2ecfd39b89d7693a33c80114858b8d42 + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 + '@nestjs/core': 8.0.6_bc52f06b1e1f74cc8ee5457f032df2b2 body-parser: 1.19.0 cors: 2.8.5 express: 4.17.1 @@ -2549,16 +2781,15 @@ packages: tslib: 2.3.0 dev: false - /@nestjs/platform-socket.io/8.0.6_875c1aa90becd3a53d7e39e33971fbfe: + /@nestjs/platform-socket.io/8.0.6_6004b6ba107ec5da3ff25d7ea09df9d0: resolution: {integrity: sha512-974Yt8Jz7P69n4EqfR1mMzFFlb0Z+6bFCv0OAP3HrdZ71T/l4rd6OQ4+vhFvAMCxFmCh/JNWNZnYCY7e4x7oOA==} peerDependencies: '@nestjs/common': ^8.0.0 '@nestjs/websockets': ^8.0.0 rxjs: ^7.1.0 dependencies: - '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b - '@nestjs/websockets': 8.0.6_d9cb7157596bf7c6176480174d173b36 - rxjs: 7.3.0 + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 + '@nestjs/websockets': 8.0.6_2f4293bf5a600e2484c0343beea38d28 socket.io: 4.1.3 tslib: 2.3.0 transitivePeerDependencies: @@ -2567,16 +2798,16 @@ packages: - utf-8-validate dev: false - /@nestjs/platform-socket.io/8.0.6_8860b0a72a5477011bab3476adc49ae3: + /@nestjs/platform-socket.io/8.0.6_875c1aa90becd3a53d7e39e33971fbfe: resolution: {integrity: sha512-974Yt8Jz7P69n4EqfR1mMzFFlb0Z+6bFCv0OAP3HrdZ71T/l4rd6OQ4+vhFvAMCxFmCh/JNWNZnYCY7e4x7oOA==} peerDependencies: '@nestjs/common': ^8.0.0 '@nestjs/websockets': ^8.0.0 rxjs: ^7.1.0 dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 - rxjs: 6.6.7 + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b + '@nestjs/websockets': 8.0.6_d9cb7157596bf7c6176480174d173b36 + rxjs: 7.3.0 socket.io: 4.1.3 tslib: 2.3.0 transitivePeerDependencies: @@ -2624,13 +2855,13 @@ packages: optional: true dependencies: optional: 0.1.4 - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/core': 8.0.6_2ecfd39b89d7693a33c80114858b8d42 + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 + '@nestjs/core': 8.0.6_bc52f06b1e1f74cc8ee5457f032df2b2 '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea tslib: 2.3.0 dev: false - /@nestjs/websockets/8.0.6_4f480b5f7c61a959bccfea99ccb3aa50: + /@nestjs/websockets/8.0.6_2f4293bf5a600e2484c0343beea38d28: resolution: {integrity: sha512-xwPkzjdu0q9CKtrVaH5p+pyPHGa8M705voDsazcZVIsTy8f5n/P1sAmYEbQSe7vq6KqGgvp+B6axW7f63/8EKA==} peerDependencies: '@nestjs/common': ^8.0.0 @@ -2642,13 +2873,12 @@ packages: '@nestjs/platform-socket.io': optional: true dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/core': 8.0.6_2ecfd39b89d7693a33c80114858b8d42 - '@nestjs/platform-socket.io': 8.0.6_8860b0a72a5477011bab3476adc49ae3 + '@nestjs/common': 8.0.6_reflect-metadata@0.1.13 + '@nestjs/core': 8.0.6_bc52f06b1e1f74cc8ee5457f032df2b2 + '@nestjs/platform-socket.io': 8.0.6_6004b6ba107ec5da3ff25d7ea09df9d0 iterare: 1.2.1 object-hash: 2.2.0 reflect-metadata: 0.1.13 - rxjs: 6.6.7 tslib: 2.3.0 dev: false @@ -3032,6 +3262,12 @@ packages: resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} dev: false + /@types/create-hash/1.2.2: + resolution: {integrity: sha512-Fg8/kfMJObbETFU/Tn+Y0jieYewryLrbKwLCEIwPyklZZVY2qB+64KFjhplGSw+cseZosfFXctXO+PyIYD8iZQ==} + dependencies: + '@types/node': 16.6.2 + dev: false + /@types/diffie-hellman/5.0.0: resolution: {integrity: sha512-7tAAd40YU/U6Wsv6I+mirSXaEIWiHWvUs+PpYqHJjJmHAhUJRi8uaZPood3n+Q9cQud7y9p1WEnZuHq6RMd5dw==} dependencies: @@ -3169,6 +3405,12 @@ packages: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: false + /@types/randombytes/2.0.0: + resolution: {integrity: sha512-bz8PhAVlwN72vqefzxa14DKNT8jK/mV66CSjwdVQM/k3Th3EPKfUtdMniwZgMedQTFuywAsfjnZsg+pEnltaMA==} + dependencies: + '@types/node': 16.6.2 + dev: false + /@types/range-parser/1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: false @@ -3243,8 +3485,15 @@ packages: '@types/yargs-parser': 20.2.1 dev: false - /@typescript-eslint/eslint-plugin/4.29.2_061bcf7d10a51dd5ea7168c21da6ce0b: - resolution: {integrity: sha512-x4EMgn4BTfVd9+Z+r+6rmWxoAzBaapt4QFqE+d8L8sUtYZYLDTK6VG/y/SMMWA5t1/BVU5Kf+20rX4PtWzUYZg==} + /@types/yauzl/2.9.2: + resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==} + dependencies: + '@types/node': 16.6.2 + dev: false + optional: true + + /@typescript-eslint/eslint-plugin/4.16.1_4886d4136145938ae6303fd642f6711b: + resolution: {integrity: sha512-SK777klBdlkUZpZLC1mPvyOWk9yAFCWmug13eAjVQ4/Q1LATE/NbcQL1xDHkptQkZOLnPmLUA1Y54m8dqYwnoQ==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: '@typescript-eslint/parser': ^4.0.0 @@ -3254,15 +3503,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.29.2_eslint@7.32.0 - '@typescript-eslint/parser': 4.29.2_eslint@7.32.0 - '@typescript-eslint/scope-manager': 4.29.2 + '@typescript-eslint/experimental-utils': 4.16.1_eslint@7.32.0+typescript@4.0.8 + '@typescript-eslint/parser': 4.16.1_eslint@7.32.0+typescript@4.0.8 + '@typescript-eslint/scope-manager': 4.16.1 debug: 4.3.2 eslint: 7.32.0 functional-red-black-tree: 1.0.1 + lodash: 4.17.21 regexpp: 3.2.0 semver: 7.3.5 - tsutils: 3.21.0 + tsutils: 3.21.0_typescript@4.0.8 + typescript: 4.0.8 transitivePeerDependencies: - supports-color dev: false @@ -3292,19 +3543,36 @@ packages: - supports-color dev: false - /@typescript-eslint/experimental-utils/4.29.2_eslint@7.32.0: - resolution: {integrity: sha512-P6mn4pqObhftBBPAv4GQtEK7Yos1fz/MlpT7+YjH9fTxZcALbiiPKuSIfYP/j13CeOjfq8/fr9Thr2glM9ub7A==} + /@typescript-eslint/experimental-utils/4.16.1: + resolution: {integrity: sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: '*' dependencies: '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 4.29.2 - '@typescript-eslint/types': 4.29.2 - '@typescript-eslint/typescript-estree': 4.29.2 + '@typescript-eslint/scope-manager': 4.16.1 + '@typescript-eslint/types': 4.16.1 + '@typescript-eslint/typescript-estree': 4.16.1 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/experimental-utils/4.16.1_eslint@7.32.0+typescript@4.0.8: + resolution: {integrity: sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 4.16.1 + '@typescript-eslint/types': 4.16.1 + '@typescript-eslint/typescript-estree': 4.16.1_typescript@4.0.8 eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 + eslint-utils: 2.1.0 transitivePeerDependencies: - supports-color - typescript @@ -3328,8 +3596,8 @@ packages: - typescript dev: false - /@typescript-eslint/parser/4.29.2_eslint@7.32.0: - resolution: {integrity: sha512-WQ6BPf+lNuwteUuyk1jD/aHKqMQ9jrdCn7Gxt9vvBnzbpj7aWEf+aZsJ1zvTjx5zFxGCt000lsbD9tQPEL8u6g==} + /@typescript-eslint/parser/4.16.1_eslint@7.32.0+typescript@4.0.8: + resolution: {integrity: sha512-/c0LEZcDL5y8RyI1zLcmZMvJrsR6SM1uetskFkoh3dvqDKVXPsXI+wFB/CbVw7WkEyyTKobC1mUNp/5y6gRvXg==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3338,11 +3606,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 4.29.2 - '@typescript-eslint/types': 4.29.2 - '@typescript-eslint/typescript-estree': 4.29.2 + '@typescript-eslint/scope-manager': 4.16.1 + '@typescript-eslint/types': 4.16.1 + '@typescript-eslint/typescript-estree': 4.16.1_typescript@4.0.8 debug: 4.3.2 eslint: 7.32.0 + typescript: 4.0.8 transitivePeerDependencies: - supports-color dev: false @@ -3367,6 +3636,14 @@ packages: - supports-color dev: false + /@typescript-eslint/scope-manager/4.16.1: + resolution: {integrity: sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.16.1 + '@typescript-eslint/visitor-keys': 4.16.1 + dev: false + /@typescript-eslint/scope-manager/4.29.2: resolution: {integrity: sha512-mfHmvlQxmfkU8D55CkZO2sQOueTxLqGvzV+mG6S/6fIunDiD2ouwsAoiYCZYDDK73QCibYjIZmGhpvKwAB5BOA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3375,13 +3652,18 @@ packages: '@typescript-eslint/visitor-keys': 4.29.2 dev: false + /@typescript-eslint/types/4.16.1: + resolution: {integrity: sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dev: false + /@typescript-eslint/types/4.29.2: resolution: {integrity: sha512-K6ApnEXId+WTGxqnda8z4LhNMa/pZmbTFkDxEBLQAbhLZL50DjeY0VIDCml/0Y3FlcbqXZrABqrcKxq+n0LwzQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: false - /@typescript-eslint/typescript-estree/4.29.2: - resolution: {integrity: sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg==} + /@typescript-eslint/typescript-estree/4.16.1: + resolution: {integrity: sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: typescript: '*' @@ -3389,8 +3671,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.29.2 - '@typescript-eslint/visitor-keys': 4.29.2 + '@typescript-eslint/types': 4.16.1 + '@typescript-eslint/visitor-keys': 4.16.1 debug: 4.3.2 globby: 11.0.4 is-glob: 4.0.1 @@ -3400,6 +3682,27 @@ packages: - supports-color dev: false + /@typescript-eslint/typescript-estree/4.16.1_typescript@4.0.8: + resolution: {integrity: sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 4.16.1 + '@typescript-eslint/visitor-keys': 4.16.1 + debug: 4.3.2 + globby: 11.0.4 + is-glob: 4.0.1 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.0.8 + typescript: 4.0.8 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/typescript-estree/4.29.2_typescript@4.3.5: resolution: {integrity: sha512-TJ0/hEnYxapYn9SGn3dCnETO0r+MjaxtlWZ2xU+EvytF0g4CqTpZL48SqSNn2hXsPolnewF30pdzR9a5Lj3DNg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3421,6 +3724,14 @@ packages: - supports-color dev: false + /@typescript-eslint/visitor-keys/4.16.1: + resolution: {integrity: sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.16.1 + eslint-visitor-keys: 2.1.0 + dev: false + /@typescript-eslint/visitor-keys/4.29.2: resolution: {integrity: sha512-bDgJLQ86oWHJoZ1ai4TZdgXzJxsea3Ee9u9wsTAvjChdj2WLcVsgWYAPeY7RQMn16tKrlQaBnpKv7KBfs4EQag==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3993,6 +4304,14 @@ packages: commander: 2.20.3 dev: false + /aria-query/4.2.2: + resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} + engines: {node: '>=6.0'} + dependencies: + '@babel/runtime': 7.12.5 + '@babel/runtime-corejs3': 7.15.4 + dev: false + /arr-diff/4.0.0: resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} engines: {node: '>=0.10.0'} @@ -4186,6 +4505,10 @@ packages: ast-types-flow: 0.0.7 dev: false + /axobject-query/2.2.0: + resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} + dev: false + /babel-jest/27.0.6_@babel+core@7.15.0: resolution: {integrity: sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4549,6 +4872,10 @@ packages: node-int64: 0.4.0 dev: false + /buffer-crc32/0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + dev: false + /buffer-equal-constant-time/1.0.1: resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} dev: false @@ -5212,6 +5539,11 @@ packages: semver: 7.0.0 dev: false + /core-js-pure/3.18.1: + resolution: {integrity: sha512-kmW/k8MaSuqpvA1xm2l3TVlBuvW+XBkcaOroFUpO3D4lsTGQWBTb/tBDCf/PNkkPLrwgrkQRIYNPB0CeqGJWGQ==} + requiresBuild: true + dev: false + /core-js/3.16.3: resolution: {integrity: sha512-lM3GftxzHNtPNUJg0v4pC2RC6puwMd6VZA7vXUczi+SKmCWSf4JwO89VJGMqbzmB7jlK7B5hr3S64PqwFL49cA==} requiresBuild: true @@ -5787,6 +6119,10 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: false + /devtools-protocol/0.0.901419: + resolution: {integrity: sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==} + dev: false + /di/0.0.1: resolution: {integrity: sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=} dev: false @@ -6194,6 +6530,13 @@ packages: source-map: 0.6.1 dev: false + /eslint-config-prettier/8.3.0: + resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dev: false + /eslint-config-prettier/8.3.0_eslint@7.32.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true @@ -6220,6 +6563,22 @@ packages: prettier-linter-helpers: 1.0.0 dev: false + /eslint-plugin-prettier/3.4.0_ae3805332b62cec006ed24a9ec35ea79: + resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint-config-prettier: 8.3.0 + prettier: 2.3.2 + prettier-linter-helpers: 1.0.0 + dev: false + /eslint-scope/4.0.3: resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} engines: {node: '>=4.0.0'} @@ -6551,6 +6910,20 @@ packages: to-regex: 3.0.2 dev: false + /extract-zip/2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.2 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.9.2 + transitivePeerDependencies: + - supports-color + dev: false + /extsprintf/1.3.0: resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} engines: {'0': node >=0.6.0} @@ -6633,6 +7006,12 @@ packages: resolution: {integrity: sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=} dev: false + /fd-slicer/1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + dependencies: + pend: 1.2.0 + dev: false + /figgy-pudding/3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} dev: false @@ -6858,6 +7237,10 @@ packages: readable-stream: 2.3.7 dev: false + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs-extra/10.0.0: resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} engines: {node: '>=12'} @@ -9652,6 +10035,27 @@ packages: - utf-8-validate dev: false + /ngx-socket-io/4.1.0_fdd764655c71a68a8cf886ddd9a243b9: + resolution: {integrity: sha512-p/IxD/hdpF/3+Xu6FFoo1OMIi9+rbqN55smJKE1RSFHAhS0UmRno2soHd1RTG3QXm6hCntp2vvfPE4tn60P5mw==} + peerDependencies: + '@angular/common': ^12.0.0 + '@angular/core': ^12.0.0 + rxjs: ^6.1.0 + dependencies: + '@angular/common': 11.2.14_@angular+core@11.2.14 + '@angular/core': 11.2.14_zone.js@0.10.3 + core-js: 3.16.3 + reflect-metadata: 0.1.13 + socket.io: 4.1.3 + socket.io-client: 4.1.3 + tslib: 2.3.1 + zone.js: 0.10.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false @@ -10367,6 +10771,10 @@ packages: sha.js: 2.4.11 dev: false + /pend/1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + dev: false + /performance-now/2.1.0: resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} dev: false @@ -11002,6 +11410,11 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /progress/2.0.1: + resolution: {integrity: sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==} + engines: {node: '>=0.4.0'} + dev: false + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -11141,6 +11554,29 @@ packages: engines: {node: '>=6'} dev: false + /puppeteer/10.4.0: + resolution: {integrity: sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==} + engines: {node: '>=10.18.1'} + requiresBuild: true + dependencies: + debug: 4.3.1 + devtools-protocol: 0.0.901419 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.0 + node-fetch: 2.6.1 + pkg-dir: 4.2.0 + progress: 2.0.1 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.0.0 + unbzip2-stream: 1.3.3 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /q/1.4.1: resolution: {integrity: sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -12683,6 +13119,26 @@ packages: engines: {node: '>=6'} dev: false + /tar-fs/2.0.0: + resolution: {integrity: sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==} + dependencies: + chownr: 1.1.4 + mkdirp: 0.5.5 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + /tar/6.1.11: resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} @@ -13288,6 +13744,16 @@ packages: tslib: 1.14.1 dev: false + /tsutils/3.21.0_typescript@4.0.8: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.0.8 + dev: false + /tsutils/3.21.0_typescript@4.3.5: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -13397,6 +13863,13 @@ packages: resolution: {integrity: sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=} dev: false + /unbzip2-stream/1.3.3: + resolution: {integrity: sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: false + /unicode-canonical-property-names-ecmascript/1.0.4: resolution: {integrity: sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==} engines: {node: '>=4'} @@ -14172,6 +14645,13 @@ packages: yargs-parser: 20.2.9 dev: false + /yauzl/2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + /yeast/0.1.2: resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=} dev: false @@ -14261,11 +14741,16 @@ packages: dev: false file:projects/chat-frontend.tgz: - resolution: {integrity: sha512-IhGSaxuL73KJNJAlvh2m7K0P2Pbw9orYskA/GzLUOS/k1wkeFlMRASsmvTtmXSEf+QGqE2g57Zdq5NeCOOtolg==, tarball: file:projects/chat-frontend.tgz} + resolution: {integrity: sha512-OYHfng6KaKmYLf7qk+4DtIe5ryQRg2wbLTG0NyLWBRpQYemWzvc8Qxj6u0NaxpJIWqbQrPwTsEXj5SZnqzAjow==, tarball: file:projects/chat-frontend.tgz} name: '@rush-temp/chat-frontend' version: 0.0.0 dependencies: '@angular-devkit/build-angular': 0.1102.14_6285bf834a438bf0d2d2a922b8ee4b27 + '@angular-eslint/builder': 4.3.0_a04cfb94d00ab321177c5e05ef63ba4a + '@angular-eslint/eslint-plugin': 4.3.0_8cc68e0533860fa85394503fb838aec1 + '@angular-eslint/eslint-plugin-template': 4.3.0_39fe200250ce323fa9ec9c488a50f82d + '@angular-eslint/schematics': 4.3.0_ee5f1abc1d59a7ed20175ac3008816f8 + '@angular-eslint/template-parser': 4.3.0_8cc68e0533860fa85394503fb838aec1 '@angular/animations': 11.2.14_@angular+core@11.2.14 '@angular/cdk': 11.2.13_fdd764655c71a68a8cf886ddd9a243b9 '@angular/cli': 11.2.14 @@ -14282,15 +14767,21 @@ packages: '@nebular/eva-icons': 7.0.0_fce40857be57853c6ee52ce868e4bca2 '@nebular/theme': 7.0.0_366e1deee14c799f0e7c0a230d57b62f '@schematics/angular': 8.0.6 + '@types/create-hash': 1.2.2 '@types/diffie-hellman': 5.0.0 '@types/jasmine': 3.6.11 '@types/jasminewd2': 2.0.10 '@types/lodash': 4.14.172 '@types/node': 12.20.21 + '@types/randombytes': 2.0.0 + '@typescript-eslint/eslint-plugin': 4.16.1_4886d4136145938ae6303fd642f6711b + '@typescript-eslint/parser': 4.16.1_eslint@7.32.0+typescript@4.0.8 bootstrap: 5.1.0 codelyzer: 6.0.2_tslint@6.1.3 + create-hash: 1.2.0 crypto-browserify: 3.12.0 diffie-hellman: 5.0.3 + eslint: 7.32.0 eva-icons: 1.1.3 jasmine-core: 3.6.0 jasmine-spec-reporter: 5.0.2 @@ -14302,6 +14793,9 @@ packages: lodash: 4.17.21 ngx-socket-io: 4.1.0_f492959a76b3b0e4754dd8b45ae9f4ef protractor: 7.0.0 + puppeteer: 10.4.0 + randombytes: 2.1.0 + readable-stream: 3.6.0 rxjs: 6.6.7 ts-node: 7.0.1 tslib: 2.3.1 diff --git a/docker-compose.yml b/docker-compose.yml index a30ac73..ee118c9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,8 @@ services: dockerfile: ./apps/chat-backend/Dockerfile ports: - '${BACKEND_PORT}:${BACKEND_PORT}' + environment: + - URL_SHORTNER_API_KEY=${URL_SHORTNER_API_KEY} # set via setup script restart: always depends_on: - 'redis' @@ -19,7 +21,3 @@ services: service: nginx-base depends_on: - chat-backend - url-shortner: - extends: - file: common-services.yml - service: url-shortner-base diff --git a/scripts/get-url-shortner-api-key.sh b/scripts/get-url-shortner-api-key.sh index b30dcde..be25b25 100644 --- a/scripts/get-url-shortner-api-key.sh +++ b/scripts/get-url-shortner-api-key.sh @@ -1,17 +1,16 @@ #!/bin/bash -API_KEY_OUTPUT=$(docker exec -it session-chat_url-shortner_1 shlink api-key:generate --no-ansi) +API_KEY_OUTPUT=$(docker exec -it session-chat_url-shortner shlink api-key:generate --no-ansi) +echo $API_KEY_OUTPUT OUTPUT_ARRAY=($API_KEY_OUTPUT) -OUTPUT_STATUS="${OUTPUT_ARRAY[0]}" +OUTPUT_STATUS="${OUTPUT_ARRAY[1]}" # First one is an empty string -if [ $OUTPUT_STATUS != "[OK]"]; then +if [ $OUTPUT_STATUS != "[OK]" ]; then exit 0 fi -IFS=':' -OUTPUT_SPLIT=($API_KEY_OUTPUT) -unset IFS +UNSANITIZED_API_KEY="${OUTPUT_ARRAY[5]}" # Api key with surrounding quoutes -API_KEY=$(echo "$OUTPUT_SPLIT" | tr -d '"') +CLEAN_API_KEY=$(sed -e 's/^"//' -e 's/"$//' <<<"$UNSANITIZED_API_KEY") -docker exec -it session-chat_chat-backend_1 URL_API_KEY="$API_KEY" +export URL_SHORTNER_API_KEY=$(echo "$CLEAN_API_KEY" | tr -d '"') diff --git a/scripts/url-shortner-docker-start.sh b/scripts/url-shortner-docker-start.sh new file mode 100644 index 0000000..65be129 --- /dev/null +++ b/scripts/url-shortner-docker-start.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +export $(grep -v '^#' .env | xargs) + +docker run -d \ + --name session-chat_url-shortner \ + -p 8080:8080 \ + -e SHORT_DOMAIN_HOST=$SHORT_DOMAIN_HOST \ + -e SHORT_DOMAIN_SCHEMA=$SHORT_DOMAIN_SCHEMA \ + -e GEOLITE_LICENSE_KEY=$GEOLITE_LICENSE_KEY \ + shlinkio/shlink:stable + +sh ./scripts/get-url-shortner-api-key.sh + +docker compose up -d From 9107886dc37dae6e0119421a60960c868b50c6c0 Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Fri, 1 Oct 2021 16:18:27 -0400 Subject: [PATCH 3/8] fixed up scripts, added comments --- Readme.md | 11 +++++++++++ scripts/get-url-shortner-api-key.sh | 11 +++++------ scripts/shutdown-docker.sh | 5 +++++ scripts/url-shortner-docker-start.sh | 4 ++++ 4 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 scripts/shutdown-docker.sh diff --git a/Readme.md b/Readme.md index a326037..dcd88ce 100644 --- a/Readme.md +++ b/Readme.md @@ -26,8 +26,19 @@ mkdir ./keys && cd ./keys ```bash # starts dev env rush docker-up:dev +# or +sh ./scripts/url-shortner-docker-start.sh # start UI project separately cd ./apps/chat-frontend/ && rushx start:dev ``` +Custom Docker command scripts + +```bash +# will startup all containers with the required data +sh ./scripts/url-shortner-docker-start.sh +# will shutdown all of the containers for dev +sh ./scripts/shutdown-docker.sh +``` + Url Shortner docs: https://shlink.io/documentation/ diff --git a/scripts/get-url-shortner-api-key.sh b/scripts/get-url-shortner-api-key.sh index be25b25..d12a07b 100644 --- a/scripts/get-url-shortner-api-key.sh +++ b/scripts/get-url-shortner-api-key.sh @@ -1,16 +1,15 @@ #!/bin/bash - +# creates api key inside container pipe to var API_KEY_OUTPUT=$(docker exec -it session-chat_url-shortner shlink api-key:generate --no-ansi) -echo $API_KEY_OUTPUT OUTPUT_ARRAY=($API_KEY_OUTPUT) OUTPUT_STATUS="${OUTPUT_ARRAY[1]}" # First one is an empty string - +# checks the status of the api key return if [ $OUTPUT_STATUS != "[OK]" ]; then exit 0 fi UNSANITIZED_API_KEY="${OUTPUT_ARRAY[5]}" # Api key with surrounding quoutes - +# removes the surrounding " from the api key CLEAN_API_KEY=$(sed -e 's/^"//' -e 's/"$//' <<<"$UNSANITIZED_API_KEY") - -export URL_SHORTNER_API_KEY=$(echo "$CLEAN_API_KEY" | tr -d '"') +# adds the new key to env variables +export URL_SHORTNER_API_KEY="$CLEAN_API_KEY" diff --git a/scripts/shutdown-docker.sh b/scripts/shutdown-docker.sh new file mode 100644 index 0000000..503b06e --- /dev/null +++ b/scripts/shutdown-docker.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +docker stop session-chat_url-shortner + +docker compose down diff --git a/scripts/url-shortner-docker-start.sh b/scripts/url-shortner-docker-start.sh index 65be129..7b1e1b1 100644 --- a/scripts/url-shortner-docker-start.sh +++ b/scripts/url-shortner-docker-start.sh @@ -1,7 +1,9 @@ #!/bin/bash +# loads all of the vars in the .env file in base dir export $(grep -v '^#' .env | xargs) +# starts the url shortner service docker run -d \ --name session-chat_url-shortner \ -p 8080:8080 \ @@ -10,6 +12,8 @@ docker run -d \ -e GEOLITE_LICENSE_KEY=$GEOLITE_LICENSE_KEY \ shlinkio/shlink:stable +# script used to create and extract api access key from url shortner service sh ./scripts/get-url-shortner-api-key.sh +# starts the remaining docker services docker compose up -d From f5afdfec63d4383f400e29285a9eaa932197cf00 Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Fri, 1 Oct 2021 17:12:21 -0400 Subject: [PATCH 4/8] fixed build scripts --- common-services.yml | 8 -------- docker-compose.yml | 2 +- scripts/get-url-shortner-api-key.sh | 2 ++ scripts/url-shortner-docker-start.sh | 6 +++++- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/common-services.yml b/common-services.yml index 0157670..f495f62 100644 --- a/common-services.yml +++ b/common-services.yml @@ -14,11 +14,3 @@ services: ports: - '${REDIS_PORT}:${REDIS_PORT}' restart: always - url-shortner-base: - image: shlinkio/shlink:stable - ports: - - '${SHORT_DOMAIN_PORT}:${SHORT_DOMAIN_PORT}' - environment: - - SHORT_DOMAIN_HOST=${SHORT_DOMAIN_HOST} - - SHORT_DOMAIN_SCHEMA=${SHORT_DOMAIN_SCHEMA} - - GEOLITE_LICENSE_KEY=${GEOLITE_LICENSE_KEY} diff --git a/docker-compose.yml b/docker-compose.yml index ee118c9..1b6af98 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: context: ./ dockerfile: ./apps/chat-backend/Dockerfile ports: - - '${BACKEND_PORT}:${BACKEND_PORT}' + - '3001:3001' # when you run from scripts with env ar it does not work environment: - URL_SHORTNER_API_KEY=${URL_SHORTNER_API_KEY} # set via setup script restart: always diff --git a/scripts/get-url-shortner-api-key.sh b/scripts/get-url-shortner-api-key.sh index d12a07b..8af9732 100644 --- a/scripts/get-url-shortner-api-key.sh +++ b/scripts/get-url-shortner-api-key.sh @@ -3,6 +3,7 @@ API_KEY_OUTPUT=$(docker exec -it session-chat_url-shortner shlink api-key:generate --no-ansi) OUTPUT_ARRAY=($API_KEY_OUTPUT) OUTPUT_STATUS="${OUTPUT_ARRAY[1]}" # First one is an empty string +echo "Status: $OUTPUT_STATUS" # checks the status of the api key return if [ $OUTPUT_STATUS != "[OK]" ]; then exit 0 @@ -11,5 +12,6 @@ fi UNSANITIZED_API_KEY="${OUTPUT_ARRAY[5]}" # Api key with surrounding quoutes # removes the surrounding " from the api key CLEAN_API_KEY=$(sed -e 's/^"//' -e 's/"$//' <<<"$UNSANITIZED_API_KEY") +echo "API Key: $CLEAN_API_KEY" # adds the new key to env variables export URL_SHORTNER_API_KEY="$CLEAN_API_KEY" diff --git a/scripts/url-shortner-docker-start.sh b/scripts/url-shortner-docker-start.sh index 7b1e1b1..ee710f3 100644 --- a/scripts/url-shortner-docker-start.sh +++ b/scripts/url-shortner-docker-start.sh @@ -12,8 +12,12 @@ docker run -d \ -e GEOLITE_LICENSE_KEY=$GEOLITE_LICENSE_KEY \ shlinkio/shlink:stable +sleep 10s + # script used to create and extract api access key from url shortner service -sh ./scripts/get-url-shortner-api-key.sh +source ./scripts/get-url-shortner-api-key.sh + +echo "ENV Var: $URL_SHORTNER_API_KEY" # starts the remaining docker services docker compose up -d From 91af843694c3a707a2e6a5de9eb12ab53165dc1c Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Fri, 1 Oct 2021 17:15:26 -0400 Subject: [PATCH 5/8] added a rm for the url container to shutdown --- scripts/shutdown-docker.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/shutdown-docker.sh b/scripts/shutdown-docker.sh index 503b06e..053a9dd 100644 --- a/scripts/shutdown-docker.sh +++ b/scripts/shutdown-docker.sh @@ -2,4 +2,6 @@ docker stop session-chat_url-shortner +docker rm session-chat_url-shortner + docker compose down From 436279573fa3a287d3b75aead46d6f13a102af77 Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Fri, 1 Oct 2021 23:56:13 -0400 Subject: [PATCH 6/8] added url shortner message and service --- apps/chat-backend/src/app.module.ts | 3 +- apps/chat-backend/src/chat/chat.gateway.ts | 45 +++++++++++++++++-- .../src/chat/models/chat-events.ts | 7 +++ .../src/chat/models/chatroom-payload.model.ts | 3 ++ .../src/chat/models/user-url-payload.model.ts | 4 ++ apps/chat-backend/src/main.ts | 2 +- .../redis-io-adapter.ts} | 3 +- .../redis-service.service.spec.ts | 18 ++++++++ .../redis-service/redis-service.service.ts | 32 +++++++++++++ .../url-shortner/url-shortner.service.spec.ts | 21 +++++++++ .../url-shortner/url-shortner.service.ts | 39 ++++++++++------ 11 files changed, 156 insertions(+), 21 deletions(-) create mode 100644 apps/chat-backend/src/chat/models/chat-events.ts create mode 100644 apps/chat-backend/src/chat/models/chatroom-payload.model.ts create mode 100644 apps/chat-backend/src/chat/models/user-url-payload.model.ts rename apps/chat-backend/src/{chat/RedisIoAdapter.ts => redis/redis-io-adapter.ts} (79%) create mode 100644 apps/chat-backend/src/services/redis-service/redis-service.service.spec.ts create mode 100644 apps/chat-backend/src/services/redis-service/redis-service.service.ts diff --git a/apps/chat-backend/src/app.module.ts b/apps/chat-backend/src/app.module.ts index 41e5fb2..98c9d28 100644 --- a/apps/chat-backend/src/app.module.ts +++ b/apps/chat-backend/src/app.module.ts @@ -6,9 +6,10 @@ import { AlertController } from './alert/alert.controller'; import { JwtTokenService } from './services/jwt-token/jwt-token.service'; import { UrlShortnerService } from './services/url-shortner/url-shortner.service'; import { HttpModule } from '@nestjs/axios'; +import { RedisService } from './services/redis-service/redis-service.service'; @Module({ imports: [ConfigModule.forRoot(), HttpModule], controllers: [AlertController], - providers: [ChatGateway, AlertGateway, JwtTokenService, UrlShortnerService] + providers: [ChatGateway, AlertGateway, JwtTokenService, UrlShortnerService, RedisService] }) export class AppModule {} diff --git a/apps/chat-backend/src/chat/chat.gateway.ts b/apps/chat-backend/src/chat/chat.gateway.ts index 9087dbb..d47c460 100644 --- a/apps/chat-backend/src/chat/chat.gateway.ts +++ b/apps/chat-backend/src/chat/chat.gateway.ts @@ -4,6 +4,11 @@ import { Socket, Server } from 'socket.io'; import { Logger } from '@nestjs/common'; import { AuthFormat, MessageFormat } from 'src/shared/types'; import { JwtTokenService, TokenInput } from 'src/services/jwt-token/jwt-token.service'; +import { UrlShortnerService } from 'src/services/url-shortner/url-shortner.service'; +import { CreateChatRoomPayload } from './models/chatroom-payload.model'; +import { CreateUserUrlPayload } from './models/user-url-payload.model'; +import { RedisService } from 'src/services/redis-service/redis-service.service'; +import { ChatEvents } from './models/chat-events'; @WebSocketGateway(3001, { cors: true, @@ -14,13 +19,45 @@ export class ChatGateway implements OnGatewayInit { @WebSocketServer() wss: Server; private logger: Logger = new Logger('ChatGateway'); - constructor(private jwtTokenService: JwtTokenService) {} + constructor( + private jwtTokenService: JwtTokenService, + private urlShortnerService: UrlShortnerService, + private redisService: RedisService + ) {} afterInit(): void { this.logger.log('Initialized Gateway'); } - @SubscribeMessage('login') + @SubscribeMessage(ChatEvents.createChatRoom) + async createChatRoom(client: Socket, message: CreateChatRoomPayload): Promise { + // TODO need to add this to redis through a new connection, will need to remove on chatRoomDestroy or some event + try { + this.logger.log('Creating chatroom', { + roomId: message.roomId + }); + await this.redisService.set(message.roomId, 'true'); + } catch (err) { + this.logger.error(err); + // TODO send error notification + } + } + + @SubscribeMessage(ChatEvents.createUserUrl) + async createUserUrl(client: Socket, message: CreateUserUrlPayload): Promise { + try { + this.logger.log('Creating short url for user', { + roomId: message.roomId + }); + const shortenedUrl = await this.urlShortnerService.createShortUrl(message.url); + client.emit('createUserUrl', shortenedUrl); + } catch (err) { + // TODO this should emit an error notification at the very least + this.logger.error(err); + } + } + + @SubscribeMessage(ChatEvents.login) async handleLogin(client: Socket, message: AuthFormat): Promise { try { this.logger.verbose('Recieved Login attempt from client', { @@ -42,7 +79,7 @@ export class ChatGateway implements OnGatewayInit { } } - @SubscribeMessage('logout') + @SubscribeMessage(ChatEvents.logout) async handleLogout(client: Socket, message: AuthFormat): Promise { try { this.logger.verbose('Recieved Logout attempt from client', { @@ -59,7 +96,7 @@ export class ChatGateway implements OnGatewayInit { } } - @SubscribeMessage('chatToServer') + @SubscribeMessage(ChatEvents.chatToServer) async handleMessage(client: Socket, message: MessageFormat): Promise { try { this.logger.verbose('Recieved Message from client', { diff --git a/apps/chat-backend/src/chat/models/chat-events.ts b/apps/chat-backend/src/chat/models/chat-events.ts new file mode 100644 index 0000000..d131fe8 --- /dev/null +++ b/apps/chat-backend/src/chat/models/chat-events.ts @@ -0,0 +1,7 @@ +export enum ChatEvents { + createChatRoom = 'createChatRoom', + createUserUrl = 'createUserUrl', + login = 'login', + logout = 'logout', + chatToServer = 'chatToServer' +} diff --git a/apps/chat-backend/src/chat/models/chatroom-payload.model.ts b/apps/chat-backend/src/chat/models/chatroom-payload.model.ts new file mode 100644 index 0000000..f9a733b --- /dev/null +++ b/apps/chat-backend/src/chat/models/chatroom-payload.model.ts @@ -0,0 +1,3 @@ +export interface CreateChatRoomPayload { + roomId: string; +} diff --git a/apps/chat-backend/src/chat/models/user-url-payload.model.ts b/apps/chat-backend/src/chat/models/user-url-payload.model.ts new file mode 100644 index 0000000..769e1b7 --- /dev/null +++ b/apps/chat-backend/src/chat/models/user-url-payload.model.ts @@ -0,0 +1,4 @@ +export interface CreateUserUrlPayload { + url: string; + roomId: string; +} diff --git a/apps/chat-backend/src/main.ts b/apps/chat-backend/src/main.ts index 65f9cdd..cb9228b 100644 --- a/apps/chat-backend/src/main.ts +++ b/apps/chat-backend/src/main.ts @@ -1,7 +1,7 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { NestExpressApplication } from '@nestjs/platform-express'; -import { RedisIoAdapter } from './chat/RedisIoAdapter'; +import { RedisIoAdapter } from './redis/redis-io-adapter'; async function bootstrap() { const app = await NestFactory.create(AppModule); diff --git a/apps/chat-backend/src/chat/RedisIoAdapter.ts b/apps/chat-backend/src/redis/redis-io-adapter.ts similarity index 79% rename from apps/chat-backend/src/chat/RedisIoAdapter.ts rename to apps/chat-backend/src/redis/redis-io-adapter.ts index f945e34..516c615 100644 --- a/apps/chat-backend/src/chat/RedisIoAdapter.ts +++ b/apps/chat-backend/src/redis/redis-io-adapter.ts @@ -3,7 +3,8 @@ import { RedisClient } from 'redis'; import { ServerOptions } from 'socket.io'; import { createAdapter } from 'socket.io-redis'; -const pubClient = new RedisClient({ host: 'redis', port: 6379 }); +const REDIS_PORT = Number(process.env.REDIS_PORT || 6379); +const pubClient = new RedisClient({ host: 'redis', port: REDIS_PORT }); const subClient = pubClient.duplicate(); const redisAdapter = createAdapter({ pubClient, subClient }); diff --git a/apps/chat-backend/src/services/redis-service/redis-service.service.spec.ts b/apps/chat-backend/src/services/redis-service/redis-service.service.spec.ts new file mode 100644 index 0000000..35d852e --- /dev/null +++ b/apps/chat-backend/src/services/redis-service/redis-service.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RedisService } from './redis-service.service'; + +describe('RedisServiceService', () => { + let service: RedisService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [RedisService] + }).compile(); + + service = module.get(RedisService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/chat-backend/src/services/redis-service/redis-service.service.ts b/apps/chat-backend/src/services/redis-service/redis-service.service.ts new file mode 100644 index 0000000..537b8fb --- /dev/null +++ b/apps/chat-backend/src/services/redis-service/redis-service.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@nestjs/common'; +import { RedisClient } from 'redis'; +import { promisify } from 'util'; + +@Injectable() +export class RedisService { + private client: RedisClient; + + constructor() { + const REDIS_PORT = Number(process.env.REDIS_PORT || 6379); + this.client = new RedisClient({ host: 'redis', port: REDIS_PORT }); + } + + get(key: string): Promise { + return promisify(this.client.get)(key); + } + + set(key: string, value: string): void { + promisify(this.client.set)(key, value); + } + + delete(key: string): Promise { + return new Promise((resolve, reject) => { + return this.client.del(key, (err) => { + if (err) { + return reject(err); + } + return resolve(); + }); + }); + } +} diff --git a/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts index f6868ea..510aa6f 100644 --- a/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts @@ -1,15 +1,36 @@ +import { HttpService } from '@nestjs/axios'; +import { AxiosResponse } from 'axios'; import { Test, TestingModule } from '@nestjs/testing'; +import { of } from 'rxjs'; import { UrlShortnerService } from './url-shortner.service'; +// TODO need to learn how to write tests and why its getting dep injection issue describe('UrlShortnerService', () => { let service: UrlShortnerService; + let httpService: HttpService; beforeEach(async () => { + const data = { + shortCode: 'short', + shortUrl: 'short', + longUrl: 'long', + dateCreated: new Date().toISOString() + }; + const response: AxiosResponse = { + data, + headers: {}, + config: { url: 'http://localhost:3000/mockUrl' }, + status: 200, + statusText: 'OK' + }; + const httpSpy = jest.spyOn(HttpService.prototype, 'get').mockReturnValue(of(response)); const module: TestingModule = await Test.createTestingModule({ providers: [UrlShortnerService], + imports: [HttpService] }).compile(); service = module.get(UrlShortnerService); + httpService = module.get(HttpService); }); it('should be defined', () => { diff --git a/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts index afdf903..a3d4ea4 100644 --- a/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts @@ -1,7 +1,6 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { HttpService } from '@nestjs/axios'; -import { AxiosResponse } from 'axios'; -import { Observable } from 'rxjs'; +import { firstValueFrom } from 'rxjs'; export interface UrlShortnerResponse { shortCode: string; @@ -13,21 +12,33 @@ export interface UrlShortnerResponse { @Injectable() export class UrlShortnerService { private baseUrl: string; + private logger: Logger = new Logger('Url-Shortner-Service'); constructor(private httpService: HttpService) { this.baseUrl = `${process.env.SHORT_DOMAIN_SCHEMA}://${process.env.SHORT_DOMAIN_HOST}`; } - createShortUrl(url: string): Observable> { - return this.httpService.post( - `${this.baseUrl}/rest/v2/short-urls`, - { - longUrl: url - }, - { - headers: { - 'X-Api-Key': `{${process.env.URL_API_KEY}}` - } + async createShortUrl(url: string): Promise { + try { + const resp = await firstValueFrom( + this.httpService.post( + `${this.baseUrl}/rest/v2/short-urls`, + { + longUrl: url + }, + { + headers: { + 'X-Api-Key': `{${process.env.URL_SHORTNER_API_KEY}}` + } + } + ) + ); + if (resp.status !== 200) { + throw Error('Failed response'); } - ); + return resp.data; + } catch (err) { + this.logger.error(err); + throw err; + } } } From 87baee224f852ce00148320df46bce9c641e31be Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Sat, 2 Oct 2021 11:15:52 -0400 Subject: [PATCH 7/8] fixed url shortner tests --- .../url-shortner/url-shortner.service.spec.ts | 57 ++++++++++++------- .../url-shortner/url-shortner.service.ts | 2 +- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts index 510aa6f..b053ab9 100644 --- a/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts @@ -1,39 +1,56 @@ -import { HttpService } from '@nestjs/axios'; +import { HttpModule, HttpService } from '@nestjs/axios'; import { AxiosResponse } from 'axios'; import { Test, TestingModule } from '@nestjs/testing'; import { of } from 'rxjs'; -import { UrlShortnerService } from './url-shortner.service'; +import { UrlShortnerResponse, UrlShortnerService } from './url-shortner.service'; -// TODO need to learn how to write tests and why its getting dep injection issue describe('UrlShortnerService', () => { let service: UrlShortnerService; - let httpService: HttpService; + let httpPostSpy: jest.SpyInstance; + const data = { + shortCode: 'short', + shortUrl: 'short', + longUrl: 'long', + dateCreated: new Date().toISOString() + } as UrlShortnerResponse; + const response: AxiosResponse = { + data, + headers: {}, + config: { url: 'http://localhost:3000/mockUrl' }, + status: 200, + statusText: 'OK' + }; beforeEach(async () => { - const data = { - shortCode: 'short', - shortUrl: 'short', - longUrl: 'long', - dateCreated: new Date().toISOString() - }; - const response: AxiosResponse = { - data, - headers: {}, - config: { url: 'http://localhost:3000/mockUrl' }, - status: 200, - statusText: 'OK' - }; - const httpSpy = jest.spyOn(HttpService.prototype, 'get').mockReturnValue(of(response)); + httpPostSpy = jest.spyOn(HttpService.prototype, 'post').mockImplementation(() => of(response)); const module: TestingModule = await Test.createTestingModule({ providers: [UrlShortnerService], - imports: [HttpService] + imports: [HttpModule] }).compile(); service = module.get(UrlShortnerService); - httpService = module.get(HttpService); }); it('should be defined', () => { expect(service).toBeDefined(); }); + + it('should go through happy path and return response', async () => { + const resp = await service.createShortUrl('test/url'); + expect(resp).toEqual(data); + }); + + it('should throw if return status is not 200', async () => { + httpPostSpy.mockImplementation(() => + of({ + ...response, + status: 403 + }) + ); + expect(service.createShortUrl('test/url')).rejects.toMatch('Failed response status'); + }); + it('should reject if http call returns error', async () => { + httpPostSpy.mockRejectedValue('Err'); + expect(service.createShortUrl('test/url')).rejects.toMatch('Err'); + }); }); diff --git a/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts index a3d4ea4..17dd2fb 100644 --- a/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts @@ -33,7 +33,7 @@ export class UrlShortnerService { ) ); if (resp.status !== 200) { - throw Error('Failed response'); + throw Error('Failed response status'); } return resp.data; } catch (err) { From be26517f2b0b6383ea35365af2f6388efce67003 Mon Sep 17 00:00:00 2001 From: Dylan Steele Date: Sat, 2 Oct 2021 11:18:46 -0400 Subject: [PATCH 8/8] round trip on create chat room --- apps/chat-backend/src/chat/chat.gateway.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/chat-backend/src/chat/chat.gateway.ts b/apps/chat-backend/src/chat/chat.gateway.ts index d47c460..783aec0 100644 --- a/apps/chat-backend/src/chat/chat.gateway.ts +++ b/apps/chat-backend/src/chat/chat.gateway.ts @@ -37,6 +37,9 @@ export class ChatGateway implements OnGatewayInit { roomId: message.roomId }); await this.redisService.set(message.roomId, 'true'); + client.emit(ChatEvents.createChatRoom, { + roomId: message.roomId + }); } catch (err) { this.logger.error(err); // TODO send error notification