Untitled
unknown
plain_text
2 years ago
6.5 kB
20
Indexable
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');
});
Editor is loading...
Leave a Comment