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 9b866fc..dcd88ce 100644 --- a/Readme.md +++ b/Readme.md @@ -26,6 +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/apps/chat-backend/package.json b/apps/chat-backend/package.json index 40d7c1b..543e224 100644 --- a/apps/chat-backend/package.json +++ b/apps/chat-backend/package.json @@ -40,7 +40,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", diff --git a/apps/chat-backend/src/app.module.ts b/apps/chat-backend/src/app.module.ts index f5fbebe..98c9d28 100644 --- a/apps/chat-backend/src/app.module.ts +++ b/apps/chat-backend/src/app.module.ts @@ -4,10 +4,12 @@ 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'; +import { RedisService } from './services/redis-service/redis-service.service'; @Module({ - imports: [ConfigModule.forRoot()], + imports: [ConfigModule.forRoot(), HttpModule], controllers: [AlertController], - providers: [ChatGateway, AlertGateway, JwtTokenService] + 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..783aec0 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,48 @@ 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'); + client.emit(ChatEvents.createChatRoom, { + roomId: message.roomId + }); + } 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 +82,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 +99,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 new file mode 100644 index 0000000..b053ab9 --- /dev/null +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.spec.ts @@ -0,0 +1,56 @@ +import { HttpModule, HttpService } from '@nestjs/axios'; +import { AxiosResponse } from 'axios'; +import { Test, TestingModule } from '@nestjs/testing'; +import { of } from 'rxjs'; +import { UrlShortnerResponse, UrlShortnerService } from './url-shortner.service'; + +describe('UrlShortnerService', () => { + let service: UrlShortnerService; + 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 () => { + httpPostSpy = jest.spyOn(HttpService.prototype, 'post').mockImplementation(() => of(response)); + const module: TestingModule = await Test.createTestingModule({ + providers: [UrlShortnerService], + imports: [HttpModule] + }).compile(); + + service = module.get(UrlShortnerService); + }); + + 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 new file mode 100644 index 0000000..17dd2fb --- /dev/null +++ b/apps/chat-backend/src/services/url-shortner/url-shortner.service.ts @@ -0,0 +1,44 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { HttpService } from '@nestjs/axios'; +import { firstValueFrom } from 'rxjs'; + +export interface UrlShortnerResponse { + shortCode: string; + shortUrl: string; + longUrl: string; + dateCreated: string; +} + +@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}`; + } + + 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 status'); + } + return resp.data; + } catch (err) { + this.logger.error(err); + throw err; + } + } +} diff --git a/common-services.yml b/common-services.yml index 4cc709d..f495f62 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: diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 96f6dcd..37ec51c 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -22,6 +22,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 @@ -46,6 +47,7 @@ specifiers: '@types/randombytes': ~2.0.0 '@types/redis': ~2.8.31 '@types/supertest': ^2.0.11 + axios: ~0.21.4 bootstrap: ~5.1.0 create-hash: ~1.2.0 crypto-browserify: ~3.12.0 @@ -66,12 +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 @@ -93,28 +95,29 @@ dependencies: '@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 + '@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 - '@rush-temp/chat-backend': file:projects/chat-backend.tgz_rxjs@6.6.7 + '@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 @@ -129,6 +132,7 @@ dependencies: '@types/randombytes': 2.0.0 '@types/redis': 2.8.31 '@types/supertest': 2.0.11 + axios: 0.21.4 bootstrap: 5.1.0 create-hash: 1.2.0 crypto-browserify: 3.12.0 @@ -145,16 +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 @@ -684,7 +688,7 @@ packages: 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 @@ -694,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 @@ -733,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: @@ -826,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: @@ -838,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: @@ -865,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 @@ -883,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 @@ -908,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 @@ -2460,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 @@ -2485,6 +2537,55 @@ packages: tslib: 2.3.1 dev: false + /@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_reflect-metadata@0.1.13 + axios: 0.21.4 + reflect-metadata: 0.1.13 + 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'} @@ -2516,7 +2617,33 @@ packages: - webpack-cli dev: false - /@nestjs/common/8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc: + /@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_reflect-metadata@0.1.13: resolution: {integrity: sha512-mSD000iYJDN2wjL2hbygCVNVvzvi3VW5EDc25gK1Bj3wUU2HR8m1qOAUBqcCaGIuvBb2cD/pnVkKklnsY0rKhw==} peerDependencies: cache-manager: '*' @@ -2535,32 +2662,48 @@ 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 - /@nestjs/core/8.0.6_2ecfd39b89d7693a33c80114858b8d42: + /@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: @@ -2578,16 +2721,47 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 8.0.6_8e6d4b7501d9d25f42cbf34563d4f5bc + '@nestjs/common': 8.0.6_486826780eeff986d3746a62b5df4b6b '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea - '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 + '@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_bc52f06b1e1f74cc8ee5457f032df2b2: + 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_reflect-metadata@0.1.13 + '@nestjs/platform-express': 8.0.6_67f7e5db8827badcb202b1d38f6b1aea + '@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 @@ -2598,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 @@ -2607,16 +2781,33 @@ packages: tslib: 2.3.0 dev: false - /@nestjs/platform-socket.io/8.0.6_8860b0a72a5477011bab3476adc49ae3: + /@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_8e6d4b7501d9d25f42cbf34563d4f5bc - '@nestjs/websockets': 8.0.6_4f480b5f7c61a959bccfea99ccb3aa50 - rxjs: 6.6.7 + '@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: + - bufferutil + - supports-color + - utf-8-validate + 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: @@ -2664,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 @@ -2682,13 +2873,34 @@ 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 + + /@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 @@ -4279,6 +4491,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: @@ -9815,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 @@ -11853,6 +12094,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 @@ -14428,21 +14675,21 @@ packages: resolution: {integrity: sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==} dev: false - file:projects/chat-backend.tgz_rxjs@6.6.7: - resolution: {integrity: sha512-XqFhVlh7Siky/K543Zc5lwhZsrN3+Kcfted2QlZCsq7pn+wWGqbSBGvuALkozZwoNpWdOzDfvPubqNAvUEzGzQ==, 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 @@ -14453,6 +14700,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 @@ -14463,6 +14711,7 @@ packages: redis: 3.1.2 reflect-metadata: 0.1.13 rimraf: 3.0.2 + rxjs: 7.3.0 socket.io: 4.1.3 socket.io-redis: 6.1.1 supertest: 6.1.6 @@ -14485,7 +14734,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..1b6af98 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,10 @@ 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 depends_on: - 'redis' redis: diff --git a/scripts/get-url-shortner-api-key.sh b/scripts/get-url-shortner-api-key.sh new file mode 100644 index 0000000..8af9732 --- /dev/null +++ b/scripts/get-url-shortner-api-key.sh @@ -0,0 +1,17 @@ +#!/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) +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 +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/shutdown-docker.sh b/scripts/shutdown-docker.sh new file mode 100644 index 0000000..053a9dd --- /dev/null +++ b/scripts/shutdown-docker.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +docker stop session-chat_url-shortner + +docker rm session-chat_url-shortner + +docker compose down diff --git a/scripts/url-shortner-docker-start.sh b/scripts/url-shortner-docker-start.sh new file mode 100644 index 0000000..ee710f3 --- /dev/null +++ b/scripts/url-shortner-docker-start.sh @@ -0,0 +1,23 @@ +#!/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 \ + -e SHORT_DOMAIN_HOST=$SHORT_DOMAIN_HOST \ + -e SHORT_DOMAIN_SCHEMA=$SHORT_DOMAIN_SCHEMA \ + -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 +source ./scripts/get-url-shortner-api-key.sh + +echo "ENV Var: $URL_SHORTNER_API_KEY" + +# starts the remaining docker services +docker compose up -d