Nest Logo

A progressive Node.js framework for building efficient and scalable server-side applications.

NPM Version Package License NPM Downloads CircleCI Coverage Discord Backers on Open Collective Sponsors on Open Collective Support us

Description

Nest framework TypeScript starter repository.

Installation

Example :
$ npm install

Running the app

Example :
# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod

Test

Example :
# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

Log do sync diário

Implementa o card 45501: saber se cada etapa do sync está iniciando e finalizando, por etapa, unidade e controladora.

O sync roda por cron (UTC_SYNC_CRON, padrão 0 0 5 * * *) em TasksController.syncAccessControl e executa seis etapas sequenciais, nesta ordem:

Etapa Valor de stage
Sanitize dos grupos de controladoras SANITIZE-ALL_DEVICE_GROUPS
Alunos CRM-STUDENTS-ALL_UNITS
Responsáveis CRM-RESPONSIBLES-ALL_UNITS
ClickUp CLICKUP-ALL_UNITS
Colaboradores RM-ALL_UNITS
Visitantes CRM-VISITS-ALL_UNITS

Os nomes ficam em syncStageNames (src/config.ts). Alterá-los quebra os relatórios que filtram por eles.

O log em blob que já existia continua sendo gravado, com o mesmo conteúdo de sempre, um por etapa. A novidade é o registro em SQL.

Tabela gdn.tb_sync_log

A tabela é criada e versionada pelas migrations do seb-guardian-api (EF Core), em src/SEB.Guardian.Infra.Data/Migrations/*_AddTableSyncLog — mesma convenção das outras tabelas do schema gdn. Esta aplicação não roda DDL: precisa apenas de SELECT, INSERT e UPDATE.

Se a tabela não existir, a aplicação registra run the seb-guardian-api migrations (AddTableSyncLog) on this database e o sync segue sem gravar o log. Sem GDN_DATABASE_CONNECTION_STRING o log em SQL fica desligado, também sem afetar o sync.

Configuração: uma única variável, GDN_DATABASE_CONNECTION_STRING, com a connection string ADO.NET inteira — a mesma de ConnectionStrings__DefaultConnection do container app ca-seb-guardian-api-<env>. Host, porta, banco, usuário, senha e Encrypt saem dela. O schema é sempre gdn, onde a migration cria a tabela.

Não quebre essa string em ; na mão para montar variáveis separadas: a senha pode conter ; e =, e nesse caso vem entre chaves ou aspas — truncar o valor derruba o login com Login failed.

Para copiar a de dev para o .env local, sem que o valor passe pelo terminal:

Example :
az containerapp show --name ca-seb-guardian-api-dev --resource-group RG-SEB-Guardian-DEV \
  --query "properties.template.containers[0].env[?name=='ConnectionStrings__DefaultConnection'].value | [0]" -o tsv \
  | sed "s/^/GDN_DATABASE_CONNECTION_STRING='/; s/\$/'/" >> .env

Três escopos, na coluna scope:

scope Quantidade Quando é gravado
run 1 por execução INSERT como running no início; UPDATE no fim. stage = ALL_STAGES
stage 1 por etapa INSERT como running no início da etapa; UPDATE no fim
controller 1 por controladora, por etapa INSERT no fim da etapa, com o início/fim real de cada controladora

Colunas: run_id (correlaciona tudo de uma execução), scope, stage, trigger_type (cron ou manual), unit_crm_id, unit_name, controller_id, controller_uid, controller_name, controller_ip, dat_started, dat_finished, duration_ms, status, detail, users_sent, dat_created.

dat_finished fica nulo enquanto o status é running — linha aberta denuncia execução que morreu no meio.

status assume running, success, partial ou error:

  • Controladorasuccess se sincronizou; partial se parte dos usuários falhou; error se falhou.
  • Etapaerror se a etapa lançou ou se todas as controladoras falharam; partial se algumas falharam ou ficaram parciais; success caso contrário.
  • Execuçãosuccess se todas as etapas foram success; error se todas foram error; senão partial.

detail traz OK, nada a sincronizar (controladora que não tinha nada a receber), ou a mensagem de erro real.

Uma controladora ligada a grupos de unidades diferentes tem os valores concatenados por ; em unit_crm_id e unit_name — continua sendo uma linha por etapa e controladora, para não duplicar a falha.

O disparo manual GET /v1/accesscontrol/sync/visit grava as linhas de stage e controller com trigger_type = 'manual', sem linha de run.

Falha ao gravar qualquer log — SQL ou blob — é apenas registrada no stdout e nunca aborta o sync.

Consultas para relatório e alerta

Última execução, etapa a etapa:

Example :
SELECT TOP (7) scope, stage, dat_started, dat_finished, duration_ms, status, detail
FROM gdn.tb_sync_log
WHERE run_id = (SELECT TOP (1) run_id FROM gdn.tb_sync_log WHERE scope = 'run' ORDER BY dat_started DESC)
ORDER BY dat_started, scope;

Controladoras com problema hoje, por unidade:

Example :
SELECT unit_name, controller_name, controller_ip, stage, status, detail, dat_started, duration_ms
FROM gdn.tb_sync_log
WHERE scope = 'controller'
  AND status <> 'success'
  AND dat_started >= CAST(SYSUTCDATETIME() AS DATE)
ORDER BY unit_name, controller_name;

Execução que não terminou — o processo morreu no meio e a linha ficou aberta:

Example :
SELECT run_id, stage, dat_started
FROM gdn.tb_sync_log
WHERE scope IN ('run', 'stage')
  AND status = 'running'
  AND dat_started < DATEADD(HOUR, -2, SYSUTCDATETIME());

Support

Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.

Stay in touch

License

Nest is MIT licensed.

results matching ""

    No results matching ""