* Deletes a folder if it is empty and removes its corresponding metadata. * Also removes ownership mappings for this folder and all its descendants. */
(string $folder)
| 1774 | * Also removes ownership mappings for this folder and all its descendants. |
| 1775 | */ |
| 1776 | public static function deleteFolder(string $folder): array |
| 1777 | { |
| 1778 | if (strtolower($folder) === 'root') { |
| 1779 | return ["error" => "Cannot delete root folder."]; |
| 1780 | } |
| 1781 | |
| 1782 | [$real, $relative, $err] = self::resolveFolderPath($folder, false); |
| 1783 | if ($err) { |
| 1784 | return ["error" => $err]; |
| 1785 | } |
| 1786 | $storage = self::storage(); |
| 1787 | |
| 1788 | try { |
| 1789 | UploadModel::cleanupResumableForFolder($relative); |
| 1790 | } catch (\Throwable $e) { |
| 1791 | /* ignore */ |
| 1792 | } |
| 1793 | |
| 1794 | // Prevent deletion if not empty. |
| 1795 | if ($storage->isLocal()) { |
| 1796 | $items = array_diff(@scandir($real) ?: [], array('.', '..')); |
| 1797 | } else { |
| 1798 | $markerName = defined('FR_REMOTE_DIR_MARKER') ? (string)FR_REMOTE_DIR_MARKER : '.filerise_keep'; |
| 1799 | $items = array_values(array_filter( |
| 1800 | $storage->list($real), |
| 1801 | static function ($n) use ($markerName) { |
| 1802 | if ($n === '.' || $n === '..' || $n === '') { |
| 1803 | return false; |
| 1804 | } |
| 1805 | if ($markerName !== '' && $n === $markerName) { |
| 1806 | return false; |
| 1807 | } |
| 1808 | return true; |
| 1809 | } |
| 1810 | )); |
| 1811 | } |
| 1812 | if (count($items) > 0) { |
| 1813 | return ["error" => "Folder is not empty."]; |
| 1814 | } |
| 1815 | |
| 1816 | if (!$storage->isLocal()) { |
| 1817 | $markerName = defined('FR_REMOTE_DIR_MARKER') ? (string)FR_REMOTE_DIR_MARKER : '.filerise_keep'; |
| 1818 | if ($markerName !== '') { |
| 1819 | $markerPath = rtrim($real, '/\\') . DIRECTORY_SEPARATOR . $markerName; |
| 1820 | $storage->delete($markerPath); |
| 1821 | } |
| 1822 | } |
| 1823 | |
| 1824 | if (!$storage->delete($real)) { |
| 1825 | return ["error" => "Failed to delete folder."]; |
| 1826 | } |
| 1827 | |
| 1828 | // Remove metadata file (best-effort). |
| 1829 | $metadataFile = self::getMetadataFilePath($relative); |
| 1830 | if (file_exists($metadataFile)) { |
| 1831 | @unlink($metadataFile); |
| 1832 | } |
| 1833 |
no test coverage detected