Files
Mangarr/config/services.yaml
ext.jeremy.guillot@maxicoffee.domains c311cfe80c refactor(scraping): DDD refactoring — stockage images individuelles
Le domaine Scraping ne génère plus d'archives CBZ ni ne modifie les
entités du domaine Manga directement. Il scrape, stocke les images
individuellement, et émet un événement partagé.

- Suppression : CbzGeneratorInterface, CbzGenerator, CbzGenerationRequest,
  CbzPath, CbzGenerationException
- Suppression : save() de ChapterRepositoryInterface (Scraping)
- Suppression : cbzPath du modèle Chapter (Scraping)
- Ajout : ImageStorageInterface + LocalImageStorage
  (stockage dans {MANGA_DATA_PATH}/pages/{chapterId}/)
- ScrapeChapterHandler utilise ImageStorage au lieu du générateur CBZ

- ChapterScraped déplacé dans Domain/Shared/Domain/Event/
  avec jobId, chapterId, pagesDirectory, pageCount
- Routing Messenger ajouté

- Ajout : ChapterScrapedEventListener + ChapterScrapedMessageHandler
  pour mettre à jour Chapter.pagesDirectory via le Repository Manga

- LegacyChapterRepository en dual-mode :
  pagesDirectory en priorité, fallback cbzPath (backward compat)
- Requêtes prev/next : filtrent pagesDirectory IS NOT NULL OR cbzPath IS NOT NULL
- ChapterContext expose pagesDirectory

- phparkitect.php : App\Domain\Shared\Domain\Event autorisé dans
  les couches Application (correction violations pré-existantes
  ChapterImported/VolumeImported + nouvelle ChapterScraped)

- 218/218 tests passent (+3 nouveaux)
- InMemoryImageStorage créé pour les tests unitaires

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 20:52:16 +01:00

196 lines
7.1 KiB
YAML

# This file is the entry point to configure your own services.
# Files in the packages/ subdirectory configure your dependencies.
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
parameters:
cache_adapter: 'cache.adapter.filesystem'
imports:
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
App\EventListener\ExceptionListener:
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
GuzzleHttp\Client:
class: GuzzleHttp\Client
arguments:
$config:
headers:
Content-Type: 'application/json'
allow_redirects:
max: 20
strict: true
referer: true
protocols: [ 'http', 'https' ]
track_redirects: true
App\Service\MangaScraperService:
arguments:
$projectDir: '%kernel.project_dir%'
App\Controller\TestController:
arguments:
$projectDir: '%kernel.project_dir%'
App\Domain\Conversion\Infrastructure\Service\ConversionService:
arguments:
$projectDir: '%kernel.project_dir%'
App\Service\CbrToCbzConverter:
arguments:
$projectDir: '%kernel.project_dir%'
App\Manager\FileSystemManager:
arguments:
$projectDir: '%kernel.project_dir%'
App\EventSubscriber\QueueStatusSubscriber:
tags:
- { name: kernel.event_subscriber }
App\Client\MangadexClient:
arguments:
$httpClient: '@GuzzleHttp\Client'
$clientId: '%env(MANGADEX_CLIENT_ID)%'
$clientSecret: '%env(MANGADEX_CLIENT_SECRET)%'
$username: '%env(MANGADEX_USERNAME)%'
$password: '%env(MANGADEX_PASSWORD)%'
App\Service\MangadexProvider:
arguments:
$client: '@App\Client\MangadexClient'
# Scraper Service
App\Service\Scraper\HtmlScraper:
tags: [ 'app.scraper' ]
App\Service\Scraper\JavascriptScraper:
tags: [ 'app.scraper' ]
App\Service\Scraper\MangadexScraper:
tags: [ 'app.scraper' ]
# Scraper Factory
App\Service\Scraper\ScraperFactory:
arguments:
$scrapers: !tagged_iterator app.scraper
# Manga Scraper Service
App\Service\Scraper\MangaScraperService:
arguments:
$scraperFactory: '@App\Service\Scraper\ScraperFactory'
# New Scrapers Factory for Domain Layer
App\Domain\Scraping\Infrastructure\Service\ScraperFactory:
arguments:
$projectDir: '%kernel.project_dir%'
# Scraper Factory Interface alias
App\Domain\Scraping\Domain\Contract\Service\ScraperFactoryInterface:
alias: App\Domain\Scraping\Infrastructure\Service\ScraperFactory
# Test Scraper Configuration Handler
App\Domain\Scraping\Application\CommandHandler\TestScraperConfigurationHandler: ~
# JavaScript Scraper
App\Domain\Scraping\Infrastructure\Service\Scraper\JavaScriptScraper:
arguments:
$projectDir: '%kernel.project_dir%'
# Advanced HTML Scraper
App\Domain\Scraping\Infrastructure\Service\Scraper\AdvancedHtmlScraper: ~
# Scrape Chapter Handler
App\Domain\Scraping\Application\CommandHandler\ScrapeChapterHandler: ~
App\Domain\Scraping\Infrastructure\CommandHandler\SymfonyScrapeChapterHandler:
tags:
- { name: messenger.message_handler, bus: command.bus }
App\Domain\Scraping\Domain\Contract\Service\ImageStorageInterface:
alias: App\Domain\Scraping\Infrastructure\Service\LocalImageStorage
App\Domain\Scraping\Infrastructure\Service\LocalImageStorage:
arguments:
$storagePath: '%env(MANGA_DATA_PATH)%'
# Shared Manga Path/File Manager
App\Domain\Shared\Domain\Contract\MangaPathManagerInterface:
alias: App\Domain\Shared\Infrastructure\Service\MangaFileManager
App\Domain\Shared\Infrastructure\Service\MangaFileManager:
arguments:
$projectDir: '%kernel.project_dir%'
App\Domain\Manga\Infrastructure\Client\MangadexClient:
arguments:
$clientId: '%env(MANGADEX_CLIENT_ID)%'
$clientSecret: '%env(MANGADEX_CLIENT_SECRET)%'
$username: '%env(MANGADEX_USERNAME)%'
$password: '%env(MANGADEX_PASSWORD)%'
App\Domain\Manga\Infrastructure\Service\ImageProcessor:
arguments:
$publicDir: '%kernel.project_dir%/public'
$httpClient: '@GuzzleHttp\Client'
# File Service
App\Domain\Manga\Domain\Contract\Service\FileServiceInterface:
alias: App\Domain\Manga\Infrastructure\Service\FileService
# File Service Configuration
App\Domain\Manga\Infrastructure\Service\FileService:
arguments:
$cbzStoragePath: '%kernel.project_dir%/public/cbz'
App\Domain\Shared\Domain\Contract\EventDispatcherInterface:
alias: App\Domain\Shared\Infrastructure\Messenger\SymfonyMessengerEventDispatcher
# Shared Domain Services Configuration
App\Domain\Shared\Domain\Contract\FileUploadInterface:
alias: App\Domain\Shared\Infrastructure\Service\SymfonyFileUpload
App\Domain\Shared\Infrastructure\Service\SymfonyFileUpload:
arguments:
$uploadsDirectory: '%kernel.project_dir%/public/tmp'
App\Domain\Shared\Domain\Contract\NotificationInterface:
alias: App\Domain\Shared\Infrastructure\Service\SymfonyNotification
App\Domain\Manga\Infrastructure\CommandHandler\SymfonyFetchMangaChaptersHandler:
tags:
- { name: messenger.message_handler, bus: command.bus }
# Import Domain Services
App\Domain\Import\Infrastructure\Service\FilenameAnalyzer: ~
App\Domain\Import\Domain\Service\FilenameAnalyzerInterface:
alias: App\Domain\Import\Infrastructure\Service\FilenameAnalyzer
# Import Domain Query/Command Handlers
App\Domain\Import\Application\QueryHandler\AnalyzeFilenameQueryHandler: ~
App\Domain\Import\Application\CommandHandler\ImportFileCommandHandler: ~
# Import Domain API Platform Services
App\Domain\Import\Infrastructure\ApiPlatform\State\Processor\AnalyzeFilenameStateProcessor: ~
App\Domain\Import\Infrastructure\ApiPlatform\State\Processor\ImportFileStateProcessor: ~