ledgerone_backend/src/common/raw-payload-encryption.service.ts

38 lines
1.1 KiB
TypeScript

import { Injectable } from "@nestjs/common";
import { Prisma } from "@prisma/client";
import { EncryptionService } from "./encryption.service";
type EncryptedRawPayload = {
encrypted: true;
version: 1;
ciphertext: string;
};
@Injectable()
export class RawPayloadEncryptionService {
constructor(private readonly encryption: EncryptionService) {}
encrypt(payload: unknown): Prisma.InputJsonValue {
return {
encrypted: true,
version: 1,
ciphertext: this.encryption.encrypt(JSON.stringify(payload ?? null)),
} satisfies EncryptedRawPayload as unknown as Prisma.InputJsonValue;
}
decrypt<T = unknown>(payload: unknown): T {
if (!this.isEncryptedPayload(payload)) return payload as T;
return JSON.parse(this.encryption.decrypt(payload.ciphertext)) as T;
}
private isEncryptedPayload(payload: unknown): payload is EncryptedRawPayload {
return Boolean(
payload &&
typeof payload === "object" &&
(payload as { encrypted?: unknown }).encrypted === true &&
(payload as { version?: unknown }).version === 1 &&
typeof (payload as { ciphertext?: unknown }).ciphertext === "string",
);
}
}