@@ -210,7 +210,7 @@ public function report(array $resources = [], array $resourceIds = []): array
210210 throw $ e ;
211211 }
212212
213- // Backups (uses call() instead of SDK, so needs separate error handling)
213+ // Backups use call() instead of the SDK, so they need separate error handling.
214214 if (\in_array (Resource::TYPE_BACKUP_POLICY , $ resources )) {
215215 try {
216216 $ scope = 'policies.read ' ;
@@ -1494,32 +1494,42 @@ public function importBackupResource(Resource $resource): Resource
14941494 'schedule ' => $ resource ->getSchedule (),
14951495 ];
14961496
1497- if ($ resource ->getResourceId ()) {
1498- $ collection = match ($ resource ->getResourceType ()) {
1497+ // Validate services - only databases, buckets, and functions are currently supported
1498+ $ supportedServices = [Transfer::GROUP_DATABASES , Transfer::GROUP_STORAGE , Transfer::GROUP_FUNCTIONS ];
1499+ $ unsupportedServices = array_diff ($ resource ->getServices (), $ supportedServices );
1500+ if (!empty ($ unsupportedServices )) {
1501+ throw new Exception (
1502+ resourceName: $ resource ->getName (),
1503+ resourceGroup: $ resource ->getGroup (),
1504+ resourceId: $ resource ->getId (),
1505+ message: 'Unsupported services in backup policy: ' . implode (', ' , $ unsupportedServices ),
1506+ );
1507+ }
1508+
1509+ $ resourceType = $ resource ->getResourceType ();
1510+ $ resourceId = $ resource ->getResourceId ();
1511+
1512+ if (!empty ($ resourceId )) {
1513+ // Only databases and buckets support per-resource backup policies
1514+ $ collectionMap = [
14991515 Resource::TYPE_DATABASE => 'databases ' ,
15001516 Resource::TYPE_BUCKET => 'buckets ' ,
1501- default => null ,
1502- };
1517+ ];
15031518
1504- if ($ collection !== null ) {
1505- $ doc = $ this ->database ->getDocument ($ collection , $ resource ->getResourceId ());
1519+ if (isset ($ collectionMap [$ resourceType ])) {
1520+ // Validate resource exists on destination
1521+ $ doc = $ this ->database ->getDocument ($ collectionMap [$ resourceType ], $ resourceId );
15061522 if ($ doc ->isEmpty ()) {
15071523 throw new Exception (
15081524 resourceName: $ resource ->getName (),
15091525 resourceGroup: $ resource ->getGroup (),
15101526 resourceId: $ resource ->getId (),
1511- message: 'Referenced ' . $ resource -> getResourceType () . ' " ' . $ resource -> getResourceId () . '" not found on destination ' ,
1527+ message: 'Referenced ' . $ resourceType . ' " ' . $ resourceId . '" not found on destination ' ,
15121528 );
15131529 }
1514-
1515- $ params ['resourceId ' ] = $ resource ->getResourceId ();
1516- } elseif ($ resource ->getResourceType ()) {
1517- // Per-resource backup policies only supported for databases and buckets
1518- $ resource ->setStatus (
1519- Resource::STATUS_WARNING ,
1520- 'Per-resource backup policies not supported for resource type: ' . $ resource ->getResourceType () . '. Created as service-level policy instead. '
1521- );
15221530 }
1531+
1532+ $ params ['resourceId ' ] = $ resourceId ;
15231533 }
15241534
15251535 $ this ->call ('POST ' , '/backups/policies ' , [
0 commit comments