SOS-RS / backend

Auxílio RS: Projetos de Resposta a Emergências por Chuvas e Alagamentos
https://sos-rs.com
MIT License
712 stars 306 forks source link

feat: add audit logging #99

Closed mvares closed 3 months ago

mvares commented 3 months ago
model Logs {
  id        String  @id @default(uuid())
  rowId     String
  tableName String
  userId    String?
  ip        String?

  old  Json
  new  Json
  diff Json

  createdAt DateTime @default(now())

  @@map("logs")
}

Este é o modelo de tabela no Prisma para registrar as diferenças em qualquer módulo e é reutilizável em todo o sistema.

Segue um exemplo de como utilizar o sistema de logs no módulo de abrigos (shelters):

await this.auditLoggerService.store({
  tableName: 'shelters',          // Nome da tabela onde ocorreu a mudança
  rowId: oldShelter.id,             // ID da linha afetada na tabela
  old: oldShelter,                     // Estado anterior do abrigo (em formato JSON)
  new: newShelter,                 // Novo estado do abrigo (em formato JSON)
});

PS: A parte de userId e IP só poderia ser obtidos atráves de uma session ativa (login)

mvares commented 3 months ago

Preciso de alguma review de iniciação pra eu começar a implementar nos módulos que terão os logs inicialmente

jeanbispo commented 3 months ago

Preciso de alguma review de iniciação pra eu começar a implementar nos módulos que terão os logs inicialmente

Faz mais sentido utilizar um middleware para interceptar as mudanças da ORM sem precisar indivdualizar isso.

prisma.$use(async (params, next) => {
  if (params.model == 'Post' && params.action == 'delete') {
    // Logic only runs for delete action and Post model
  }
  return next(params)
})

docs prisma

mvares commented 3 months ago

@jeanbispo, os middlewares do prisma estão obsoletos. Acho q vou ter que usar a alternativa do query no módulo mesmo

jeanbispo commented 3 months ago

@mgrithm existe o extends do client que faz a mesma coisa dos middlewares, acho que vale dar uma olhada, facilita o trabalho: https://www.prisma.io/docs/orm/prisma-client/client-extensions/query