Este projeto foi desenvolvido como trabalho acadêmico para a disciplina de Análise/Projetos de Sistema, apresentado durante o semestre. O objetivo da atividade era desenvolver um sistema completo que envolvesse banco de dados e programação, demonstrando a aplicação prática dos conceitos estudados em sala de aula.
O CS2 Pixels foi escolhido como tema por combinar diferentes tecnologias e desafios técnicos, incluindo:
- Desenvolvimento de interface web moderna
- Integração com banco de dados NoSQL (Firestore)
- Gerenciamento de arquivos (Firebase Storage)
- Sistema de autenticação e autorização
- APIs RESTful para comunicação entre frontend e backend
O CS2 Pixels é uma plataforma web para busca e visualização de vídeos de jogadas do Counter-Strike 2. O sistema permite que usuários encontrem vídeos específicos através de filtros estruturados (mapa e ação) e busca por texto livre.
- Frontend: Next.js 15 com React 19 e TypeScript
- Backend: Next.js API Routes
- Banco de Dados: Firebase Firestore
- Armazenamento: Firebase Storage
- Autenticação: Firebase Authentication
src/
├── app/
│ ├── page.tsx # Página principal (busca pública)
│ ├── api/search/route.ts # API de busca
│ └── admin/ # Área administrativa
│ ├── login/ # Autenticação
│ └── dashboard/ # Gerenciamento de vídeos
└── lib/
└── firebase.ts # Configuração do Firebase
Processo:
- Usuário seleciona mapa e ação nos filtros obrigatórios
- Opcionalmente, digita texto para refinar a busca
- Sistema envia requisição para a API de busca
- API consulta o Firestore com filtros aplicados
- Retorna o primeiro vídeo que corresponde aos critérios
- Vídeo é exibido no player
Filtros:
- Obrigatórios: Mapa e Ação
- Opcionais: Texto livre (processado como palavras-chave para busca em tags)
Processo:
- Administrador faz login no sistema
- Acessa o dashboard administrativo
- Faz upload de vídeo MP4 com metadados
- Sistema salva arquivo no Firebase Storage
- Metadados são salvos no Firestore
- Vídeo fica disponível para busca
Cada documento na coleção videos possui:
{
id: string; // ID único (gerado automaticamente)
mapa: string; // Nome do mapa (ex: "mirage", "inferno")
acao: string; // Tipo de ação (ex: "smoke", "flash")
posicao_inicial: string; // Posição inicial do jogador
destino: string; // Local de destino
url_video: string; // URL do vídeo no Storage
tags: string[]; // Array de palavras-chave
createdAt: Timestamp; // Data de criação
}A busca funciona em camadas:
- Filtros obrigatórios: Reduzem o conjunto de dados por mapa e ação
- Filtro por tags: Refina resultados quando texto é fornecido
- Limite: Retorna apenas o primeiro resultado encontrado
Vantagens:
- Performance otimizada com filtros primários
- Precisão na busca por campos específicos
- Flexibilidade com texto opcional
Interface dividida em dois painéis:
- Painel Esquerdo (30%): Filtros de busca e controles
- Painel Direito (70%): Visualização do vídeo
Estados gerenciados:
- Filtros de busca (mapa, ação, texto)
- Resultado da busca
- Estados de loading e erro
Endpoint POST que processa requisições de busca:
- Valida dados de entrada
- Processa texto em palavras-chave
- Constrói query otimizada no Firestore
- Retorna resultado ou mensagem de erro
Códigos de resposta:
200: Vídeo encontrado400: Dados inválidos404: Nenhum vídeo encontrado500: Erro interno do servidor
Funcionalidades:
- Upload de vídeos com barra de progresso
- Listagem de vídeos com paginação
- Edição de metadados
- Exclusão de vídeos (arquivo + registro)
Proteção:
- Autenticação obrigatória via Firebase Auth
- Redirecionamento automático para login se não autenticado
O sistema utiliza Firebase Authentication para controle de acesso:
- Login: Email e senha no endpoint
/admin/login - Proteção: Rotas administrativas verificam autenticação
- Sessão: Mantida pelo Firebase até logout explícito
O sistema trata os seguintes tipos de erro:
- Validação (400): Campos obrigatórios ausentes
- Não encontrado (404): Vídeo não existe com os critérios
- Servidor (500): Erro interno do sistema
- Rede: Falha na comunicação com APIs
Todos os erros retornam mensagens claras ao usuário.
Arquivo .env.local na raiz do projeto:
NEXT_PUBLIC_FIREBASE_API_KEY=...
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=...
NEXT_PUBLIC_FIREBASE_PROJECT_ID=...
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=...
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=...
NEXT_PUBLIC_FIREBASE_APP_ID=...Nota: O prefixo NEXT_PUBLIC_ torna as variáveis acessíveis no frontend.
- Busca em camadas reduz volume de dados processados
- Índices compostos no Firestore para consultas rápidas
- Upload progressivo com feedback visual
- Carregamento sob demanda de componentes
- Validação de entrada em todas as requisições
- Autenticação obrigatória para operações administrativas
- Sanitização de dados antes de persistência
- Lógica:
src/app/api/search/route.ts - Interface:
src/app/page.tsx - Estilos:
src/app/page.module.css
- Analisar código existente
- Seguir padrões de nomenclatura
- Testar localmente
- Documentar alterações


