Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
🏙️ RESOLVE - Plataforma de Registro Eletrônico de Solicitações e Ocorrências com Verificação e Encaminhamento de Demandas Urbanas Uma aplicação web para centralizar o registro de demandas urbanas, facilitar o acompanhamento das solicitações e oferecer mais visibilidade para os gestores, responsáveis por executar a resolução de problemas públicos. A plataforma busca melhorar a comunicação entre o cidadão e a gestão responsável, reduzindo a dispersão de informações e apoiando a tomada de decisão com dados operacionais em tempo real.查看完整 README ↗
A plataforma busca melhorar a comunicação entre o cidadão e a gestão responsável, reduzindo a dispersão de informações e apoiando a tomada de decisão com dados operacionais em tempo real.
A ausência de uma plataforma centralizada para registro, rastreabilidade e priorização de demandas urbanas dificulta a tomada de decisão por parte da gestão e reduz a eficiência no atendimento à população.
A proposta dialoga com as diretrizes de transformação digital no setor público, em especial a Lei nº 14.129/2021 (Lei do Governo Digital), estabelecendo princípios como:
Relaciona-se também com a Estratégia Nacional de Governo Digital, incentivando o uso de tecnologias para melhorar a relação entre o governo e o cidadão.
Responsável por:
Responsável por:
O painel administrativo acompanha, no mínimo:
| Tela | Descrição |
|---|---|
| Página Inicial (Cidadão) | Destaque para o fluxo do cidadão, listagem de demandas, sistema de filtros e acesso à área do gestor. |
| Página Inicial (Gestor) | Listagem geral, filtros avançados, acesso ao painel administrativo e ações de edição/atualização de status. |
| Formulário de Demanda | Coleta de dados da ocorrência (local, descrição, categoria, imagem, etc.). |
| Detalhes da Demanda | Visualização completa de todos os dados de um registro específico. |
| Painel Administrativo | Dashboard focado em métricas operacionais para os gestores. |
| Sistema de Filtros | Combinação de filtros por categoria, região, status e prioridade. |
| Tela | Descrição |
|---|---|
| Login e Cadastro | Acesso segmentado (Sou cidadão ou Sou gestor) com email e senha. |
| Camada | Tecnologias Utilizadas |
|---|---|
| Front-end | TypeScript, Next.js, Chakra UI, Tailwind CSS, Zustand |
| Back-end & Integração | Node.js, Express, Prisma ORM |
| Autenticação & Dados | JWT, Cookies, Redis, Cron Jobs, API Fake |
A plataforma RESOLVE utiliza um API Gateway como ponto central de entrada (Porta 8080), que gerencia o tráfego e a segurança entre o frontend e os microsserviços internos.
http://localhost:8080| Serviço | Método | Endpoint | Descrição |
|---|---|---|---|
| Monitoramento | GET | /health | Verifica a saúde e disponibilidade dos serviços. |
| Autenticação | POST | /auth/login | Autentica o usuário e gera o token de acesso (JWT). |
| Demandas | GET | /demands | Lista todas as demandas (com suporte a filtros avançados). |
| Demandas | POST | /demands | Registra uma nova ocorrência urbana no sistema. |
| Métricas | GET | /metrics | Retorna KPIs e indicadores operacionais para o gestor. |
A arquitetura da plataforma RESOLVE foi desenhada para operar como um sistema distribuído de alta disponibilidade e resiliência. Abaixo estão mapeados os padrões implementados na infraestrutura e no código:
A aplicação tira proveito do Event Loop do Node.js e de uma arquitetura orientada a eventos para não bloquear a thread principal durante processamentos pesados:
demand-service não trava a requisição aguardando a atualização das métricas. Ao alterar um status, ele delega a tarefa disparando eventos de forma assíncrona (lPush na fila smartcity:event-queue e publish no canal smartcity:denuncia-status) e devolve a resposta imediatamente ao gestor.metrics-service possui workers dedicados (startEventSubscriber e startQueueWorker) que escutam ativamente o Redis. Eles processam as atualizações de KPIs em background, lidando com falhas através de políticas de retry (withRetry).Promise.all): No cálculo de métricas, múltiplas consultas de leitura (total, categorias, regiões e status) são disparadas simultaneamente. O Node.js gerencia essas requisições concorrentemente, reduzindo o tempo de carregamento do dashboard.Promise.race): Ao publicar um evento de mudança de status no Redis, o demand-service disputa a operação contra um temporizador de 3 segundos. Caso o Redis demore ou falhe, a corrida rejeita a promise e loga o erro — sem travar a thread que já devolveu a resposta HTTP ao gestor.prisma.$transaction): As operações de atualização de status e de prioridade de uma demanda são executadas dentro de uma transação atômica. A gravação na tabela denuncias e a criação do registro em historicos acontecem como uma unidade indivisível — se qualquer etapa falhar, tudo é revertido, prevenindo inconsistências quando múltiplas requisições concorrentes chegam ao mesmo tempo.retries * 200ms — ou seja, 200ms, 400ms e 600ms). Após esgotar as tentativas, a conexão é encerrada em vez de tentar indefinidamente. Isso evita rajadas de reconexão que sobrecarregariam o servidor Redis em caso de falha.O paralelismo real do sistema é alcançado através da sua infraestrutura, tirando proveito de múltiplos recursos computacionais:
api-gateway (porta 8080), auth-service (3001), demand-service (3002) e metrics-service (3003) operam como processos independentes. Eles rodam simultaneamente, dividindo a carga de CPU do servidor host.Promise.all): Nas funções listDenunciasByCidadao e listAllDenuncias do demand-service, a contagem total de registros (COUNT) e a busca paginada (findMany) são disparadas simultaneamente com Promise.all. O banco executa ambas as queries em paralelo, reduzindo o tempo de resposta de cada listagem em comparação com execução sequencial.Promise.allSettled): O api-gateway expõe um endpoint /warmup que dispara pings simultâneos para os três microsserviços sem aguardar nenhuma resposta (fire-and-forget). O uso de Promise.allSettled garante que a falha de um serviço não impeça o retorno imediato do gateway — o cliente recebe 200 enquanto os processos são acordados em paralelo.Técnicas rigorosas foram implementadas para proteger a memória, o tempo de resposta e a estabilidade do servidor:
Promise.race com um limite de 5 segundos. Isso garante que a aplicação rejeite a operação rapidamente caso o banco de dados trave, evitando que o sistema inteiro congele esperando uma resposta infinita./health que realiza chamadas concorrentes (Promise.all) para validar o status de todos os microsserviços, reportando a integridade da infraestrutura em tempo real.demand-service define índices explícitos (@@index) nos campos categoria, status, prioridade e regiao da tabela denuncias. Isso acelera diretamente as queries de filtragem do painel do gestor, evitando varreduras completas na tabela a cada requisição.skip/limit: Todas as listagens de demandas utilizam paginação (skip + take no Prisma), garantindo que apenas o subconjunto de dados solicitado seja carregado na memória e trafegado entre banco e serviço — sem trazer registros desnecessários independentemente do volume total de demandas.upsert Atômico para Resolução de Identidade: As funções resolveCidadaoId e resolveGestorId utilizam prisma.upsert ao invés de SELECT + INSERT em operações separadas. Isso elimina a race condition onde duas requisições simultâneas do mesmo usuário tentariam inserir o mesmo registro no banco, causando violação de chave única.| Ferramenta Utilizada | Material | Links |
|---|---|---|
| Figma | Protótipo | Acesse aqui |
| Postman | Documentação Pública da API | Acesse aqui |
| BRmodelo | Modelagem conceitual - Auth | Acesse aqui |
| BRmodelo | Modelagem lógica - Auth | Acesse aqui |
| BRmodelo | Modelagem conceitual - Demand | Acesse aqui |
| BRmodelo | Modelagem lógica - Demand | Acesse aqui |
| LucidChart | Desenho da Arquitetura em Microsserviços | Acesse aqui |
cd Smart-City
npm install
npm run dev
Disponível em http://localhost:3000
cd backend
copy .env.example .env.local
docker compose --env-file .env.local up -d --build
docker compose --env-file .env.local exec auth-service npx prisma generate
docker compose --env-file .env.local exec auth-service npx prisma migrate deploy
docker compose --env-file .env.local exec demand-service npx prisma generate
docker compose --env-file .env.local exec demand-service npx prisma migrate deploy
Disponível em http://localhost:8080
O repositório traz um flake.nix para quem usa Nix/NixOS. Ele fixa as versões
das ferramentas, então não é preciso instalar Node na mão nem acertar a
versão certa:
nix develop # Node 22 + Playwright (frontend e e2e)
nix develop .#backend # Postgres 16 + Redis + Node, para rodar os serviços sem Docker
Dois detalhes que o flake resolve e valem para todo mundo saber:
node:20-alpine, mas o Node 20 saiu
de suporte (EOL em 2026-04-30). O flake usa Node 22 LTS, que atende o
requisito do Next 16 (>= 20.9). O e2e/README.md ainda diz "Node 18+" —
isso está desatualizado.e2e/package.json fixa @playwright/test na mesma versão empacotada pelo
nixpkgs (playwright-driver). No shell do Nix os navegadores já vêm prontos
(PLAYWRIGHT_BROWSERS_PATH), dispensando o npx playwright install — que,
sem isso, baixa um binário dinâmico que não roda no NixOS. Se as versões
saírem de sincronia, o shell avisa ao ser aberto.Quem não usa Nix segue normalmente com Node 22 instalado pelo gerenciador de sua preferência — nada no projeto passou a depender do Nix.
partializepartializelocalStoragetokenroleuserEmailuserNamedemandsfiltersapiMetrics/warmup): Um monitor externo (UptimeRobot) acessa o endpoint /warmup do gateway a cada 5 minutos, mantendo todos os microsserviços do Render em execução contínua. Sem esse mecanismo, o plano gratuito hiberna os serviços após 15 minutos de inatividade, causando cold starts de aproximadamente 30 segundos para o próximo usuário que acessar a plataforma.