Untitled

 avatar
unknown
plain_text
2 years ago
3.9 kB
4
Indexable
const express = require('express');
const fs = require('fs').promises;
const path = require('path');
const { validTalk, validRate } = require('./middlewares/validations');

const app = express();
app.use(express.json());

const HTTP_OK_STATUS = 200;
const PORT = process.env.PORT || '3001';
const NOT_FOUND_TOKEN = 401;

// não remova esse endpoint, e para o avaliador funcionar
app.get('/', (_request, response) => {
  response.status(HTTP_OK_STATUS).send();
});

const generateToken = () => {
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let token = '';

  for (let i = 0; i < 16; i += 1) {
    token += characters.charAt(Math.floor(Math.random() * characters.length));
  }

  return token;
};

const tokenValid = (req, res, next) => {
  const newToken = generateToken(); 
  if (!newToken) {
    return res.status(NOT_FOUND_TOKEN).json({ message: 'Token não encontrado' }); 
  }
  if (!tokenValid) {
    return res.status(NOT_FOUND_TOKEN).json({ message: 'Token inválido' }); 
  }
  
  next();
};

app.post('/talker', tokenValid, async (request, response) => {
  const { name, age, talk } = request.body;
  const talkers = await fs.readFile(path.join(__dirname, 'talker.json'), 'utf-8');
  const talkersJson = JSON.parse(talkers);

  if (!name) {
    return response.status(400).json({ message: 'O campo "name" é obrigatório' });
  }
  if (!age) {
    return response.status(400).json({ message: 'O campo "age" é obrigatório' });
  }
  if (!talk) {
    return response.status(400).json({ message: 'O campo "talk" é obrigatório' });
  }
  if (age < 18) {
    return response.status(400).json({ message: 'A pessoa palestrante deve ser maior de idade' });
  }
  if (talk.length < 30) {
    return response.status(400).json({ message: 'O campo "talk" deve ter pelo menos 30 caracteres' });
  }
  if (talkersJson.find((talker) => talker.name === name)) {
    return response.status(409).json({ message: 'Essa pessoa já foi cadastrada' });
};
  

  const newTalker = {
    name,
    age,
    talk,
    id: talkersJson.length + 1,
  };

  talkersJson.push(newTalker);
  await fs.writeFile(path.join(__dirname, 'talker.json'), JSON.stringify(talkersJson));

  return response.status(201).json(newTalker);
}

app.get('/talker', async (_request, response) => {
  const talkers = await fs.readFile(path.join(__dirname, 'talker.json'), 'utf-8');
  const talkersJson = JSON.parse(talkers);

  if (!talkersJson) return response.status(200).json([]);

  return response.status(200).json(talkersJson);
});

app.get('/talker/:id', async (request, response) => {
  const { id } = request.params;
  const talkers = await fs.readFile(path.join(__dirname, 'talker.json'), 'utf-8');
  const talkersJson = JSON.parse(talkers);

  if (!talkersJson) return response.status(200).json([]);
  const talkerFind = talkersJson.find((talker) => talker.id === +id);
  if (!talkerFind) {
    return response.status(404).json(
      { message: 'Pessoa palestrante não encontrada' },
    ); 
  }
  return response.status(200).json(talkerFind);
});

// requisito 4
app.post('/login', (request, response) => {
  const { email, password } = request.body;
  if (!email) {
    return response.status(400).json({ message: 'O campo "email" é obrigatório' });
  }
  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' });
  }
  const regexEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!regexEmail.test(email)) {
    return response.status(400).json({ message: 'O "email" deve ter o formato "email@email.com"' });
  }
  return response.status(200).json({ token: generateToken() });
});

// requisito 5


app.listen(PORT, () => {
  console.log('Online');
});
Editor is loading...
Leave a Comment