Untitled

 avatar
unknown
plain_text
a year ago
6.5 kB
16
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');
});
Leave a Comment