Estou persistindo em mais de uma tabela, e se houver algum erro eu quero que de um rollback em tudo.
em Java com Spring consigo fazer isso de forma simples apenas anotando o método da service @Transact..., como poderia fazer isso com mysql node, li a documentação mas ficou meio confuso, esse é meu projeto que fiz acompanhando o curso usando a mesma estrutura, como poderia ser feito com transações nessa estrutura ?
// queries.js
const conexao = require('./conexao')
const executaQuery = (query, parametros = '') => {
return new Promise((resolve, reject) => {
conexao.query(query, parametros, (erro, resultados, campos) => {
if (erro) {
reject(erro)
} else {
resolve(resultados)
}
})
})
}
module.exports = executaQuery
// post
const query = require('../infra/database/queries')
class PostRepository {
adiciona(post) {
const sql = 'INSERT INTO post SET ?'
return query(sql, post)
}
lista() {
const sql = 'SELECT * FROM post';
return query(sql)
}
}
module.exports = new PostRepository()
e por fim onde eu gostaria de o método ficar em uma trancação, " adiciona post", também adiciono as categorias mas se houver algum erro, quero dar rollback, pois já havia salvo o post, tem como me mostrar o caminho das pedras?
const PostRepository = require('../repositories/postRepository')
const AutorService = require('../services/autorService')
const Campo = require('../model/campo')
const PostCategoriasService = require('../services/PostCategoriasService')
class PostService {
// transactional
async adiciona(post) {
// inicia transacao
const autor = await AutorService.buscarPorId(parseInt(post.autorId))
if (!autor) return Promise.reject(new Campo('autorId', 'id do autor inválido'))
if (!post.categoriasId.length) return Promise.reject(new Campo('categoriasId', 'nenhuma categoria selecionada'))
const categoriasId = post.categoriasId
delete post.categoriasId
post.criadoEm = new Date()
const resultadosPost = await PostRepository.adiciona(post) // 1° insert
const id = resultados.insertId
const resultadosCtg = await PostCategoriasService.adicianAll(id, categoriasId) // 2° insert
// houve algum erro, rollback
// não houve, commit
return { ...post, id }
}
lista() {
return PostRepository.lista()
}
}
module.exports = new PostService()