Aplicação web para gestão acadêmica e operação de uma escola/plataforma de inglês, com foco em:
- autenticação e controle de acesso por papéis;
- gestão de cursos, trilhas, materiais e atividades;
- experiência de dashboard para alunos e administradores;
- backend integrado ao ecossistema Firebase.
Este projeto centraliza fluxos de ensino e administração em uma única aplicação, permitindo:
- organização de conteúdos e trilhas de aprendizado;
- acompanhamento de atividades no ambiente do aluno;
- operações administrativas com rotas e APIs dedicadas.
- Next.js 16 (App Router)
- React 19
- TypeScript 5
- Tailwind CSS 4
- Radix UI + componentes utilitários internos (
components/ui)
- Firebase Authentication (login e gestão de sessão)
- Cloud Firestore (persistência de dados)
- Firebase Admin SDK (operações privilegiadas no servidor)
- Cloudinary (upload e gerenciamento de mídia)
- ESLint 9 + eslint-config-next
- Vitest 4 + Testing Library + jsdom
O projeto está estruturado para separar responsabilidades por contexto:
app/: páginas, layouts e rotas API (padrão App Router).components/: componentes compartilhados e biblioteca de UI.modules/: organização por domínio funcional (courses,tracks,materials,activities,users), incluindo UI, API client e modelos.lib/: integrações e utilitários transversais (Firebase, Cloudinary, autenticação, helpers).hooks/: hooks reutilizáveis.tests/: cobertura de testes unitários e de comportamento.
Essa organização reduz acoplamento entre áreas de negócio e facilita evolução incremental de cada módulo.
Em alto nível, o fluxo principal é:
- O usuário autentica via Firebase Auth.
- A aplicação resolve permissões/papel de acesso (admin/aluno) com base em regras do backend.
- As páginas de dashboard consomem dados dos módulos de domínio.
- Operações administrativas usam rotas em
app/api/admin/*com validações server-side. - Uploads e ativos de mídia passam pela integração com Cloudinary quando aplicável.
- Node.js (LTS recomendado)
- npm
- Projeto Firebase configurado (Auth + Firestore)
- Credenciais de serviço para recursos administrativos (quando necessário)
O projeto utiliza variáveis de ambiente para conectar Firebase/Cloudinary e definir comportamento de autenticação.
Como você já possui .env.local, mantenha nele as variáveis abaixo (ajustadas para seu ambiente):
NEXT_PUBLIC_FIREBASE_API_KEYNEXT_PUBLIC_FIREBASE_AUTH_DOMAINNEXT_PUBLIC_FIREBASE_PROJECT_IDNEXT_PUBLIC_FIREBASE_STORAGE_BUCKETNEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_IDNEXT_PUBLIC_FIREBASE_APP_IDNEXT_PUBLIC_SIGNUP_ENABLED
ADMIN_EMAILSFIREBASE_PROJECT_IDFIREBASE_CLIENT_EMAILFIREBASE_PRIVATE_KEY(com quebras de linha escapadas como\n)
CLOUDINARY_CLOUD_NAMECLOUDINARY_API_KEYCLOUDINARY_API_SECRET
Referência de exemplo: .env.local.example.
Instale as dependências:
npm install
Rode o ambiente de desenvolvimento:
npm run dev
Aplicação disponível em:
http://localhost:3000
npm run dev: inicia o servidor de desenvolvimento.npm run build: gera build de produção.npm run start: inicia a aplicação em modo produção.npm run lint: executa análise estática com ESLint.npm run type: valida tipagem TypeScript (tsc --noEmit).npm run test: executa testes com Vitest.npm run test:watch: executa testes em modo observação.npm run test:coverage: gera relatório de cobertura.
app/dashboard/*: áreas principais de uso (aluno e administração).app/api/admin/*: endpoints para operações administrativas.modules/courses|tracks|materials|activities|users: domínios de negócio.lib/firebase/*: configuração cliente/servidor e ações de autenticação.
- Tipagem forte com TypeScript em toda a base.
- Separação por domínio para escalabilidade de código.
- Rotas administrativas isoladas no servidor.
- Testes automatizados para regressão funcional.
- Configuração explícita de ambiente para segurança e previsibilidade.
- Não versionar segredos reais (
.env.localdeve permanecer fora do Git). - Validar regras do Firestore antes de publicar alterações.
- Revisar permissões de admin (
ADMIN_EMAILS) em ambiente de produção.
Defina aqui a licença oficial do projeto (ex.: MIT, proprietária, uso interno).