package db
import (
"encoding/json"
"fmt"
"gorm.io/datatypes"
)
type EncryptedJSON[T any] datatypes.JSON
func (j *EncryptedJSON[T]) EncryptedData() (EncryptedData, error) {
var data EncryptedData
err := json.Unmarshal(*j, &data)
if err != nil {
return EncryptedData{}, fmt.Errorf("failed to unmarshal encrypted json: %w", err)
}
return data, nil
}
func (j *EncryptedJSON[T]) Decrypt(decryptor Decryptor) (T, error) {
var out T
data, err := j.EncryptedData()
if err != nil {
return out, fmt.Errorf("failed to obtain encrypted data: %w", err)
}
b, err := decryptor.Decrypt(data)
if err != nil {
return out, fmt.Errorf("failed to decrypt encrypted json: %w", err)
}
err = json.Unmarshal(b, &out)
if err != nil {
return out, fmt.Errorf("failed to unmarshal encrypted json: %w", err)
}
return out, nil
}
func EncryptJSON[T any](encryptor Encryptor, data T) (EncryptedJSON[T], error) {
b, err := json.Marshal(data)
if err != nil {
return nil, fmt.Errorf("failed to marshal data into json: %w", err)
}
encrypted, err := encryptor.Encrypt(b)
if err != nil {
return nil, fmt.Errorf("failed to encrypt json: %w", err)
}
return NewEncryptedJSON[T](encrypted)
}
func NewEncryptedJSON[T any](data EncryptedData) (EncryptedJSON[T], error) {
b, err := json.Marshal(data)
if err != nil {
return nil, fmt.Errorf("failed to serialize encrypted data into json: %w", err)
}
return b, nil
}