O planeta Terra está à beira de um colapso devido às queimadas e ao aquecimento global. Em uma tentativa desesperada de garantir a sobrevivência da humanidade, cientistas ao redor do mundo começaram a pesquisar planetas em outras galáxias que possam sustentar a vida humana. Sua missão é desenvolver um sistema de cadastro desses planetas planetas à habitação. O sistema permitirá que novos planetas sejam cadastrados, listados, atualizados e excluídos. Cada planeta deverá ser avaliado com base em fatores como temperatura média, presença de água, e composição atmosférica.
O sistema deve atender aos seguintes requisitos:
- Cadastrar Planetas:
- Os planetas devem ser cadastrados com as seguintes informações: nome, temperatura média, presença de água (true/false) e composição atmosférica.
- Validação: Nome do planeta e temperatura são campos obrigatórios e a presença de água deve ser indicada como "sim" ou "não".
- Listar Planetas:
- Deve ser possível listar todos os planetas já cadastrados no sistema.
- Buscar Planeta Específico:
- Deve ser possível buscar um planeta específico pelo seu ID.
- Atualizar Planeta:
- O sistema deve permitir atualizar as informações de um planeta específico, exceto o ID.
- Validação: Mesmas regras de cadastro (nome e temperatura obrigatórios e presença de água como "sim" ou "não").
- Excluir Planeta:
- Deve ser possível excluir um planeta específico do sistema, buscando-o pelo ID.
-
Crie um Projeto Node.js:
- Inicie um projeto Node.js com o comando
npm init
.
- Inicie um projeto Node.js com o comando
-
Crie o arquivo
.gitignore
com o seguinte conteúdo:node_modules .env
-
Vincule o Projeto a um Repositório no GitHub:
-
Instale as dependências
express
,nodemon
edotenv
com o comando:npm install express nodemon dotenv
-
Crie o arquivo
.env
com a seguinte variável de ambiente:PORT=4000
-
Crie a Estrutura de Pastas do Projeto:
projeto ├── node_modules ├── src │ ├── routes │ │ └── index.routes.js │ └── server.js ├── .env ├── .gitignore ├── package-lock.json ├── README.md └── package.json
-
Atualize o arquivo
package.json
com o seguinte script:"type": "module", "scripts": { "dev": "nodemon src/server.js" }
-
Crie o Servidor Express no arquivo
server.js
:import express from "express"; import { config } from "dotenv"; config(); const serverPort = process.env.PORT || 3000; const app = express(); app.use(express.json()); app.listen(serverPort, () => { console.log(`⚡ Server started on http://localhost:${serverPort}`); });
-
Faça o Teste do Servidor:
npm run dev
-
Crie o Arquivo de Rotas
index.routes.js
na pastaroutes
:import { Router } from "express"; const routes = Router(); // Rota raiz para teste routes.get("/", (req, res) => { return res.status(200).json({ message: "Vai Corinthians!" }); }); export default routes;
-
Atualize o Arquivo
server.js
para utilizar as rotas:import express from "express"; import { config } from "dotenv"; import routes from "./routes/index.routes.js"; config(); const serverPort = process.env.PORT || 3000; const app = express(); app.use(express.json()); app.use(routes); app.listen(serverPort, () => { console.log(`⚡ Server started on http://localhost:${serverPort}`); });
-
Crie o arquivo
planetas.routes.js
na pastaroutes
com as rotas para planetas:import { Router } from "express"; const planetasRoutes = Router(); // Array com planetas pré-cadastrados let planetas = [ { id: Math.floor(Math.random() * 1000000), nome: "Krypton", temperatura: -30.0, agua: false, atm: ["Kriptonita", "Oxigênio", "Nitrogênio"], }, { id: Math.floor(Math.random() * 1000000), nome: "Xandar", temperatura: 25.0, agua: true, atm: ["Nitrogênio", "Oxigênio", "Hidrogênio"], }, { id: Math.floor(Math.random() * 1000000), nome: "Asgard", temperatura: 5.0, agua: false, atm: ["Magia", "Energia Cósmica", "Oxigênio"], }, { id: Math.floor(Math.random() * 1000000), nome: "Apokolips", temperatura: 50.0, agua: false, atm: ["Fumaça", "Dióxido de Enxofre", "Monóxido de Carbono"], }, { id: Math.floor(Math.random() * 1000000), nome: "Knowhere", temperatura: -10.0, agua: true, atm: ["Hidrogênio", "Nitrogênio", "Partículas Cósmicas"], }, ]; // Rota para listar todos os planetas planetasRoutes.get("/", (req, res) => { return res.status(200).json(planetas); }); // Rota para cadastrar um novo planeta planetasRoutes.post("/", (req, res) => { const { nome, temperatura, agua, atm } = req.body; // Validação dos campos obrigatórios if (!nome || !temperatura || !agua) { return res.status(400).json({ message: "Os campos nome, temperatura e água são obrigatórios!", }); } // Validação de existência de água if (agua != "sim" && agua != "não") { return res.status(400).send({ message: "Digite 'sim' ou 'não'!", }); } // Criação de um novo planeta const novoPlaneta = { id: Math.floor(Math.random() * 1000000), nome, temperatura, agua, atm: atm || [], // Valor padrão caso atm não seja enviado }; // Adiciona o novo planeta ao array de planetas planetas.push(novoPlaneta); return res.status(201).json({ message: "Planeta cadastrado com sucesso!", novoPlaneta, }); }); // Rota para buscar um planeta pelo id planetasRoutes.get("/:id", (req, res) => { const { id } = req.params; // Busca um planeta pelo id no array de planetas const planeta = planetas.find((planet) => planet.id == id); // Verifica se o planeta foi encontrado if (!planeta) { return res .status(404) .json({ message: `Planeta com id ${id} não encontrado!` }); } return res.status(200).json(planeta); }); // Rota para atualizar um planeta pelo id planetasRoutes.put("/:id", (req, res) => { const { id } = req.params; const { nome, temperatura, agua, atm } = req.body; // Busca um planeta pelo id no array de planetas const planeta = planetas.find((p) => p.id == id); // Validação dos campos obrigatórios if (!nome || !temperatura || !agua) { return res.status(400).json({ message: "Os campos nome, temperatura e água são obrigatórios!", }); } // Validação de existência de água if (agua != "sim" && agua != "não") { return res.status(400).send({ message: "Digite 'sim' ou 'não'!", }); } planeta.nome = nome; planeta.temperatura = temperatura; planeta.agua = agua; planeta.atm = atm || []; return res.status(200).json({ message: "Planeta atualizado com sucesso!", planeta, }); }); // Rota para deletar um planeta planetasRoutes.delete("/:id", (req, res) => { const { id } = req.params; // Busca um planeta pelo id no array de planetas const planeta = planetas.find((planet) => planet.id == id); // Verifica se o planeta foi encontrado if (!planeta) { return res .status(404) .json({ message: `Planeta com id ${id} não encontrado!` }); } // Remove o planeta do array de planetas planetas = planetas.filter((planet) => planet.id != id); return res.status(200).json({ message: "Planeta removido com sucesso!", planeta, }); }); export default planetasRoutes;
- Atualize o arquivo
index.routes.js
para utilizar as rotas de planetas:
import { Router } from "express"; // Lista de importação das rotas do projeto import planetasRoutes from "./planetas.routes.js"; const routes = Router(); // Rota raiz para teste routes.get("/", (req, res) => { return res.status(200).json({ message: "Vai Corinthians!" }); }); // Lista de uso das rotas do projeto routes.use("/planetas", planetasRoutes); export default routes;
- Atualize o arquivo