38 lines
1.1 KiB
TypeScript
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",
|
|
);
|
|
}
|
|
}
|