Append selector instead of overwritting previous ones in Address::deleteAddresses
[platal.git] / classes / address.php
index 4998577..e325d1e 100644 (file)
@@ -704,6 +704,11 @@ class Address
                          $this->types, $this->formatted_address, $this->location_type, $this->partial_match, $this->latitude, $this->longitude,
                          $this->southwest_latitude, $this->southwest_longitude, $this->northeast_latitude, $this->northeast_longitude, $this->geocoding_calls, $this->postal_code_fr);
 
+            // In an ideal world there would not be any components to clean up before insertion.
+            // In real world, it happens that some addresses are badly removed and this query removes the leaked trash.
+            XDB::execute('DELETE FROM  profile_addresses_components
+                                WHERE  pid = {?} AND jobid = {?} AND groupid = {?} AND type = {?} AND id = {?}',
+                         $this->pid, $this->jobid, $this->groupid, $this->type, $this->id);
             if ($this->componentsIds) {
                 foreach (explode(',', $this->componentsIds) as $component_id) {
                     XDB::execute('INSERT IGNORE INTO  profile_addresses_components (pid, jobid, groupid, type, id, component_id)
@@ -817,13 +822,17 @@ class Address
     {
         $where = '';
         if (!is_null($pid)) {
-            $where = XDB::format(' AND pid = {?}', $pid);
+            $where .= XDB::format(' AND pid = {?}', $pid);
         }
         if (!is_null($jobid)) {
-            $where = XDB::format(' AND jobid = {?}', $jobid);
+            $where .= XDB::format(' AND jobid = {?}', $jobid);
         }
         if (!is_null($groupid)) {
-            $where = XDB::format(' AND groupid = {?}', $groupid);
+            $where .= XDB::format(' AND groupid = {?}', $groupid);
+        }
+        // Prevent buggy callers from accidentally dropping profile_addresses
+        if (!$where) {
+            throw new Exception("Unable to delete all addresses of the given type, the request was too generic");
         }
         XDB::execute('DELETE FROM  profile_addresses
                             WHERE  type = {?}' . $where . (($deletePrivate) ? '' : ' AND pub IN (\'public\', \'ax\')'),