-
Para implementar o registro de histórico de alterações, você pode criar uma tabela de histórico que terá um relacionamento direto com a tabela principal (neste caso, a tabela de carros). Sempre que uma alteração for feita, você adicionará um registro no histórico.
-
As tecnologias que você já está usando (Next, Nest, Prisma, PostgreSQL) são suficientes para alcançar esse objetivo. Você não precisa de nenhuma tecnologia adicional.
-
Não há necessidade de um framework ou biblioteca específica para isso. Você pode conseguir isso com as tecnologias que já está usando.
-
Para tratar essas alterações e mostrar nos detalhes, você pode fazer uma lógica manual para verificar quais são as alterações. Por exemplo, antes de fazer a atualização, você pode comparar os dados antigos com os novos e registrar as diferenças na tabela de histórico. Aqui está um exemplo de como você pode fazer isso com o Prisma:
async update(id: number, data: UpdateCarDto, userId: number) {
// Get the old data
const oldData = await this.prisma.cars.findUnique({ where: { id } });
// Compare the old data with the new one and create a description of the changes
let description = '';
if (oldData.plate !== data.plate) {
description += `ALTEROU A PLACA DE ${oldData.plate} PARA ${data.plate} `;
}
if (oldData.branch !== data.branch) {
description += `E FILIAL DE ${oldData.branch} PARA ${data.branch}`;
}
// Update the car
await this.prisma.cars.update({
where: { id },
data,
});
// Add a record to the history
await this.prisma.history.create({
data: {
carId: id,
userId,
details: description,
ip: '192.168.0.125', // You should get the real IP here
},
});
}
Vc até consegue ir pro caminho de criar algo genérico no Prisma com os Middlewares, mas pode dar um pouco de dor de cabeça. No entanto, acho que vale uma POC (Proof of Concept) pra vc experimentar o Middleware do Prisma e ver se resolveria pra vc
Referência: https://www.prisma.io/docs/concepts/components/prisma-client/middleware
Colocando o middleware em um service do Nest, ficaria algo assim:
import { Injectable } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Injectable()
export class AuditService {
constructor(private prisma: PrismaService) {
this.prisma.$use(async (params, next) => {
if (params.model !== 'Car' || params.action !== 'update') {
return next(params);
}
const oldData = await this.prisma.car.findUnique({ where: { id: params.args.where.id } });
const result = await next(params);
let description = '';
if (oldData.plate !== result.plate) {
description += `ALTEROU A PLACA DE ${oldData.plate} PARA ${result.plate} `;
}
if (oldData.branch !== result.branch) {
description += `E FILIAL DE ${oldData.branch} PARA ${result.branch}`;
}
await this.prisma.history.create({
data: {
carId: params.args.where.id,
userId: userId, // You should get the real user ID here
details: description,
ip: '192.168.0.125', // You should get the real IP here
},
});
return result;
});
}
}
OBS: não testei nenhum código, então é mais pra ter uma ideia de caminho