*/ protected $fillable = [ 'workspace_id', 'name', 'description', 'version_label', 'status', 'scope_jsonb', 'active_snapshot_id', 'created_by_user_id', ]; /** * @return array */ protected function casts(): array { return [ 'status' => BaselineProfileStatus::class, ]; } protected function scopeJsonb(): Attribute { return Attribute::make( get: function (mixed $value): array { return BaselineScope::fromJsonb( $this->decodeScopeJsonb($value) )->toJsonb(); }, set: function (mixed $value): string { $scope = BaselineScope::fromJsonb(is_array($value) ? $value : null)->toJsonb(); try { return json_encode($scope, JSON_THROW_ON_ERROR); } catch (JsonException) { return '{"policy_types":[],"foundation_types":[]}'; } }, ); } /** * Decode raw scope_jsonb value from the database. * * @return array|null */ private function decodeScopeJsonb(mixed $value): ?array { if (is_array($value)) { return $value; } if (is_string($value) && $value !== '') { try { $decoded = json_decode($value, true, flags: JSON_THROW_ON_ERROR); return is_array($decoded) ? $decoded : null; } catch (JsonException) { return null; } } return null; } public function workspace(): BelongsTo { return $this->belongsTo(Workspace::class); } public function createdByUser(): BelongsTo { return $this->belongsTo(User::class, 'created_by_user_id'); } public function activeSnapshot(): BelongsTo { return $this->belongsTo(BaselineSnapshot::class, 'active_snapshot_id'); } public function snapshots(): HasMany { return $this->hasMany(BaselineSnapshot::class); } public function tenantAssignments(): HasMany { return $this->hasMany(BaselineTenantAssignment::class); } }