diff --git a/config/api_platform/mods/resources/StandardModList.yaml b/config/api_platform/mods/resources/AbstractModList.yaml similarity index 96% rename from config/api_platform/mods/resources/StandardModList.yaml rename to config/api_platform/mods/resources/AbstractModList.yaml index 446a5d94..bc2fe2cb 100644 --- a/config/api_platform/mods/resources/StandardModList.yaml +++ b/config/api_platform/mods/resources/AbstractModList.yaml @@ -1,5 +1,5 @@ resources: - App\Mods\Entity\ModList\StandardModList: + App\Mods\Entity\ModList\AbstractModList: operations: ApiPlatform\Metadata\GetCollection: provider: 'App\Mods\Api\Provider\ModList\ModListDataProvider' diff --git a/src/Mods/Api/Controller/ModList/GetModListByNameOperation.php b/src/Mods/Api/Controller/ModList/GetModListByNameOperation.php index 550937e4..bc05c5eb 100644 --- a/src/Mods/Api/Controller/ModList/GetModListByNameOperation.php +++ b/src/Mods/Api/Controller/ModList/GetModListByNameOperation.php @@ -6,7 +6,7 @@ use App\Mods\Api\DataTransformer\ModList\ModListDetailsOutputDataTransformer; use App\Mods\Api\Output\ModList\ModListOutput; -use App\Mods\Repository\ModList\StandardModListRepository; +use App\Mods\Repository\ModList\ModListRepository; use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -14,14 +14,14 @@ class GetModListByNameOperation { public function __construct( - private StandardModListRepository $standardModListRepository, + private ModListRepository $modListRepository, private ModListDetailsOutputDataTransformer $modListDetailsOutputDataTransformer, ) { } public function __invoke(string $name): ?ModListOutput { - $standardModList = $this->standardModListRepository->findOneByName($name); + $standardModList = $this->modListRepository->findOneByName($name); if (!$standardModList) { throw new NotFoundHttpException('Not Found'); diff --git a/src/Mods/Api/DataTransformer/ModList/ModListDetailsOutputDataTransformer.php b/src/Mods/Api/DataTransformer/ModList/ModListDetailsOutputDataTransformer.php index 9207a12c..8c853d8d 100644 --- a/src/Mods/Api/DataTransformer/ModList/ModListDetailsOutputDataTransformer.php +++ b/src/Mods/Api/DataTransformer/ModList/ModListDetailsOutputDataTransformer.php @@ -10,6 +10,8 @@ use App\Mods\Api\Output\ModList\ModListOutput; use App\Mods\Entity\Dlc\Dlc; use App\Mods\Entity\Mod\AbstractMod; +use App\Mods\Entity\ModList\AbstractModList; +use App\Mods\Entity\ModList\ExternalModList; use App\Mods\Entity\ModList\StandardModList; use App\Mods\Repository\Mod\ModRepository; @@ -22,23 +24,44 @@ public function __construct( ) { } - public function transform(StandardModList $standardModList): ModListOutput + public function transform(AbstractModList $modList): ModListOutput { - return new ModListDetailsOutput( - $standardModList->getId()->toString(), - $standardModList->getName(), - $standardModList->isActive(), - $standardModList->isApproved(), - $standardModList->getCreatedAt(), - $standardModList->getLastUpdatedAt(), - array_map( + $isApproved = null; + if ($modList instanceof StandardModList) { + $isApproved = $modList->isApproved(); + } + + $mods = []; + if ($modList instanceof StandardModList) { + $mods = array_map( fn (AbstractMod $mod) => $this->modOutputDataTransformer->transform($mod), - $this->modRepository->findIncludedMods($standardModList) - ), - array_map( + $this->modRepository->findIncludedMods($modList) + ); + } + + $dlcs = []; + if ($modList instanceof StandardModList) { + $dlcs = array_map( fn (Dlc $dlc) => $this->dlcOutputDataTransformer->transform($dlc), - $standardModList->getDlcs() - ), + $modList->getDlcs() + ); + } + + $url = null; + if ($modList instanceof ExternalModList) { + $url = $modList->getUrl(); + } + + return new ModListDetailsOutput( + $modList->getId()->toString(), + $modList->getName(), + $modList->isActive(), + $modList->getCreatedAt(), + $modList->getLastUpdatedAt(), + $isApproved, + $mods, + $dlcs, + $url ); } } diff --git a/src/Mods/Api/DataTransformer/ModList/ModListOutputDataTransformer.php b/src/Mods/Api/DataTransformer/ModList/ModListOutputDataTransformer.php index cc504662..705db628 100644 --- a/src/Mods/Api/DataTransformer/ModList/ModListOutputDataTransformer.php +++ b/src/Mods/Api/DataTransformer/ModList/ModListOutputDataTransformer.php @@ -5,19 +5,25 @@ namespace App\Mods\Api\DataTransformer\ModList; use App\Mods\Api\Output\ModList\ModListOutput; +use App\Mods\Entity\ModList\AbstractModList; use App\Mods\Entity\ModList\StandardModList; class ModListOutputDataTransformer { - public function transform(StandardModList $standardModList): ModListOutput + public function transform(AbstractModList $modList): ModListOutput { + $isApproved = null; + if ($modList instanceof StandardModList) { + $isApproved = $modList->isApproved(); + } + return new ModListOutput( - $standardModList->getId()->toString(), - $standardModList->getName(), - $standardModList->isActive(), - $standardModList->isApproved(), - $standardModList->getCreatedAt(), - $standardModList->getLastUpdatedAt(), + $modList->getId()->toString(), + $modList->getName(), + $modList->isActive(), + $modList->getCreatedAt(), + $modList->getLastUpdatedAt(), + $isApproved, ); } } diff --git a/src/Mods/Api/Output/ModList/ModListDetailsOutput.php b/src/Mods/Api/Output/ModList/ModListDetailsOutput.php index 28d9f70c..0843a9ba 100644 --- a/src/Mods/Api/Output/ModList/ModListDetailsOutput.php +++ b/src/Mods/Api/Output/ModList/ModListDetailsOutput.php @@ -16,20 +16,21 @@ class ModListDetailsOutput extends ModListOutput public function __construct( string $id, string $name, - bool $active, - bool $approved, + ?bool $active, \DateTimeInterface $createdAt, ?\DateTimeInterface $lastUpdatedAt, + ?bool $approved, public array $mods, - public array $dlcs + public array $dlcs, + public ?string $url ) { parent::__construct( $id, $name, $active, - $approved, $createdAt, - $lastUpdatedAt + $lastUpdatedAt, + $approved, ); } } diff --git a/src/Mods/Api/Output/ModList/ModListOutput.php b/src/Mods/Api/Output/ModList/ModListOutput.php index 0ee0b3a7..f707611c 100644 --- a/src/Mods/Api/Output/ModList/ModListOutput.php +++ b/src/Mods/Api/Output/ModList/ModListOutput.php @@ -10,9 +10,9 @@ public function __construct( public string $id, public string $name, public bool $active, - public bool $approved, public \DateTimeInterface $createdAt, public ?\DateTimeInterface $lastUpdatedAt, + public ?bool $approved, ) { } } diff --git a/tests/functional/Mods/Api/ModList/ListModListsCest.php b/tests/functional/Mods/Api/ModList/ListModListsCest.php index b79a9cce..05608182 100644 --- a/tests/functional/Mods/Api/ModList/ListModListsCest.php +++ b/tests/functional/Mods/Api/ModList/ListModListsCest.php @@ -69,6 +69,22 @@ private function getExpectedPayload(): array 'createdAt' => '2020-01-01T00:00:00+00:00', 'lastUpdatedAt' => null, ], + [ + 'id' => '296cc791-c73f-4978-b377-da1d3aa28cfb', + 'name' => 'Google', + 'active' => false, + 'approved' => null, + 'createdAt' => '2020-01-01T00:00:00+00:00', + 'lastUpdatedAt' => null, + ], + [ + 'id' => '4900fe5f-3902-424f-bcc8-e92adbda4df5', + 'name' => 'Localhost', + 'active' => true, + 'approved' => null, + 'createdAt' => '2020-01-01T00:00:00+00:00', + 'lastUpdatedAt' => null, + ], [ 'id' => 'c3b11c2f-9254-4262-bfde-3605df0149d4', 'name' => 'RHS', @@ -78,8 +94,8 @@ private function getExpectedPayload(): array 'lastUpdatedAt' => null, ], ], - 'items' => 3, - 'totalItems' => 3.0, + 'items' => 5, + 'totalItems' => 5.0, 'currentPage' => 1.0, 'lastPage' => 1.0, 'itemsPerPage' => 30.0,