Untitled
const express = require('express'); const path = require('path'); const fs = require('fs').promises; const app = express(); app.use(express.json()); const ARQUIVO = 'talker.json'; const HTTP_OK_STATUS = 200; const PORT = process.env.PORT || '3001'; const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; const dataRegex = /^\d{2}\/\d{2}\/\d{4}$/; // primeira parte requisito 5 const tokenValidator = (request, response, next) => { const { authorization } = request.headers; if (!authorization) { return response.status(401).json({ message: 'Token não encontrado' }); } if (authorization.length !== 16 || typeof authorization !== 'string') { return response.status(401).json({ message: 'Token inválido' }); } next(); }; // requisito 8 app.get('/talker/search', tokenValidator, async (request, response) => { const { q } = request.query; const data = await fs.readFile(path.join(__dirname, ARQUIVO), 'utf-8'); const talkers = JSON.parse(data); const filteredTalkers = talkers.filter((talker) => talker.name.includes(q)); if (!filteredTalkers) return response.status(200).json([]); return response.status(200).json(filteredTalkers); }); // não remova esse endpoint, e para o avaliador funcionar app.get('/', (_request, response) => { response.status(HTTP_OK_STATUS).send(); }); // requisito 1 app.get('/talker', async (_request, response) => { const data = await fs.readFile(path.join(__dirname, ARQUIVO), 'utf-8'); const talkers = JSON.parse(data); if (!talkers) return response.status(200).json([]); return response.status(200).json(talkers); }); // requisito 2 app.get('/talker/:id', async (request, response) => { const { id } = request.params; const data = await fs.readFile(path.join(__dirname, ARQUIVO), 'utf-8'); const talkers = JSON.parse(data); if (!talkers) response.status(200).json([]); const talker = talkers.find((talk) => talk.id === Number(id)); if (!talker) { response.status(404).json({ message: 'Pessoa palestrante não encontrada' }); } return response.status(200).json(talker); }); // requisito 3 e 4 const tokenGen = () => { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let token = ''; for (let i = 0; i < 16; i += 1) { token += characters.charAt(Math.floor(Math.random() * characters.length)); } return token; }; app.post('/login', (request, response) => { const { email, password } = request.body; if (!email) { return response.status(400).json({ message: 'O campo "email" é obrigatório' }); } if (!emailRegex.test(email)) { return response.status(400) .json({ message: 'O "email" deve ter o formato "email@email.com"' }); } if (!password) { return response.status(400).json({ message: 'O campo "password" é obrigatório' }); } if (password.length < 6) { return response.status(400).json({ message: 'O "password" deve ter pelo menos 6 caracteres' }); } return response.status(200).json({ token: tokenGen() }); }); // segunda parte do requisito 5 const validateName = (name) => { if (!name) { return { message: 'O campo "name" é obrigatório' }; } if (name.length < 3) { return { message: 'O "name" deve ter pelo menos 3 caracteres' }; } return {}; }; const validateAge = (age) => { if (!age) { return { message: 'O campo "age" é obrigatório' }; } if (age < 18 || typeof age !== 'number' || !Number.isInteger(age)) { return { message: 'O campo "age" deve ser um número inteiro igual ou maior que 18' }; } return {}; }; const validateRate = (rate) => { if (typeof rate === 'undefined') { return { message: 'O campo "rate" é obrigatório' }; } if (rate < 1 || rate > 5 || !Number.isInteger(rate)) { return { message: 'O campo "rate" deve ser um número inteiro entre 1 e 5' }; } return {}; }; const validateTalk = (talk) => { if (!talk) { return { message: 'O campo "talk" é obrigatório' }; } if (!talk.watchedAt) { return { message: 'O campo "watchedAt" é obrigatório', }; } if (!dataRegex.test(talk.watchedAt)) { return { message: 'O campo "watchedAt" deve ter o formato "dd/mm/aaaa"' }; } if (validateRate(talk.rate)) { return validateRate(talk.rate); } }; const validateTalker = (talker) => { const name = validateName(talker.name); const age = validateAge(talker.age); const talk = validateTalk(talker.talk); if (name.message) return name; if (age.message) return age; if (talk.message) return talk; return {}; }; app.post('/talker', tokenValidator, async (request, response) => { const data = await fs.readFile(path.join(__dirname, ARQUIVO), 'utf-8'); const talkers = JSON.parse(data); const { name, age, talk } = request.body; const talker = { name, age, talk, id: talkers.length + 1 }; const validate = validateTalker(talker); if (validate.message) return response.status(400).json({ message: validate.message }); talkers.push(talker); await fs.writeFile(path.join(__dirname, ARQUIVO), JSON.stringify(talkers)); return response.status(201).json(talker); }); // requisito 6 app.put('/talker/:id', tokenValidator, async (request, response) => { const { id } = request.params; const data = await fs.readFile(path.join(__dirname, ARQUIVO), 'utf-8'); const talkers = JSON.parse(data); const { name, age, talk } = request.body; const talker = { name, age, talk, id: Number(id) }; const validate = validateTalker(talker); if (validate.message) return response.status(400).json({ message: validate.message }); const index = talkers.findIndex((talkId) => talkId.id === Number(id)); if (index === -1) { return response.status(404).json({ message: 'Pessoa palestrante não encontrada' }); } talkers[index] = talker; await fs.writeFile(path.join(__dirname, ARQUIVO), JSON.stringify(talkers)); return response.status(200).json(talker); }); // requisito 7 app.delete('/talker/:id', tokenValidator, async (request, response) => { const { id } = request.params; const data = await fs.readFile(path.join(__dirname, ARQUIVO), 'utf-8'); const talkers = JSON.parse(data); const index = talkers.findIndex((talkId) => talkId.id === Number(id)); talkers.splice(index, 1); await fs.writeFile(path.join(__dirname, ARQUIVO), JSON.stringify(talkers)); return response.status(204).json({ message: 'Pessoa palestrante deletada com sucesso' }); }); app.listen(PORT, () => { console.log('Online'); });
Leave a Comment