111 lines
6.0 KiB
PHP
111 lines
6.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Domain\Manga\Infrastructure\ApiPlatform\Resource;
|
|
|
|
use ApiPlatform\Metadata\ApiResource;
|
|
use ApiPlatform\Metadata\Get;
|
|
use App\Domain\Manga\Infrastructure\ApiPlatform\Dto\FilenameMatchCollection;
|
|
use App\Domain\Manga\Infrastructure\ApiPlatform\State\Provider\FindMangaMatchByFilenameStateProvider;
|
|
|
|
#[ApiResource(
|
|
shortName: 'MangaMatch',
|
|
operations: [
|
|
new Get(
|
|
uriTemplate: '/manga-matches',
|
|
provider: FindMangaMatchByFilenameStateProvider::class,
|
|
openapiContext: [
|
|
'summary' => 'Trouve des correspondances de manga à partir d\'un nom de fichier',
|
|
'description' => 'Analyse un nom de fichier (cbz/cbr) et trouve les mangas correspondants dans la base de données. Extrait automatiquement le titre, le numéro de chapitre et le numéro de volume du nom de fichier.',
|
|
'parameters' => [
|
|
[
|
|
'name' => 'filename',
|
|
'in' => 'query',
|
|
'required' => true,
|
|
'schema' => [
|
|
'type' => 'string',
|
|
'example' => 'one-piece_vol108_ch1094.cbz'
|
|
],
|
|
'description' => 'Nom du fichier à analyser (avec ou sans extension .cbz/.cbr)'
|
|
]
|
|
],
|
|
'responses' => [
|
|
'200' => [
|
|
'description' => 'Correspondances trouvées',
|
|
'content' => [
|
|
'application/json' => [
|
|
'schema' => [
|
|
'type' => 'object',
|
|
'properties' => [
|
|
'matches' => [
|
|
'type' => 'array',
|
|
'description' => 'Liste des mangas correspondants triés par score de pertinence',
|
|
'items' => [
|
|
'type' => 'object',
|
|
'properties' => [
|
|
'id' => ['type' => 'string', 'description' => 'Identifiant du manga'],
|
|
'title' => ['type' => 'string', 'description' => 'Titre du manga'],
|
|
'slug' => ['type' => 'string', 'description' => 'Slug du manga'],
|
|
'alternativeSlugs' => [
|
|
'type' => 'array',
|
|
'items' => ['type' => 'string'],
|
|
'description' => 'Slugs alternatifs'
|
|
],
|
|
'thumbnailUrl' => ['type' => 'string', 'nullable' => true, 'description' => 'URL de la miniature'],
|
|
'matchScore' => ['type' => 'integer', 'description' => 'Score de correspondance (plus élevé = meilleure correspondance)'],
|
|
'chapterNumber' => ['type' => 'number', 'nullable' => true, 'description' => 'Numéro de chapitre extrait'],
|
|
'volumeNumber' => ['type' => 'number', 'nullable' => true, 'description' => 'Numéro de volume extrait']
|
|
]
|
|
]
|
|
],
|
|
'chapterNumber' => [
|
|
'type' => 'number',
|
|
'nullable' => true,
|
|
'description' => 'Numéro de chapitre extrait du nom de fichier'
|
|
],
|
|
'volumeNumber' => [
|
|
'type' => 'number',
|
|
'nullable' => true,
|
|
'description' => 'Numéro de volume extrait du nom de fichier'
|
|
],
|
|
'possibleTitles' => [
|
|
'type' => 'array',
|
|
'items' => ['type' => 'string'],
|
|
'description' => 'Variantes de titres générées à partir du nom de fichier'
|
|
]
|
|
]
|
|
],
|
|
'example' => [
|
|
'matches' => [
|
|
[
|
|
'id' => '123',
|
|
'title' => 'One Piece',
|
|
'slug' => 'one-piece',
|
|
'alternativeSlugs' => [],
|
|
'thumbnailUrl' => 'https://example.com/thumb.jpg',
|
|
'matchScore' => 100,
|
|
'chapterNumber' => 1094.0,
|
|
'volumeNumber' => 108
|
|
]
|
|
],
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'400' => [
|
|
'description' => 'Nom de fichier manquant ou invalide'
|
|
]
|
|
]
|
|
]
|
|
)
|
|
]
|
|
)]
|
|
class FindMangaMatchByFilenameResource
|
|
{
|
|
public function __construct(
|
|
public readonly array $matches = [],
|
|
) {
|
|
}
|
|
}
|