Submódulo responsável por padronizar envio de notificações de serviços para o CRM Dispatcher.
-
Na pasta raíz do serviço que deseja incluir esse submódulo, crie um diretório (se não existente) chamado libraries:
mkdir libraries
-
Dentro da pasta libraries , adicione esse repositório como submódulo:
cd libraries git submodule add git@github.com:squidit/crm-client.git
Isso faz com que o commit de sua aplicação em NodeJS seja vinculado ao hash do commit da biblioteca. Ou seja, o código fonte da biblioteca não será commitado junto com a sua aplicação, mas apenas "linkado" ao commit dela em seu próprio repositório.
-
Retorne ao diretório raiz do projeto, e inicialize todos os submódulos e suas dependências com o comando:
cd .. git submodule update --init --recursive
Tal comando é o responsável por baixar todos os códigos fontes das bibliotecas e suas dependências.
-
Vincule o submódulo do git ao package.json:
- npm
npm install --save file:libraries/crm-client
- pnpm
pnpm add file:libraries/crm-client
Dessa forma, os as bibliotecas locais são incluidas como dependências no gerenciador de pacotes (npm, yarn, pnpm etc). Isso permite que, no código, você possa fazer uso das bibliotecas através de um require { SquidError, SquidLogger } from 'squid-observability' sem se preocupar com o diretório onde essas bibliotecas estão instaladas. Além disso, o gerenciador de pacotes garante que, caso as bibliotecas instaladas via submódulos tenham dependências em comum com sua aplicação, somente uma cópia do código fonte dessas bibliotecas será vinculada a ela, consequentemente reduzindo o tamanho final da aplicação.
Outra vantagem de vincular o submódulo com o package.json é transferir a responsabilidade de instalar as dependencias dos submódulos ao package manager. Ou seja, se uma biblioteca em submódulo fizer uso da lodash, o npm ou yarn da aplicação pai é quem irá instalar essa dependência ao rodarmos npm install. - npm
Por padrão, o client do CRM procurará uma variável de ambiente de nome CRM_NOTIFICATION_TOPIC
para utilizar como tópico do PubSub.
É possível utilizar outro tópico, passando o nome do tópico como parâmetro na inicialização do client.
É obrigatório que ou a variável de ambiente padrão ou um nome personalizado sejam definidos.
-
Na inicialização da sua aplicação, inclua o client do CRM e inicialize-o com as variáveis de ambiente:
const { CrmClient } = require('crm-client') ... CrmClient.init( GCE_CLUSTER_PROJECT, // variável de ambiente contendo o nome do projeto do GCP GCE_AUTH_JSON_FILENAME, // variável de ambiente contendo o nome do arquivo de credenciais SquidLogger, // Instância do SquidLogger SquidError, // Instância do SquidError // TOPIC_NAME, // OPCIONAL: Nome do tópico do PubSub. Padrão: CRM_NOTIFICATION_TOPIC )
-
Para enviar uma notificação, obtenha a instância do client com o método
getInstance
e chame o métodosendNotification
:await CrmClient .getInstance() .sendNotification()
-
Na inicialização da sua aplicação, inclua o client do CRM e inclua o client do CRM e inicialize-o com as variáveis de ambiente:
import { CrmClient } from 'crm-client' ... CrmClient.init( GCE_CLUSTER_PROJECT, // variável de ambiente contendo o nome do projeto do GCP GCE_AUTH_JSON_FILENAME, // variável de ambiente contendo o nome do arquivo de credenciais SquidLogger, // Instância do SquidLogger SquidError, // Instância do SquidError // TOPIC_NAME, // OPCIONAL: Nome do tópico do PubSub. Padrão: CRM_NOTIFICATION_TOPIC )
-
Após a inicialização, registre a instância no container de injeção de dependência:
container.register('CrmClient', { useValue: CrmClient.getInstance() })
-
Para enviar uma notificação, obtenha o client do container e utilize a instância obtida:
constructor( @inject('CrmClient') private readonly crmClient: CrmClient ) {} ... await this.crmClient.sendNotification()
-
Crie um novo módulo para o client do CRM.
Utilize uma factory para poder injetar o configService e obter as variáveis de ambiente na inicialização do client.
Entregue o valor da instância como resultado da factory:@Global() @Module({ providers: [{ provide: 'CrmClient', useFactory: (configService: ConfigService<EnvironmentVariables>) => { CrmClient.init( configService.getOrThrow('GCE_CLUSTER_PROJECT', { infer: true }), configService.getOrThrow('GCE_AUTH_JSON_FILENAME', { infer: true }), SquidLogger, SquidError ) return CrmClient.getInstance() }, inject: [ConfigService] } ], exports: ['CrmClient'] }) export class CrmModule {}
-
Para enviar uma notificação, obtenha o client do container e utilize a instância obtida:
constructor( @Inject('CrmClient') private readonly crmClient: CrmClient ) {} ... await this.crmClient.sendNotification()