From 804cc5fe63010a3650d377e81430069e0c645b32 Mon Sep 17 00:00:00 2001 From: Ben H Date: Sun, 22 Feb 2026 09:53:32 -0800 Subject: [PATCH] re-donate museum items to get YOUR name on the maker column --- src/Controller/Museum/DonateController.php | 48 ++++++++++++++----- .../Museum/GetDonatableItemsController.php | 30 ++++++++++-- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/Controller/Museum/DonateController.php b/src/Controller/Museum/DonateController.php index d203589e..1c62903e 100644 --- a/src/Controller/Museum/DonateController.php +++ b/src/Controller/Museum/DonateController.php @@ -63,6 +63,8 @@ public function handle( if(count($inventory) === 0) throw new PSPFormValidationException('No items were selected.'); + $existingMuseumItems = []; + for($i = count($inventory) - 1; $i >= 0; $i--) { if($inventory[$i]->getOwner()->getId() !== $user->getId()) @@ -78,8 +80,16 @@ public function handle( if($existingItem) { - unset($inventory[$i]); - continue; + $isUpgrade = $inventory[$i]->getCreatedBy()?->getId() === $user->getId() + && $existingItem->getCreatedBy()?->getId() !== $user->getId(); + + if(!$isUpgrade) + { + unset($inventory[$i]); + continue; + } + + $existingMuseumItems[$inventory[$i]->getId()] = $existingItem; } } @@ -88,26 +98,42 @@ public function handle( $totalMuseumPoints = 0; $donatedItemNames = []; + $newDonationCount = 0; foreach($inventory as $i) { - $museumItem = (new MuseumItem(user: $user, item: $i->getItem())) - ->setCreatedBy($i->getCreatedBy()) - ->setComments($i->getComments()) - ; + if(isset($existingMuseumItems[$i->getId()])) + { + // Upgrade existing museum entry + $existingMuseumItems[$i->getId()] + ->setCreatedBy($i->getCreatedBy()) + ->setComments($i->getComments()); + } + else + { + // New donation + $museumItem = (new MuseumItem(user: $user, item: $i->getItem())) + ->setCreatedBy($i->getCreatedBy()) + ->setComments($i->getComments()) + ; - $totalMuseumPoints += $i->getItem()->getMuseumPoints(); - $donatedItemNames[] = $i->getItem()->getNameWithArticle(); + $totalMuseumPoints += $i->getItem()->getMuseumPoints(); + $newDonationCount++; - $em->persist($museumItem); + $em->persist($museumItem); + } + + $donatedItemNames[] = $i->getItem()->getNameWithArticle(); $em->remove($i); } $donationSummary = count($inventory) > 5 ? (count($inventory) . ' items') : ArrayFunctions::list_nice($donatedItemNames); - $transactionService->getMuseumFavor($user, $totalMuseumPoints, 'You donated ' . $donationSummary . ' to the Museum.'); + if($totalMuseumPoints > 0) + $transactionService->getMuseumFavor($user, $totalMuseumPoints, 'You donated ' . $donationSummary . ' to the Museum.'); - $userStatsRepository->incrementStat($user, UserStat::ItemsDonatedToMuseum, count($inventory)); + if($newDonationCount > 0) + $userStatsRepository->incrementStat($user, UserStat::ItemsDonatedToMuseum, $newDonationCount); $em->flush(); diff --git a/src/Controller/Museum/GetDonatableItemsController.php b/src/Controller/Museum/GetDonatableItemsController.php index 44898fc1..ae1f071f 100644 --- a/src/Controller/Museum/GetDonatableItemsController.php +++ b/src/Controller/Museum/GetDonatableItemsController.php @@ -26,6 +26,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use App\Service\UserAccessor; #[Route("/museum")] @@ -35,7 +36,7 @@ class GetDonatableItemsController #[IsGranted("IS_AUTHENTICATED_FULLY")] public function getDonatable( ResponseService $responseService, Request $request, EntityManagerInterface $em, - UserAccessor $userAccessor + UserAccessor $userAccessor, NormalizerInterface $normalizer ): JsonResponse { $user = $userAccessor->getUserOrThrow(); @@ -49,7 +50,8 @@ public function getDonatable( ->leftJoin('i.item', 'item') ->leftJoin('i.enchantmentData', 'enchData') ->andWhere('i.location IN (:locations)') - ->andWhere('item.id NOT IN (SELECT miitem.id FROM App\\Entity\\MuseumItem mi LEFT JOIN mi.item miitem WHERE mi.user=:user)') + ->leftJoin('App\\Entity\\MuseumItem', 'mi', 'WITH', 'mi.item = item AND mi.user = :user') + ->andWhere('(mi.id IS NULL) OR ((mi.createdBy IS NULL OR mi.createdBy != :user) AND i.createdBy = :user)') ->setParameter('locations', [ LocationEnum::Home, LocationEnum::Basement ]) ->setParameter('user', $user) ->addGroupBy('item.id') @@ -82,10 +84,30 @@ public function getDonatable( $results->resultCount = $resultCount; $results->results = $paginator->getQuery()->execute(); - return $responseService->success($results, [ + /** @var Inventory[] $inventories */ + $inventories = $results->results; + + $resultItems = array_map(fn(Inventory $inv) => $inv->getItem(), $inventories); + $existingMuseumItemIds = $em->createQueryBuilder() + ->select('IDENTITY(mi.item)') + ->from(\App\Entity\MuseumItem::class, 'mi') + ->where('mi.user = :user AND mi.item IN (:items)') + ->setParameter('user', $user) + ->setParameter('items', $resultItems) + ->getQuery()->getSingleColumnResult(); + + /** @var array{results: list} $data */ + $data = $normalizer->normalize($results, null, ['groups' => [ SerializationGroupEnum::FILTER_RESULTS, SerializationGroupEnum::MY_INVENTORY, SerializationGroupEnum::MY_DONATABLE_INVENTORY - ]); + ]]); + + foreach ($data['results'] as &$result) { + $result['isUpgrade'] = in_array($result['item']['id'], $existingMuseumItemIds); + } + unset($result); + + return $responseService->success($data); } }