Home Reference Source

src/posts/posts-dao.js

const db = require('../../database')
const { InternalServerError } = require('../erros')

const { promisify } = require('util')
const dbRun = promisify(db.run).bind(db)
const dbGet = promisify(db.get).bind(db)
const dbAll = promisify(db.all).bind(db)

module.exports = {
  async adiciona (post) {
    try {
      await dbRun('INSERT INTO posts (titulo, conteudo, autor) VALUES (?, ?, ?)', [
        post.titulo,
        post.conteudo,
        post.autor
      ])
    } catch (erro) {
      throw new InternalServerError('Erro ao adicionar o post!')
    }
  },

  async listarPorAutor (idAutor) {
    try {
      return await dbAll('SELECT id, titulo FROM posts WHERE autor = ?', [idAutor])
    } catch (erro) {
      throw new InternalServerError('Erro ao listar os posts!')
    }
  },

  async listarTodos () {
    try {
      return await dbAll('SELECT id, titulo, conteudo, autor FROM posts')
    } catch (erro) {
      throw new InternalServerError('Erro ao listar os posts!')
    }
  },

  async buscaPorId (id, idAutor) {
    try {
      let instrucoes = 'SELECT * FROM posts WHERE id = ?'
      const parametros = [id]

      idAutor = Number(idAutor)
      if (isNaN(idAutor) === false) {
        instrucoes = `${instrucoes} AND autor = ?`
        parametros.push(idAutor)
      }

      return await dbGet(instrucoes, parametros)
    } catch (erro) {
      throw new InternalServerError('Não foi possível encontrar o post!')
    }
  },

  async remover ({ id, autor }) {
    try {
      return await dbRun('DELETE FROM posts WHERE id = ? AND autor = ?', [id, autor])
    } catch (erro) {
      throw new InternalServerError('Erro ao tentar remover o post!')
    }
  }
}