Autoestudo Click
O que é Node JS? Link
Javascript: Fetch DELETE and PUT requests Link
Use JavaScript to execute an API DELETE request Link
Como sair do zero em Node.js em apenas uma aula Link
Projeto Individual (Parte 2) - Conectando Banco de Dados e Servidor + Arquitetura MVC Link

https://www.canva.com/design/DAGkfPt7N2A/Rzqtyum2SB77RoAACs9aZQ/view

Tutorial Passo a passo

.env

DB_HOST=aws-0-us-east-2.pooler.supabase.com
DB_USER=postgres.bneyjtztnmlmanmigjqe
DB_PASSWORD=BthvPWst9Ub8IbtI
DB_NAME=postgres
DB_PORT=6543

src/index.js

require('dotenv').config();
const express = require('express');
const app = express();
const categoriaRoutes = require('./routes/categoriaRoutes');

app.use(express.json());
app.use('/categorias', categoriaRoutes);

app.listen(3000, () => console.log('Servidor rodando na porta 3000'));

src/database.js

const { Pool } = require('pg');

const pool = new Pool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  port: process.env.DB_PORT,
});

module.exports = pool;

src/models/Categoria.js

class Categoria {
  constructor({ id = null, nome, descricao }) {
    this.id = id;
    this.nome = nome;
    this.descricao = descricao;
  }
}

module.exports = Categoria;

src/repositories/CategoriaRepository.js

const db = require('../database');
const Categoria = require('../models/Categoria');

class CategoriaRepository {
  async findAll() {
    const result = await db.query('SELECT * FROM categorias');
    return result.rows.map(row => new Categoria(row));
  }

  async findById(id) {
    const result = await db.query('SELECT * FROM categorias WHERE id = $1', [id]);
    if (result.rows.length === 0) return null;
    return new Categoria(result.rows[0]);
  }

  async create(categoria) {
    const { nome, descricao } = categoria;
    const result = await db.query(
      'INSERT INTO categorias (nome, descricao) VALUES ($1, $2) RETURNING *',
      [nome, descricao]
    );
    return new Categoria(result.rows[0]);
  }

  async update(id, categoria) {
    const { nome, descricao } = categoria;
    const result = await db.query(
      'UPDATE categorias SET nome = $1, descricao = $2 WHERE id = $3 RETURNING *',
      [nome, descricao, id]
    );
    return new Categoria(result.rows[0]);
  }

  async delete(id) {
    await db.query('DELETE FROM categorias WHERE id = $1', [id]);
  }
}

module.exports = new CategoriaRepository();

src/services/CategoriaService.js

const CategoriaRepository = require('../repositories/CategoriaRepository');

class CategoriaService {
  getAll() {
    return CategoriaRepository.findAll();
  }

  getById(id) {
    return CategoriaRepository.findById(id);
  }

  create(data) {
    return CategoriaRepository.create(data);
  }

  update(id, data) {
    return CategoriaRepository.update(id, data);
  }

  delete(id) {
    return CategoriaRepository.delete(id);
  }
}

module.exports = new CategoriaService();

src/controllers/CategoriaController.js

const CategoriaService = require('../services/CategoriaService');

module.exports = {
  async index(req, res) {
    const categorias = await CategoriaService.getAll();
    res.json(categorias);
  },

  async show(req, res) {
    const { id } = req.params;
    const categoria = await CategoriaService.getById(id);
    if (!categoria) return res.status(404).json({ error: 'Categoria não encontrada' });
    res.json(categoria);
  },

  async store(req, res) {
    const nova = await CategoriaService.create(req.body);
    res.status(201).json(nova);
  },

  async update(req, res) {
    const { id } = req.params;
    const atualizada = await CategoriaService.update(id, req.body);
    res.json(atualizada);
  },

  async delete(req, res) {
    const { id } = req.params;
    await CategoriaService.delete(id);
    res.status(204).send();
  }
};

src/routes/categoriaRoutes.js

const express = require('express');
const router = express.Router();
const CategoriaController = require('../controllers/CategoriaController');

router.get('/', CategoriaController.index);
router.get('/:id', CategoriaController.show);
router.post('/', CategoriaController.store);
router.put('/:id', CategoriaController.update);
router.delete('/:id', CategoriaController.delete);

module.exports = router;

rest.http