mirror of
https://github.com/coollabsio/coolify.git
synced 2026-06-13 19:09:50 +00:00
52 lines
1.4 KiB
PHP
52 lines
1.4 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Casts;
|
||
|
|
|
||
|
|
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
|
||
|
|
use Illuminate\Contracts\Encryption\DecryptException;
|
||
|
|
use Illuminate\Database\Eloquent\Model;
|
||
|
|
use Illuminate\Support\Facades\Crypt;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Stores an array as an encrypted JSON string at rest. Tolerates legacy
|
||
|
|
* plaintext JSON rows written before the column was encrypted, so existing
|
||
|
|
* snapshots keep decoding instead of throwing.
|
||
|
|
*
|
||
|
|
* @implements CastsAttributes<array<mixed>|null, array<mixed>|null>
|
||
|
|
*/
|
||
|
|
class EncryptedArrayCast implements CastsAttributes
|
||
|
|
{
|
||
|
|
/**
|
||
|
|
* @param array<string, mixed> $attributes
|
||
|
|
* @return array<mixed>|null
|
||
|
|
*/
|
||
|
|
public function get(Model $model, string $key, mixed $value, array $attributes): ?array
|
||
|
|
{
|
||
|
|
if ($value === null || $value === '') {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
$value = Crypt::decryptString($value);
|
||
|
|
} catch (DecryptException) {
|
||
|
|
// Legacy plaintext JSON written before this column was encrypted.
|
||
|
|
}
|
||
|
|
|
||
|
|
$decoded = json_decode((string) $value, true);
|
||
|
|
|
||
|
|
return is_array($decoded) ? $decoded : null;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param array<string, mixed> $attributes
|
||
|
|
*/
|
||
|
|
public function set(Model $model, string $key, mixed $value, array $attributes): ?string
|
||
|
|
{
|
||
|
|
if ($value === null) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
return Crypt::encryptString(json_encode($value, JSON_THROW_ON_ERROR));
|
||
|
|
}
|
||
|
|
}
|