diff --git a/assets/vue/app/domain/setting/infrastructure/api/apiContentSourceRepository.js b/assets/vue/app/domain/setting/infrastructure/api/apiContentSourceRepository.js index e5a395a..9739da8 100644 --- a/assets/vue/app/domain/setting/infrastructure/api/apiContentSourceRepository.js +++ b/assets/vue/app/domain/setting/infrastructure/api/apiContentSourceRepository.js @@ -75,9 +75,7 @@ export class ApiContentSourceRepository { */ async import(contentSources) { try { - const response = await this.apiClient.post('/content-sources/import', { - contentSources - }); + const response = await this.apiClient.post('/content-sources/import', contentSources); return response.data; } catch (error) { throw new Error(error.response?.data?.message || 'Erreur lors de l\'import des sources'); diff --git a/src/Domain/Setting/Application/CommandHandler/ImportContentSourceCommandHandler.php b/src/Domain/Setting/Application/CommandHandler/ImportContentSourceCommandHandler.php index 200825f..08d7e6f 100644 --- a/src/Domain/Setting/Application/CommandHandler/ImportContentSourceCommandHandler.php +++ b/src/Domain/Setting/Application/CommandHandler/ImportContentSourceCommandHandler.php @@ -20,28 +20,40 @@ readonly class ImportContentSourceCommandHandler throw new InvalidArgumentException('Content sources must be an array'); } - $contentSourcesToImport = []; - foreach ($command->contentSources as $data) { if (!$this->isValidContentSourceData($data)) { throw new InvalidArgumentException('Invalid content source data provided'); } - $contentSource = ContentSource::create( - baseUrl: $data['baseUrl'], - chapterUrlFormat: $data['chapterUrlFormat'], - scrapingType: $data['scrapingType'], - imageSelector: $data['imageSelector'] ?? null, - nextPageSelector: $data['nextPageSelector'] ?? null, - chapterSelector: $data['chapterSelector'] ?? null, - ); + // Recherche d'une source existante avec la même baseUrl + $existingContentSource = $this->contentSourceRepository->findByBaseUrl($data['baseUrl']); - $contentSourcesToImport[] = $contentSource; + if ($existingContentSource) { + // Met à jour la source existante + $existingContentSource->update( + baseUrl: $data['baseUrl'], + chapterUrlFormat: $data['chapterUrlFormat'], + scrapingType: $data['scrapingType'], + imageSelector: $data['imageSelector'] ?? null, + nextPageSelector: $data['nextPageSelector'] ?? null, + chapterSelector: $data['chapterSelector'] ?? null, + ); + + $this->contentSourceRepository->save($existingContentSource); + } else { + // Crée une nouvelle source + $newContentSource = ContentSource::create( + baseUrl: $data['baseUrl'], + chapterUrlFormat: $data['chapterUrlFormat'], + scrapingType: $data['scrapingType'], + imageSelector: $data['imageSelector'] ?? null, + nextPageSelector: $data['nextPageSelector'] ?? null, + chapterSelector: $data['chapterSelector'] ?? null, + ); + + $this->contentSourceRepository->save($newContentSource); + } } - - // Supprime tous les content sources existants puis importe les nouveaux - $this->contentSourceRepository->deleteAll(); - $this->contentSourceRepository->saveMultiple($contentSourcesToImport); } private function isValidContentSourceData(mixed $data): bool diff --git a/src/Domain/Setting/Domain/Contract/Repository/ContentSourceRepositoryInterface.php b/src/Domain/Setting/Domain/Contract/Repository/ContentSourceRepositoryInterface.php index b120a53..f965965 100644 --- a/src/Domain/Setting/Domain/Contract/Repository/ContentSourceRepositoryInterface.php +++ b/src/Domain/Setting/Domain/Contract/Repository/ContentSourceRepositoryInterface.php @@ -8,6 +8,7 @@ interface ContentSourceRepositoryInterface { public function findAll(): array; public function findById(int $id): ?ContentSource; + public function findByBaseUrl(string $baseUrl): ?ContentSource; public function save(ContentSource $contentSource): void; public function delete(ContentSource $contentSource): void; public function deleteAll(): void; diff --git a/src/Domain/Setting/Infrastructure/Persistence/Repository/DoctrineContentSourceRepository.php b/src/Domain/Setting/Infrastructure/Persistence/Repository/DoctrineContentSourceRepository.php index e17230e..a613655 100644 --- a/src/Domain/Setting/Infrastructure/Persistence/Repository/DoctrineContentSourceRepository.php +++ b/src/Domain/Setting/Infrastructure/Persistence/Repository/DoctrineContentSourceRepository.php @@ -32,6 +32,14 @@ readonly class DoctrineContentSourceRepository implements ContentSourceRepositor return $entity ? $this->mapper->toDomain($entity) : null; } + public function findByBaseUrl(string $baseUrl): ?ContentSource + { + $entity = $this->entityManager->getRepository(ContentSourceEntity::class) + ->findOneBy(['baseUrl' => $baseUrl]); + + return $entity ? $this->mapper->toDomain($entity) : null; + } + public function save(ContentSource $contentSource): void { if ($contentSource->getId()) {