A progressive Node.js framework for building efficient and scalable server-side applications.
Nest framework TypeScript starter repository.
$ npm install# development
$ npm run start
# watch mode
$ npm run start:dev
# production mode
$ npm run start:prod# unit tests
$ npm run test
# e2e tests
$ npm run test:e2e
# test coverage
$ npm run test:covImplementa 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.
gdn.tb_sync_logA 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:
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/\$/'/" >> .envTrê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:
success se sincronizou; partial se parte dos usuários falhou; error se falhou.error se a etapa lançou ou se todas as controladoras falharam; partial se algumas falharam ou
ficaram parciais; success caso contrário.success 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.
Ú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());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.
Nest is MIT licensed.