└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Desafio para o processo seletivo GDASH 2025/02 2 | 3 | Repositório destinado aos interessados em participar do processo seletivo GDASH 2025/02. 4 | 5 | ## Sobre o GDASH 6 | 7 | No ramo da produção de energia fotovoltaica, há a modalidade de produção compartilhada. Nessa modalidade, diferentes pessoas investem na construção de uma mesma usina fotovoltaica e dividem o retorno finaceiro referente à energia gerada pela usina. 8 | 9 | Acreditamos que as energias renováveis terão um lugar dominante em nossa economia pelo resto de nossas vidas. Trabalhamos no sentido de ampliar o impacto positivo que as energias renováveis podem ter no meio ambiente e nas nossas vidas. O sucesso da GDASH é resultado de nossa equipe apaixonada, juntamente com nosso compromisso de oferecer a melhor solução. 10 | 11 | Sabemos que negócios enfrentam desafios únicos e por isso oferecemos soluções turnkey, customizadas, economicamente viáveis e seguras. 12 | 13 | Somos uma startup em estágio de crescimento e você trabalhará diretamente com os fundadores, ajudando a definir a visão, o produto e a experiência do usuário. 14 | 15 |
23 | 24 | ## Sobre a vaga 25 | 26 | Já pensou em potencializar o setor que mais cresce na galáxia e trabalhar com uma solução que utiliza tecnologia web de ponta, altamente distribuída com foco em performance e disponibilidade? 👀 27 | 28 | Os desenvolvedores GDASH são responsáveis por criar e manter aplicações para clientes internos e externos, prover soluções escaláveis, resilientes e altamente disponíveis que sustentem picos de acesso além de atuar como referência técnica e tutores de outros desenvolvedores. 29 | 30 | Procuramos por pessoas dinâmicas e que queiram estar aprendendo sempre. Nossa equipe é jovem, motivada e estamos sempre em busca de soluções criativas para alcançar os resultados que nossos clientes esperam. Se você tem esse perfil, é autoconfiante, autodidata e tem facilidade para lidar com desafios diários, essa vaga é para você! 31 | 32 | # 🚀 O Desafio 33 | 34 | ## 🧭 Visão geral 35 | O objetivo deste desafio é desenvolver uma aplicação **full-stack** moderna que integre múltiplas linguagens e serviços, com foco em **integração entre sistemas, dados reais e uso de IA**. 36 | 37 | Você deverá construir um sistema que: 38 | 39 | 1. **Coleta dados climáticos** (via **Open-Meteo** ou **OpenWeather**) da sua **cidade/localização**; 40 | 2. **Envia esses dados periodicamente** para uma **fila** (Message Broker, como RabbitMQ ou até Redis), processada por um **worker em Go**; 41 | 3. **Armazena os dados** em uma **API NestJS** com **MongoDB**; 42 | 4. **Exibe um Dashboard** no frontend (React + Vite + Tailwind + shadcn/ui) com os dados coletados; 43 | 5. Gera **insights baseados em IA** a partir das informações climáticas — podendo ser gerados automaticamente, sob demanda, ou de qualquer outra forma que você julgar adequada; 44 | 6. Inclui: 45 | - **CRUD de usuários** (com autenticação e usuário padrão); 46 | - **Página opcional** de integração com uma **API pública paginada** (ex.: PokéAPI, Star Wars API, etc.); 47 | - **Exportação de dados** em **CSV/XLSX**; 48 | 7. Toda a solução deve rodar via **Docker Compose**. 49 | 50 | > ⚙️ **Observação importante:** 51 | > Os nomes de **endpoints, coleções, entidades, variáveis, bibliotecas e estruturas** usados neste documento são **apenas exemplos ilustrativos**. 52 | > Você pode (e deve) adotar as convenções e estruturas que considerar mais adequadas, desde que a **funcionalidade final** seja mantida. 53 | 54 | --- 55 | 56 | ## 🧩 Stack obrigatória 57 | 58 | - **Frontend:** React + Vite + Tailwind + [shadcn/ui](https://ui.shadcn.com) 59 | - **Backend (API):** NestJS (TypeScript) 60 | - **Banco de dados:** MongoDB (Atlas ou container) 61 | - **Fila:** Go + Message Broker (`RabbitMQ`, `Redis`, etc.) 62 | - **Coleta de dados:** Python (`requests`, `httpx`, `pandas`, etc.) 63 | - **APIs externas:** 64 | - Clima (obrigatória): [Open-Meteo](https://open-meteo.com/) ou [OpenWeather](https://openweathermap.org/) 65 | - Opcional: qualquer API pública com **paginação**, por exemplo: 66 | - [PokéAPI](https://pokeapi.co/) 67 | - [SWAPI (Star Wars API)](https://swapi.dev/) 68 | - **Infra:** Docker / Docker Compose 69 | - **Linguagem base:** **TypeScript obrigatório** (frontend e backend) 70 | 71 | --- 72 | 73 | ## ⚙️ Escopo funcional 74 | 75 | ### 1️⃣ Coleta de dados (Python → Fila) 76 | 77 | O serviço em **Python** será responsável por: 78 | 79 | - Buscar periodicamente (ex.: a cada 1 hora) dados da **previsão do tempo** da sua cidade/localização; 80 | - Extrair informações relevantes, como (exemplos): 81 | - Temperatura 82 | - Umidade 83 | - Velocidade do vento 84 | - Condição do céu 85 | - Probabilidade de chuva 86 | - Enviar os dados normalizados para uma **fila** em formato **JSON**. 87 | 88 | > 🔹 Estrutura do JSON, nomes de campos e cron/intervalo são **livres** — podem ser adaptados conforme sua arquitetura. 89 | 90 | O Python é o **produtor dos dados meteorológicos**. A camada de IA pode ser implementada em Python, no NestJS ou em outro serviço, desde que integrada. 91 | 92 | --- 93 | 94 | ### 2️⃣ Fila (Go + Message Broker) 95 | 96 | Implemente um **worker em Go**, responsável por: 97 | 98 | - Consumir mensagens da fila; 99 | - Validar e transformar os dados, se necessário; 100 | - Enviar os registros para a **API NestJS** (por exemplo, um endpoint como `POST /api/weather/logs`); 101 | - Confirmar as mensagens com **ack/nack**, implementar **retry básico**; 102 | - Registrar logs das operações principais. 103 | 104 | > 📘 **Observação:** 105 | > O nome do endpoint, o body do JSON e a estrutura de erro são **apenas exemplos** neste README. 106 | > Você pode definir o contrato de comunicação da forma que achar melhor, desde que o fluxo Python → Message Broker → Go → NestJS funcione corretamente. 107 | 108 | Bibliotecas sugeridas (não obrigatórias): 109 | 110 | - `github.com/rabbitmq/amqp091-go` 111 | - `encoding/json` 112 | - `net/http` 113 | 114 | --- 115 | 116 | ### 3️⃣ API (NestJS + MongoDB) 117 | 118 | A API em **NestJS** será o núcleo do sistema, responsável por: 119 | 120 | - Receber e armazenar os dados de clima; 121 | - Expor endpoints para consumo pelo frontend; 122 | - Orquestrar ou acionar a camada de IA; 123 | - Gerenciar usuários. 124 | 125 | #### a) Dados de clima 126 | 127 | Responsabilidades sugeridas: 128 | 129 | - Receber registros vindos do worker Go; 130 | - Armazenar em uma coleção no MongoDB (ex.: `weather_logs`); 131 | - Expor endpoints, como (exemplos): 132 | - `GET /api/weather/logs` — listar registros climáticos; 133 | - `GET /api/weather/export.csv` — exportar CSV; 134 | - `GET /api/weather/export.xlsx` — exportar XLSX; 135 | - `GET ou POST /api/weather/insights` — gerar e/ou retornar insights de IA. 136 | 137 | Os **insights de IA** podem ser: 138 | 139 | - Gerados automaticamente quando novos dados são inseridos; 140 | - Calculados sob demanda (quando o frontend solicitar); 141 | - Atualizados de forma agendada. 142 | 143 | > 💡 O importante é que o sistema seja capaz de **usar os dados históricos de clima** para produzir informações mais ricas, não apenas listar valores crus. 144 | 145 | --- 146 | 147 | #### b) Usuários 148 | 149 | - Implementar um **CRUD completo de usuários** (ex.: `/api/users`); 150 | - Implementar autenticação (JWT ou similar); 151 | - Criar um **usuário padrão** automaticamente na inicialização (ex.: `admin@example.com / 123456` — valores podem ser configuráveis via `.env`). 152 | 153 | --- 154 | 155 | #### c) Integração com API pública (opcional) 156 | 157 | Como parte opcional do desafio, implemente uma funcionalidade que consuma uma **API pública com paginação**, por exemplo: 158 | 159 | - [PokéAPI](https://pokeapi.co/) — listagem de Pokémons + detalhe de um Pokémon; 160 | - [SWAPI](https://swapi.dev/) — listagem de personagens, planetas ou naves + detalhe. 161 | 162 | Sugestão de funcionalidades (opcionais): 163 | 164 | - Endpoint no backend que consome a API externa — o frontend não chama a API pública diretamente; 165 | - Paginação simples; 166 | - Endpoint de detalhe de um item (ex.: Pokémon, personagem, planeta). 167 | 168 | > 🌍 Tanto o nome dos endpoints quanto o desenho das rotas ficam **totalmente a seu critério**. 169 | 170 | --- 171 | 172 | ## 🖥️ Frontend (React + Vite + Tailwind + shadcn/ui) 173 | 174 | A aplicação frontend deve ser construída com **React + Vite**, estilizada com **Tailwind** e utilizando componentes do **shadcn/ui**. 175 | 176 | Ela deve ter, no mínimo, **essas áreas de funcionalidade**: 177 | 178 | --- 179 | 180 | ### 🌦️ 1. Dashboard de Clima 181 | 182 | O Dashboard será a **página principal** do sistema, exibindo: 183 | 184 | - **Dados reais de clima** da sua cidade/localização, obtidos via pipeline Python → Go → NestJS → MongoDB; 185 | - **Insights de IA** gerados a partir desses dados. 186 | 187 | A forma de exibir essas informações é **livre**. 188 | 189 | Você pode, por exemplo, incluir: 190 | 191 | - **Cards principais** (exemplos): 192 | - Temperatura atual 193 | - Umidade atual 194 | - Velocidade do vento 195 | - Condição (ensolarado, nublado, chuvoso, etc.) 196 | 197 | - **Gráficos** (exemplos): 198 | - Temperatura ao longo do tempo; 199 | - Probabilidade de chuva ao longo do tempo; 200 | 201 | - **Tabela de registros** (exemplo): 202 | - Data/hora 203 | - Local 204 | - Condição 205 | - Temperatura 206 | - Umidade 207 | - Botões para exportar **CSV/XLSX** (integração com os endpoints do backend). 208 | 209 | - **Insights de IA** (forma livre), como: 210 | - Texto explicativo (“Alta chance de chuva nas próximas horas”); 211 | - Cards com alertas (“Calor extremo”, “Clima agradável”); 212 | - Gráficos ou visualizações adicionais. 213 | 214 | > 💡 Tudo acima são **exemplos ilustrativos**. 215 | > O requisito é: o Dashboard deve **mostrar os dados de clima da região + insights de IA**, mas você decide **como** isso será exibido (layout, tipos de gráfico, componentes etc.). 216 | 217 | --- 218 | 219 | ### 🌐 2. Página opcional – API pública paginada 220 | 221 | Uma página (por exemplo, `/explorar`) consumindo a funcionalidade opcional do backend que integra com uma API pública paginada. 222 | 223 | Exemplos de UX (apenas sugestões): 224 | 225 | - Lista de Pokémons com paginação + página de detalhes de um Pokémon; 226 | - Lista de personagens de Star Wars com paginação + detalhes de um personagem. 227 | 228 | --- 229 | 230 | ### 👤 3. Usuários 231 | 232 | Requisitos para a parte de usuários: 233 | 234 | - Tela de **login**; 235 | - Rotas protegidas (somente usuário autenticado acessa o Dashboard); 236 | - CRUD de usuários (listar, criar, editar, remover); 237 | - Uso de componentes do **shadcn/ui** (Button, Input, Table, Dialog, Toast, etc.); 238 | - Feedback visual adequado (loading, erro, sucesso). 239 | 240 | --- 241 | 242 | ## 📁 Exportação de dados 243 | 244 | - O backend deve expor endpoints para exportar dados de clima em **CSV** e **XLSX**; 245 | - O frontend deve oferecer botões no Dashboard para fazer o download desses arquivos. 246 | 247 | --- 248 | 249 | ## 💡 Ideias de insights (para `/api/weather/insights` ou similar) 250 | 251 | A forma de aplicar IA é livre. Algumas ideias possíveis: 252 | 253 | - Cálculo de média de temperatura e umidade em determinados períodos; 254 | - Detecção de tendência (temperaturas subindo ou caindo); 255 | - Pontuação de conforto climático (0–100); 256 | - Classificação do dia: “frio”, “quente”, “agradável”, “chuvoso”; 257 | - Alertas: “Alta chance de chuva”, “Calor extremo”, “Frio intenso”; 258 | - Geração de resumos em texto (ex.: “Nos últimos 3 dias, a temperatura média foi de 28°C, com alta umidade e tendência de chuva no fim da tarde.”). 259 | 260 | > 🔍 Os exemplos acima são **sugestões inspiracionais**. 261 | > O que será implementado (e em qual serviço) fica a seu critério, desde que seja **coerente com os dados de clima**. 262 | 263 | --- 264 | 265 | ## 🧠 Critérios de avaliação 266 | 267 | - **Funcionalidade completa:** pipeline Python → Message Broker → Go → NestJS → MongoDB → Frontend; 268 | - **Clareza de arquitetura:** organização de pastas, camadas e responsabilidades; 269 | - **Qualidade de código:** tipagem, legibilidade, padrões adotados; 270 | - **Integração entre serviços:** comunicação estável e bem tratada; 271 | - **Boas práticas:** validação, tratamento de erros, logs, eslint/prettier; 272 | - **UX:** experiência de uso do Dashboard e das telas; 273 | - **Criatividade:** na forma de mostrar dados e insights; 274 | - **Documentação:** README claro, com passos de execução e configuração; 275 | - **Uso correto do Docker Compose** para subir tudo. 276 | 277 | **Bônus (não obrigatório):** 278 | 279 | - Logs detalhados por serviço; 280 | - CI (lint/test) configurado; 281 | - Dashboard com filtros, múltiplos tipos de gráfico; 282 | - Deploy em ambiente gratuito (Railway, Render, etc.); 283 | - Testes automatizados (unitários e/ou e2e). 284 | 285 | --- 286 | 287 | ## ⚠️ Regras 288 | 289 | - Respeitar termos de uso das APIs utilizadas (Open-Meteo/OpenWeather, PokéAPI, SWAPI, etc.); 290 | - Não coletar ou armazenar dados pessoais sensíveis; 291 | - Usar intervalos razoáveis para chamadas às APIs externas; 292 | - Focar em **integração, clareza e coesão**, não apenas em adicionar complexidade; 293 | - Você é livre para: 294 | - Renomear endpoints; 295 | - Alterar nomes de coleções; 296 | - Mudar estruturas de diretórios; 297 | - Escolher bibliotecas auxiliares — desde que a proposta do desafio seja atendida. 298 | 299 | --- 300 | 301 | ## 📹 Vídeo obrigatório 302 | 303 | Grave um vídeo de **até 5 minutos** explicando: 304 | 305 | - Arquitetura geral da aplicação; 306 | - Pipeline de dados (Python → Message Broker → Go → NestJS → Frontend); 307 | - Como os insights de IA são gerados e exibidos; 308 | - Principais decisões técnicas; 309 | - Demonstração rápida da aplicação rodando via Docker Compose. 310 | 311 | O vídeo deve ser enviado via: 312 | 313 | - **YouTube (não listado)**. 314 | 315 | Inclua o link no README e/ou na descrição do Pull Request. 316 | 317 | --- 318 | 319 | ## 🧪 Entrega 320 | 321 | A entrega deve ser feita via **Pull Request**, em uma **branch com o seu nome completo**, por exemplo: 322 | 323 | - `joao-silva` 324 | - `maria-fernanda-souza` 325 | 326 | O Pull Request deve conter: 327 | 328 | - Código do **backend (NestJS)**; 329 | - Código do **frontend (Vite)**; 330 | - Código **Python** (coleta de clima); 331 | - Código **Go** (worker da fila); 332 | - `docker-compose.yml` com todos os serviços (API, frontend, banco, Message Broker, etc.); 333 | - Arquivo `.env.example` com todas as variáveis necessárias; 334 | - Link do vídeo explicativo (YouTube não listado); 335 | - README com: 336 | - Como rodar tudo via Docker Compose; 337 | - Como rodar o serviço Python; 338 | - Como rodar o worker Go; 339 | - URLs principais (API, frontend, Swagger, etc.); 340 | - Usuário padrão (login/senha) para acesso inicial. 341 | 342 | --- 343 | 344 | ## ✅ Checklist rápido 345 | 346 | - [ ] Python coleta dados de clima (Open-Meteo ou OpenWeather) 347 | - [ ] Python envia dados para a fila 348 | - [ ] Worker Go consome a fila e envia para a API NestJS 349 | - [ ] API NestJS: 350 | - [ ] Armazena logs de clima em MongoDB 351 | - [ ] Exponde endpoints para listar dados 352 | - [ ] Gera/retorna insights de IA (endpoint próprio) 353 | - [ ] Exporta dados em CSV/XLSX 354 | - [ ] Implementa CRUD de usuários + autenticação 355 | - [ ] (Opcional) Integração com API pública paginada 356 | - [ ] Frontend React + Vite + Tailwind + shadcn/ui: 357 | - [ ] Dashboard de clima com dados reais 358 | - [ ] Exibição de insights de IA 359 | - [ ] CRUD de usuários + login 360 | - [ ] (Opcional) Página consumindo API pública paginada 361 | - [ ] Docker Compose sobe todos os serviços 362 | - [ ] Código em TypeScript (backend e frontend) 363 | - [ ] Vídeo explicativo (máx. 5 minutos) 364 | - [ ] Pull Request via branch com seu nome completo 365 | - [ ] README completo com instruções de execução 366 | - [ ] Logs e tratamento de erros básicos em cada serviço 367 | 368 | --- 369 | 370 | Boa sorte! 🚀 371 | Mostre sua capacidade de integrar múltiplas linguagens e serviços em uma aplicação moderna, escalável e inteligente — unindo **engenharia de dados**, **backend**, **frontend** e **IA aplicada**. 372 | --------------------------------------------------------------------------------