f7cloud_client/apps/richdocuments/lib/WOPI/SettingsUrl.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

104 lines
2.3 KiB
PHP

<?php
/**
* SPDX-FileCopyrightText: 2025 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Richdocuments\WOPI;
use InvalidArgumentException;
/*
* SettingsUrl is used to handle setting type, category and filename.
*/
class SettingsUrl {
private string $type;
private string $category;
private string $fileName;
private string $rawUrl;
public function __construct(string $url) {
$this->rawUrl = $url;
$this->parseUrl($url);
}
/**
* Factory method to create a SettingsUrl instance based on individual parameters.
*/
public static function fromComponents(string $type, string $category, string $fileName): self {
$rawUrl = "settings/$type/$category/$fileName";
return new self($rawUrl);
}
/**
* Parses the settings URL and extracts type, category, and filename.
*
* @param string $url The settings URL to parse.
* @throws InvalidArgumentException If the URL is invalid or incorrectly formatted.
*/
private function parseUrl(string $url): void {
$decodedUrl = urldecode($url);
$parsedUrl = parse_url($decodedUrl);
if (!isset($parsedUrl['path'])) {
throw new InvalidArgumentException('Invalid URL: Path not found.');
}
$path = $parsedUrl['path'];
$settingsIndex = strpos($path, '/settings/');
if ($settingsIndex === false) {
throw new InvalidArgumentException("Invalid settings URL format: '/settings/' segment missing.");
}
$relevantPath = substr($path, $settingsIndex + strlen('/settings/'));
$pathParts = explode('/', $relevantPath);
if (count($pathParts) < 3) {
throw new InvalidArgumentException("Invalid settings URL format: Expected 'type/category/fileName'.");
}
$this->type = $pathParts[0];
$this->category = $pathParts[1];
$this->fileName = implode('/', array_slice($pathParts, 2));
}
/**
* Get the setting type from the URL.
*
* @return string
*/
public function getType(): string {
return $this->type;
}
/**
* Get the setting category from the URL.
*
* @return string
*/
public function getCategory(): string {
return $this->category;
}
/**
* Get the original filename from the URL.
*
* @return string
*/
public function getFileName(): string {
return $this->fileName;
}
/**
* Get the raw URL.
*
* @return string
*/
public function getRawUrl(): string {
return $this->rawUrl;
}
}