0, 'images'=>0); include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); $image_rows = array(); $query = ' SELECT DISTINCT i.id, i.path, i.representative_ext FROM '.IMAGES_TABLE.' AS i LEFT JOIN '.CATEGORIES_TABLE.' AS sc ON sc.id = i.storage_category_id LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.image_id = i.id LEFT JOIN '.CATEGORIES_TABLE.' AS vc ON vc.id = ic.category_id WHERE sc.site_id = '.$site_id.' OR vc.site_id = '.$site_id.' ;'; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $row['id'] = (int)$row['id']; $image_rows[$row['id']] = $row; } foreach ($image_rows as $row) { try { delete_element_derivatives($row); } catch (Throwable $e) { error_log('Bratonien WebDAV delete derivative cleanup #'.(int)$row['id'].': '.$e->getMessage()); } } delete_site($site_id); if ($image_rows) { $ids = array_keys($image_rows); $remaining = query2array( 'SELECT id FROM '.IMAGES_TABLE.' WHERE id IN ('.implode(',', array_map('intval', $ids)).')', null, 'id' ); if ($remaining) { delete_elements(array_map('intval', $remaining), false); } } invalidate_user_cache(true); return array('site_id'=>$site_id, 'images'=>count($image_rows)); } function bratonien_tools_nc_connector_logical_delete_members(array $connection) { $members = array((int)$connection['id'] => $connection); $config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array(); $migration = isset($config['migration']) && is_array($config['migration']) ? $config['migration'] : array(); $role = (string)($migration['role'] ?? ''); if ($role === 'webdav-primary-candidate') { $legacy_id = (int)($migration['legacy_fallback_connection_id'] ?? 0); if ($legacy_id > 0) { $legacy = bratonien_tools_nc_connector_connection($legacy_id, false); if ($legacy && (string)$legacy['adapter'] === 'local') $members[$legacy_id] = $legacy; } } elseif ($role === 'legacy-fallback') { $remote_id = (int)($migration['webdav_successor_connection_id'] ?? 0); if ($remote_id > 0) { $remote = bratonien_tools_nc_connector_connection($remote_id, false); if ($remote && (string)$remote['adapter'] === 'remote') $members[$remote_id] = $remote; } } return $members; } /** * Delete one user-facing connector connection. A migration pair is one logical * connection for the user, so its internal WebDAV and Legacy records are * removed together. */ function bratonien_tools_nc_connector_delete_safe() { $id = (int)($_POST['connection_id'] ?? 0); $connection = bratonien_tools_nc_connector_connection($id, false); if (!$connection) { throw new RuntimeException('Connector-Verbindung wurde nicht gefunden.'); } $members = bratonien_tools_nc_connector_logical_delete_members($connection); $cleanup = array('site_id'=>0, 'images'=>0); foreach ($members as $member) { if ( (string)($member['adapter'] ?? '') === 'remote' && (string)($member['config']['source_mode'] ?? '') === 'webdav-placeholder' ) { $cleanup = bratonien_tools_nc_connector_remove_webdav_piwigo_content($member); break; } } $table = bratonien_tools_nc_connector_table(); $status_dir = rtrim(PHPWG_ROOT_PATH, '/').'/_data/bratonien-tools/nc-connector-status'; foreach ($members as $member_id=>$member) { $member_id = (int)$member_id; pwg_query("DELETE FROM `$table` WHERE id=".$member_id." LIMIT 1"); $public_status = $status_dir.'/connection-'.$member_id.'.json'; if (is_file($public_status)) @unlink($public_status); if (is_dir($status_dir) || @mkdir($status_dir, 0755, true)) { @file_put_contents($status_dir.'/deleted-'.$member_id, date('c')."\n", LOCK_EX); } } if ((int)$cleanup['site_id'] > 0) { return array( 'message'=>'Verbindung wurde gelöscht. Die zugehörigen Piwigo-Alben und '.(int)$cleanup['images'].' Bilder wurden aus Piwigo entfernt. Nextcloud-Dateien blieben unverändert.', ); } return array( 'message'=>'Verbindung wurde gelöscht. Verbliebene Laufzeitdaten werden automatisch bereinigt. Quelldateien blieben unverändert.', ); }