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(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", ); } }