Javis OS
Javis OS is an Agentic AI that assists entrepreneurs in business tasks, helping them grow their work.
AI translation
Platform for electronic registration of requests and occurrences with verification and forwarding of urban demands.
AI translation
Plataforma para Registro Eletrônico de Solicitações e Ocorrências com Verificação e Encaminhamento de demandas urbanas.
BusinessTypeScript · NixGitHub @CecimedeirosOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
🏙️ 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.Read the full 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.