feat(setting): implémenter la suppression d'une ContentSource

- Ajoute DeleteContentSourceCommand + CommandHandler (CQRS)
- Expose DELETE /api/content-sources/{id} via API Platform (Resource, Provider, Processor)
- Ajoute 2 tests Feature (204 succès, 404 not found)
- Frontend : méthode delete() dans le repository, action deleteSource() dans le store
- Nouveau composant ContentSourceDeleteModal (modale de confirmation)
- Bouton Supprimer dans la toolbar de ScrapperEdit (visible en mode édition uniquement)
This commit is contained in:
ext.jeremy.guillot@maxicoffee.domains
2026-03-16 00:27:31 +01:00
parent 36f873aaca
commit fc4ab68e8b
10 changed files with 401 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace App\Tests\Feature\Setting;
use App\Entity\ContentSource;
use App\Tests\Feature\AbstractApiTestCase;
use Symfony\Component\HttpFoundation\Response;
use Zenstruck\Foundry\Test\ResetDatabase;
final class DeleteContentSourceTest extends AbstractApiTestCase
{
use ResetDatabase;
private int $sourceId;
protected function setUp(): void
{
parent::setUp();
$source = new ContentSource();
$source->setBaseUrl('https://mangadex.org')
->setChapterUrlFormat('https://mangadex.org/chapter/{id}')
->setScrapingType('html');
$this->entityManager->persist($source);
$this->entityManager->flush();
$this->sourceId = $source->getId();
}
public function testItDeletesSourceSuccessfully(): void
{
static::createClient()->request('DELETE', "/api/content-sources/{$this->sourceId}");
$this->assertResponseStatusCodeSame(Response::HTTP_NO_CONTENT);
$this->entityManager->clear();
$deletedSource = $this->entityManager->find(ContentSource::class, $this->sourceId);
$this->assertNull($deletedSource);
}
public function testItReturnsNotFoundWhenSourceDoesNotExist(): void
{
static::createClient()->request('DELETE', '/api/content-sources/999999');
$this->assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND);
}
}