diff --git a/Domain/BookableResource.php b/Domain/BookableResource.php index e89c6c648..3787127df 100644 --- a/Domain/BookableResource.php +++ b/Domain/BookableResource.php @@ -1451,6 +1451,14 @@ public function GetRemovedAttributes() return $this->_removedAttributeValues; } + /** + * @return array|AttributeValue[] + */ + public function GetAttributeValues(): array + { + return [...$this->_attributeValues]; + } + /** * @param $customAttributeId * @return mixed diff --git a/WebServices/Controllers/ResourceSaveController.php b/WebServices/Controllers/ResourceSaveController.php index 84f73c597..da0107bc3 100644 --- a/WebServices/Controllers/ResourceSaveController.php +++ b/WebServices/Controllers/ResourceSaveController.php @@ -56,7 +56,10 @@ public function Create($request, $session) ); $resourceId = $this->repository->Add($newResource); - $resource = $this->BuildResource($request, $resourceId); + $resource = $this->BuildResource( + request: $request, + resourceId: $resourceId + ); $this->repository->Update($resource); return new ResourceControllerResult($resourceId, null); @@ -69,7 +72,11 @@ public function Update($resourceId, $request, $session) return new ResourceControllerResult(null, $errors); } $oldResource = $this->repository->LoadById($resourceId); - $resource = $this->BuildResource($request, $resourceId); + $resource = $this->BuildResource( + request: $request, + resourceId: $resourceId, + existingResource: $oldResource + ); $resource->SetImages($oldResource->GetImages()); $this->repository->Update($resource); @@ -96,9 +103,10 @@ public function Delete($resourceId, $session) /** * @param ResourceRequest $request * @param int $resourceId + * @param BookableResource|null $existingResource * @return BookableResource */ - private function BuildResource($request, $resourceId) + private function BuildResource(ResourceRequest $request, int $resourceId, ?BookableResource $existingResource = null): BookableResource { $resource = new BookableResource( $resourceId, @@ -124,6 +132,13 @@ private function BuildResource($request, $resourceId) ); $resource->SetSortOrder($request->sortOrder); + // Copy existing attributes before calling ChangeAttributes, so that we know what attributes have changed + if ($existingResource !== null) { + foreach ($existingResource->GetAttributeValues() as $attributeValue) { + $resource->WithAttribute($attributeValue); + } + } + $attributes = []; foreach ($request->GetCustomAttributes() as $attribute) { $attributes[] = new AttributeValue($attribute->attributeId, $attribute->attributeValue);