Sistema institucional oficial desenvolvido para o setor de Suporte de Tecnologia da Informação & Multimídia do Centro Universitário Paraíso (UniFAP - Juazeiro do Norte/CE) • unifapce.edu.br.
Uma plataforma corporativa completa que unifica o controle de materiais a granel, rastreabilidade individual de equipamentos patrimoniais, fluxo de empréstimos com termos A4 e notificações no WhatsApp, ordens de serviço com horímetro para projetores, scanner mobile de QR Code, mapeamento físico do armário de TI, microsserviço de Reconhecimento Facial Biométrico com busca vetorial (pgvector), módulo de Eventos Acadêmicos com Check-in por Totem e Sorteios Interativos em Telão, além de API REST para integrações externas com n8n e agentes de IA.
O setor de Suporte de TI & Multimídia da UniFAP atende centenas de professores, colaboradores e discentes em dezenas de salas de aula, laboratórios, auditórios e eventos acadêmicos institucionais. Este sistema foi desenvolvido para solucionar gargalos operacionais e introduzir inovação tecnológica:
AssetHistory) para projetores, notebooks, caixas de som e microfones.pgvector e FastAPI.O sistema adota uma arquitetura modular em microsserviços integrados, operando em rede isolada de containers Docker:
flowchart TB
subgraph Internet["Rede Externa / Usuários"]
UserBrowser["Navegador Web / Mobile (PWA)"]
TotemClient["Totem de Presença Facial"]
WhatsAppBot["n8n / WhatsApp Bots"]
end
subgraph Edge["Camada de Borda & Segurança"]
Cloudflare["Cloudflare Edge (WAF, SSL, DDoS)"]
Tunnel["Cloudflare Tunnel (cloudflared container)"]
end
subgraph DockerNetwork["Rede Interna Docker (unifap-network)"]
subgraph WebApp["Next.js 14 App (Porta 3000)"]
UI["Interface React & Tailwind CSS"]
Middleware["Edge Security Middleware (RBAC)"]
APIRoutes["Next.js Route Handlers (API v1)"]
PrismaClient["Prisma ORM Client"]
end
subgraph BioService["Microsserviço Python (Porta 8000)"]
FastAPI["FastAPI 0.111"]
FaceRecognition["InsightFace / Dlib (128D Embeddings)"]
end
subgraph Database["PostgreSQL 16 (Porta 5432)"]
PGVector["Extensão pgvector (Busca Vetorial L2)"]
RelationalData["Tabelas Relacionais (17 Modelos)"]
end
end
UserBrowser & TotemClient & WhatsAppBot --> Cloudflare
Cloudflare --> Tunnel
Tunnel --> WebApp
WebApp <--> BioService
WebApp <--> Database
BioService <--> Database
next-themes).<->) para vetores de 128 dimensões.@media print) — Diagramação padronizada em papel A4 institucional para Cautelas, Ordens de Serviço, Etiquetas e Inventários.#PAT-004128), número de série, marca, modelo, valor de aquisição, data e nota fiscal.AssetHistory): Trilha perpétua registrando cada evento de vida do ativo (Cadastrado, Emprestado, Devolvido, Enviado para Manutenção, Movimentado de Caixa, Baixado)./armario): Representação visual intuitiva das 3 portas do armário de TI com suas 18 caixas organizadoras./caixas/[code]): Acesso instantâneo via QR Code colado na caixa física, exibindo o saldo de materiais e equipamentos alocados.StockMovement): Trilha com saldo anterior, saldo posterior, responsável e timestamp.OVERDUE): Alertas visuais e contadores dinâmicos de dias/horas de atraso.wa.me para comunicação com professores e servidores.#OS-2026-0001), níveis de prioridade e tipos de manutenção (Corretiva, Preventiva, Externa, Interna).AVAILABLE.<->) da extensão pgvector.0.60) com validação de qualidade de enquadramento./eventos): Cadastro de eventos, palestras, jornadas acadêmicas e semanas universitárias./eventos/[id]/sorteio):
Web Audio API.canvas-confetti) e histórico de ganhadores com entrega de prêmios./totem/[eventId]): Interface interativa em tela cheia com câmera em tempo real para auto-check-in de participantes em auditórios e credenciamentos./presentation/[eventId]): Visualização pública com contadores em tempo real de participantes presentes, tema escuro de alto contraste e layout adaptado para projetores e TVs./scanner)/relatorios):
ApiKey): Tokens seguros transmitidos via cabeçalho Authorization: Bearer <token> ou x-api-key.GET /api/v1/external/query): Processamento de consultas em linguagem natural com retorno formatado com emojis e markdown para bots.POST /api/v1/external/loans e POST /api/v1/external/returns.POST /api/v1/external/maintenance.ADMIN, GESTOR, OPERADOR e ACADEMIC_SUPPORT.src/lib/ssrf.ts): Bloqueio rigoroso de acessos a loopback, RFC1918, serviços internos Docker e metadados de nuvem.CF-Connecting-IP).maskCpf), e-mail e telefone em telas e feeds da API.O armário principal de TI e Multimídia está organizado fisicamente em 3 portas e 18 caixas padronizadas:
┌─────────────────────────┬─────────────────────────┬─────────────────────────┐
│ PORTA 1 │ PORTA 2 │ PORTA 3 │
│ (Lado Esquerdo) │ (Centro) │ (Lado Direito) │
├─────────────────────────┼─────────────────────────┼─────────────────────────┤
│ [C001] Cabos HDMI 2m/3m │ [C007] Cabos HDMI 10m │ [C013] Projetores Epson │
│ [C002] Cabos VGA & DVI │ [C008] Cabos HDMI 15m │ [C014] Projetores BenQ │
│ [C003] Cabos Rede CAT6 │ [C009] Adaptadores Mac │ [C015] Caixas de Som │
│ [C004] Mouses USB/Sem F │ [C010] Microfones Lapela│ [C016] Microfones S/ Fio│
│ [C005] Teclados ABNT2 │ [C011] Microfones Pedest│ [C017] Extensões & Filt │
│ [C006] Cabos de Força │ [C012] Passadores Slides│ [C018] Pilhas & Baterias│
└─────────────────────────┴─────────────────────────┴─────────────────────────┘
unifap-estoque/
├── docker-compose.yml # Orquestração: PostgreSQL + Biometric API + Next.js App + Cloudflared
├── package.json # Dependências e scripts do ecossistema Next.js
├── start-db.ps1 # Script PowerShell para inicialização rápida
├── biometric-api/ # Microsserviço Python FastAPI de Biometria Facial
│ ├── Dockerfile # Container do microsserviço biométrico
│ ├── requirements.txt # Dependências Python (FastAPI, OpenCV, InsightFace, pgvector)
│ └── app/ # Código-fonte da API biométrica (config, rotas, modelos)
├── docs/ # Documentação técnica e relatórios institucionais
│ └── RELATORIO_AUDITORIA_SEGURANCA.md # Relatório completo de auditoria de segurança & LGPD
├── prisma/
│ ├── schema.prisma # Modelagem completa do banco de dados (17 tabelas relacionais)
│ └── seed.ts # Script de população idempotente e criação de usuários padrão
├── public/ # Arquivos públicos e estáticos
└── src/
├── middleware.ts # Edge Middleware de autenticação e proteção RBAC
├── app/ # Rotas e páginas do Next.js App Router (76 rotas)
│ ├── (auth)/login/ # Autenticação institucional com rate limiter
│ ├── (dashboard)/ # Shell autenticado do sistema
│ │ ├── dashboard/ # Métricas, KPIs e gráficos em tempo real
│ │ ├── armario/ & caixas/ # Mapeamento do armário físico e caixas organizadoras
│ │ ├── estoque/ # Gestão de materiais e movimentações atômicas
│ │ ├── patrimonio/ # Tombamento e linha do tempo de equipamentos
│ │ ├── emprestimos/ # Checkout de empréstimo e cautelas A4
│ │ ├── manutencao/ # Ordens de serviço e horímetro de projetores
│ │ ├── eventos/ # Gestão de eventos, credenciamento e sorteador
│ │ ├── biometria/ # Cadastro biométrico e gerenciamento de pessoas
│ │ ├── scanner/ # Scanner mobile de QR Code via câmera
│ │ ├── relatorios/ # 5 relatórios analíticos e checklist
│ │ ├── agenda/ & salas/ # Agendamento de salas e equipamentos
│ │ └── usuarios/ # Gestão de operadores e perfis de acesso
│ ├── totem/[eventId]/ # Totem de check-in facial em tela cheia
│ ├── presentation/[eventId]/ # Telão ao vivo para auditórios
│ └── api/v1/ # Endpoints REST internos e externos
├── components/ # Componentes React reutilizáveis (UI, modais, formulários)
├── lib/ # Utilitários (Prisma, Auth, Anti-SSRF, Mascaramento LGPD, Áudio)
├── schemas/ # Esquemas de validação com Zod
├── services/ # Camada de serviços e regras de negócio
└── __tests__/ # Suíte de 135 testes automatizados com Vitest
erDiagram
User ||--o{ StockMovement : "realiza"
User ||--o{ Loan : "cria/recebe"
User ||--o{ Maintenance : "abre/encerra"
User ||--o{ AuditLog : "gera"
User ||--o{ ApiKey : "possui"
Door ||--o{ Box : "contém"
Box ||--o{ Inventory : "armazena"
Box ||--o{ Asset : "guarda"
Category ||--o{ Item : "classifica"
Item ||--o{ Inventory : "saldo"
Item ||--o{ Asset : "tombamentos"
Item ||--o{ StockMovement : "movimenta"
Asset ||--o{ AssetHistory : "trilha"
Asset ||--o{ Loan : "emprestado"
Asset ||--o{ Maintenance : "manutenções"
Person ||--o{ FaceEmbedding : "vetores 128D"
Person ||--o{ Presence : "presenças"
Person ||--o{ EventParticipant : "inscrições"
Event ||--o{ EventParticipant : "participantes"
Event ||--o{ Presence : "presenças"
Event ||--o{ Prize : "prêmios"
Event ||--o{ Draw : "sorteios"
Draw ||--o{ Winner : "ganhadores"
Esta é a opção recomendada para produção. Todos os serviços (Next.js, FastAPI, PostgreSQL com pgvector e Cloudflared Tunnel) sobem de forma orquestrada e com as portas do host restritas à interface local (127.0.0.1).
git clone https://github.com/RivaldoMascarenhas/EstoqueMultimidia.git
cd EstoqueMultimidia
.env:
cp .env.example .env
Edite o .env e preencha com senhas fortes geradas aleatoriamente e o seu token do Cloudflare Tunnel:
# Gerar segredos fortes no terminal:
openssl rand -base64 32
docker compose up -d --build
# Executa o seed dentro do ambiente da aplicação
docker compose exec app npm run prisma:push
docker compose exec app npm run prisma:seed
http://localhost:3000.npm install
# Via Docker Compose (apenas o banco):
docker compose up postgres -d
npm run prisma:push
npm run prisma:seed
npm run dev
Acesse: http://localhost:3000
| Variável | Descrição | Exemplo / Padrão |
|---|---|---|
DATABASE_URL |
URL de conexão com o PostgreSQL | postgresql://postgres:senha@localhost:5432/estoque_multimidia |
POSTGRES_USER |
Usuário do banco de dados | postgres |
POSTGRES_PASSWORD |
Senha segura do banco de dados | gere_com_openssl_rand |
POSTGRES_DB |
Nome da base de dados | estoque_multimidia |
NEXTAUTH_URL |
URL pública da aplicação | http://localhost:3000 ou https://estoque.fapce.edu.br |
NEXTAUTH_SECRET |
Chave mestra de assinatura JWT | gere_com_openssl_rand_-base64_32 |
BIOMETRIC_API_URL |
URL do microsserviço FastAPI | http://localhost:8000 (dev) / http://biometric-api:8000 (docker) |
BIOMETRIC_INTERNAL_TOKEN |
Token interno de comunicação Next.js ↔ FastAPI | token_secreto_interno |
RECOGNITION_TOLERANCE |
Limiar de distância Euclidiana L2 para reconhecimento | 0.60 |
CLOUDFLARE_TUNNEL_TOKEN |
Token de autenticação do Cloudflare Tunnel | eyJhIjoi... |
O script de inicialização (prisma/seed.ts) permite popular o banco local com perfis de teste para validação de fluxos e permissões.
[!IMPORTANT] Segurança de Produção: Em ambientes de produção, o seed não utiliza credenciais pré-fixadas e exige a definição da variável
SEED_DEFAULT_PASSWORD(ou gera senhas seguras pseudo-aleatórias descartáveis), ativando troca obrigatória de senha (mustChangePassword: true) para todas as contas criadas.
| Perfil de Teste | E-mail de Exemplo | Role RBAC | Escopo de Permissões |
|---|---|---|---|
| Administrador | admin@exemplo.local |
ADMIN |
Acesso total a configurações, usuários, auditoria e chaves de API. |
| Gestor Multimídia | gestor@exemplo.local |
GESTOR |
Gestão de patrimônio, estoque, OS, eventos, relatórios e auditoria. |
| Operador de TI | operador@exemplo.local |
OPERADOR |
Empréstimos, devoluções, baixas/entradas, presenças e scanner. |
| Apoio Acadêmico | docente@exemplo.local |
ACADEMIC_SUPPORT |
Requisição de equipamentos pedagógicos e agendamento de salas. |
| Módulo / Funcionalidade | ADMIN |
GESTOR |
OPERADOR |
ACADEMIC_SUPPORT |
|---|---|---|---|---|
| Dashboard & Indicadores Gerais | ✅ | ✅ | ✅ | ✅ (Resumido) |
| Agendamento & Requisição de Salas | ✅ | ✅ | ✅ | ✅ |
| Scanner Mobile de QR Code | ✅ | ✅ | ✅ | ❌ |
| Consultar Armário & Caixas Físicas | ✅ | ✅ | ✅ | ❌ |
| Empréstimos, Devoluções & Cautelas A4 | ✅ | ✅ | ✅ | ❌ |
| Movimentações de Estoque (Entrada/Baixa) | ✅ | ✅ | ✅ | ❌ |
| Ordens de Serviço & Manutenção | ✅ | ✅ | ✅ | ❌ |
| Eventos Acadêmicos, Presença & Sorteios | ✅ | ✅ | ✅ | ❌ |
| Cadastro Biométrico Facial | ✅ | ✅ | ✅ | ❌ |
| Exportação de Relatórios & Checklist | ✅ | ✅ | ❌ | ❌ |
| Gestão de Usuários & Redefinição de Senhas | ✅ | ❌ | ❌ | ❌ |
| Trilha de Auditoria & Chaves de API | ✅ | ❌ | ❌ | ❌ |
O sistema possui uma suíte abrangente de testes automatizados cobrindo segurança, integridade referencial, concorrência, ciclos de vida de empréstimos, validação LGPD e prevenção de vulnerabilidades:
# Executar todos os testes automatizados:
npm test
✓ src/__tests__/security-edge.test.ts (8 tests)
✓ src/__tests__/events/exhaustive-events.test.ts (21 tests)
✓ src/__tests__/request-e2e-workflow.test.ts (21 tests)
✓ src/__tests__/users-api.test.ts (9 tests)
✓ src/__tests__/shift.service.test.ts (7 tests)
✓ src/__tests__/multimidia-platform.test.ts (7 tests)
✓ src/__tests__/loan-lifecycle.test.ts (6 tests)
✓ src/__tests__/room-projector.test.ts (6 tests)
✓ src/__tests__/lgpd-compliance.test.ts (5 tests)
✓ src/__tests__/maintenance-lifecycle.test.ts (5 tests)
✓ src/__tests__/api-auth.test.ts (5 tests)
✓ src/__tests__/asset-availability-scheduling.test.ts (5 tests)
✓ src/__tests__/api-guard.test.ts (4 tests)
✓ src/__tests__/concurrency.test.ts (3 tests)
✓ src/__tests__/security-hardening.test.ts (3 tests)
...
Test Files: 25 passed (25)
Tests: 135 passed (135)
Duration: 3.05s
A API REST externa permite integrar o sistema com automações no n8n, chatbots do WhatsApp e agentes de IA.
Envie o token no cabeçalho HTTP:
Authorization: Bearer <sua_chave_ou_token_de_api>
ou
x-api-key: <sua_chave_ou_token_de_api>
GET/api/v1/external/query?q=cabo+hdmiPOST/api/v1/external/loans{
"assetTag": "PAT-004128",
"borrowerName": "Prof. Carlos Eduardo",
"borrowerEmail": "carlos.eduardo@unifap.br",
"borrowerPhone": "88999887766",
"borrowerDepartment": "Medicina",
"destination": "Auditório Central",
"expectedReturnHours": 4
}
POST/api/v1/external/returns{
"assetTag": "PAT-004128",
"returnBoxCode": "C013",
"condition": "Perfeito estado",
"isDamaged": false
}
POST/api/v1/external/maintenanceO sistema foi rigorosamente auditado contra os padrões do OWASP Top 10 e a Lei Geral de Proteção de Dados (Lei nº 13.709/2018). Para conferir a análise detalhada de cada vulnerabilidade remediada, consulte:
📄 Relatório Técnico de Auditoria de Segurança & LGPD
src/lib/ssrf.ts) com bloqueio a redes internas e metadados de nuvem.O sistema conta com folhas de estilo @media print otimizadas para gerar documentos em folha A4 com identidade visual institucional:
| Atalho | Ação |
|---|---|
Ctrl + K / ⌘ + K |
Abre a Busca Global Instantânea (Spotlight) em qualquer tela do sistema. |
Esc |
Fecha modais, janelas de diálogo e a busca global. |
Enter |
Confirma seleção no Spotlight ou executa a busca rápida. |
| Comando | Descrição |
|---|---|
npm run dev |
Inicia o servidor de desenvolvimento Next.js. |
npm run build |
Compila o projeto e gera o bundle de produção otimizado. |
npm run start |
Inicia o servidor em modo de produção. |
npm test |
Executa a suíte de 135 testes automatizados com Vitest. |
npm run lint |
Executa a verificação estática do código com ESLint. |
npm run prisma:push |
Sincroniza o schema do Prisma com o PostgreSQL sem gerar migrações. |
npm run prisma:migrate |
Cria e aplica migrações versionadas no Prisma. |
npm run prisma:seed |
Popula o banco com os dados iniciais institucionais da UniFAP. |
npm run prisma:studio |
Abre a interface web visual do Prisma Studio para inspeção do banco. |
npm run docker:up |
Sobe o ecossistema de containers via Docker Compose. |
npm run docker:down |
Encerra os containers do Docker. |
npm run docker:logs |
Exibe os logs em tempo real dos containers. |
UniFAP — Tecnologia, Inovação e Excelência a Serviço da Educação