multi-downloader-client/src/MultiDownloaderClient.php
Nicolas COMPAIN de205f9870
All checks were successful
continuous-integration/drone/push Build is passing
Update devcontainer.json and MultiDownloaderClient.php
2024-01-12 09:52:27 +00:00

159 lines
5.3 KiB
PHP

<?php
namespace Nwb\MultiDownloaderClient;
class MultiDownloaderClient
{
private string $url;
private string $apiKey;
private string $apiSecret;
private array $files = [];
/**
* Constructeur pour initialiser la classe avec des options spécifiques.
*
* Ce constructeur accepte un tableau d'options pour configurer divers paramètres.
* - `apiKey` (string): Clé d'API nécessaire pour l'authentification. Si elle n'est pas fournie dans le tableau, elle sera récupérée de la variable d'environnement 'MULTI_DOWNLOADER_ACCESS_KEY'.
* - `apiSecret` (string): Clé secrète d'API nécessaire pour des opérations sécurisées. Si elle n'est pas fournie dans le tableau, elle sera récupérée de la variable d'environnement 'MULTI_DOWNLOADER_SECRET_KEY'.
* - `url` (string): URL de base du service de téléchargement. Si elle n'est pas fournie, elle sera d'abord recherchée dans la variable d'environnement 'MULTI_DOWNLOADER_URL', sinon l'URL par défaut 'https://multi-dl.kub.nwb.fr' sera utilisée.
*
* @param array $options Options pour configurer le constructeur.
* @throws \InvalidArgumentException Si l'`apiKey` ou l'`apiSecret` n'est pas fourni.
*/
public function __construct(array $options = [])
{
$apiKey = $options['apiKey'] ?? getenv('MULTI_DOWNLOADER_ACCESS_KEY');
if (!$apiKey) {
throw new \InvalidArgumentException('API key is required');
}
$this->apiKey = $apiKey;
$apiSecret = $options['apiSecret'] ?? getenv('MULTI_DOWNLOADER_SECRET_KEY');
if (!$apiSecret) {
throw new \InvalidArgumentException('API secret key is required');
}
$this->apiSecret = $apiSecret;
$this->url = $options['url'] ?? getenv('MULTI_DOWNLOADER_URL') ?: 'https://multi-dl.kub.nwb.fr';
}
public function setFiles(array $files)
{
$this->files = [];
$this->addFiles($files);
return $this;
}
public function addFile(FileRequest $file)
{
$this->files[] = $file;
return $this;
}
/**
* Ajoute plusieurs fichiers à la liste de téléchargement.
*
* Cette méthode prend un tableau de fichiers et les ajoute un par un
* à la liste de téléchargement en utilisant la méthode `addFile`.
*
* @param array $files Tableau de fichiers à ajouter.
* @return $this L'instance actuelle pour permettre le chaînage de méthodes.
*/
public function addFiles(array $files)
{
foreach ($files as $file) {
$this->addFile($file);
}
return $this;
}
private function buildRequest(): array
{
return array_map(function (FileRequest $file) {
return $file->toArray();
}, $this->files);
}
/**
* Télécharge les fichiers et renvoie le résultat sous forme de chaîne de caractères.
*
* Cette méthode envoie la requête de téléchargement et renvoie le contenu
* téléchargé sous forme de chaîne de caractères. Idéal pour le traitement
* de données en mémoire.
*
* @return string Le contenu téléchargé sous forme de chaîne.
*/
public function downloadAsString(): string
{
return $this->sendRequest();
}
/**
* Télécharge les fichiers et les enregistre dans un chemin spécifié.
*
* Cette méthode envoie la requête de téléchargement et sauvegarde le contenu
* téléchargé dans le fichier spécifié par le chemin `$path`.
*
* @param string $path Le chemin du fichier où sauvegarder le contenu téléchargé.
* @return string Réponse de la requête de téléchargement.
*/
public function downloadTo(string $path): string
{
$response = $this->sendRequest([
CURLOPT_RETURNTRANSFER => false,
CURLOPT_FILE => fopen($path, 'w'),
]);
return $response;
}
/**
* Génère et renvoie un formulaire HTML pour le téléchargement de fichiers.
*
* Cette méthode capture la sortie du fichier 'htmlForm.php' et la renvoie
* sous forme de chaîne de caractères. Utilisée pour générer dynamiquement
* un formulaire de téléchargement dans une page web.
*
* @return string Le formulaire HTML généré pour le téléchargement.
*/
public function htmlForm(): string
{
ob_start();
include __DIR__ . '/htmlForm.php';
return ob_get_clean();
}
private function sendRequest(array $options = []): string
{
$ch = curl_init();
$options = array_replace($options, [
CURLOPT_URL => $this->url . '/v2/zip',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($this->buildRequest()),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $this->apiKey,
],
]);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
throw new MultiDownloaderException('Error while requesting API: ' . $response);
}
curl_close($ch);
return $response;
}
}