'required|integer', 'name' => 'required|min_length[3]|max_length[150]', 'type' => 'required|in_list[mysql,postgresql,mongodb,rest_api,csv]', 'status' => 'permit_empty|in_list[untested,connected,failed]', 'created_by' => 'required|integer', ]; protected $allowCallbacks = true; protected $beforeInsert = ['encryptSensitiveFields']; protected $beforeUpdate = ['encryptSensitiveFields']; protected $afterFind = ['decryptSensitiveFields']; public function forWorkspace(int $workspaceId): array { return $this->where('workspace_id', $workspaceId) ->orderBy('id', 'DESC') ->findAll(); } protected function encryptSensitiveFields(array $data): array { if (! isset($data['data']) || ! is_array($data['data'])) { return $data; } $encrypter = new Encrypter(); foreach (['password', 'api_auth_value'] as $field) { if (! array_key_exists($field, $data['data'])) { continue; } $value = trim((string) $data['data'][$field]); if ($value === '') { continue; } $data['data'][$field] = $encrypter->encrypt($value); } return $data; } protected function decryptSensitiveFields(array $data): array { if (! isset($data['data'])) { return $data; } $decryptRecord = static function (array $row): array { $encrypter = new Encrypter(); foreach (['password', 'api_auth_value'] as $field) { if (! isset($row[$field]) || $row[$field] === null || $row[$field] === '') { continue; } $row[$field] = $encrypter->decrypt((string) $row[$field]); } return $row; }; if (($data['singleton'] ?? false) === true) { $data['data'] = is_array($data['data']) ? $decryptRecord($data['data']) : $data['data']; return $data; } if (is_array($data['data'])) { foreach ($data['data'] as $key => $row) { if (is_array($row)) { $data['data'][$key] = $decryptRecord($row); } } } return $data; } }