diff --git a/server/web_app/public/js/users.js b/server/web_app/public/js/users.js index 6d4fdae57ed5c1c89db90b194f38209c5459780e..b06d70b4877f5a1e81ef5c7b6e5374e15da4e5a0 100644 --- a/server/web_app/public/js/users.js +++ b/server/web_app/public/js/users.js @@ -1,4 +1,4 @@ -const ROUTE = 'http://localhost'; +const ROUTE = 'http://34.28.79.61'; const PORT = '8080'; let currentAction = null; let currentUserId = null; diff --git a/server/web_app/src/Controller/ItemController.php b/server/web_app/src/Controller/ItemController.php index 15d28288db2f3efbc61e21f59162558d73881945..0eb23a951491359b1c0b61ba9f8bbc631fc7c175 100644 --- a/server/web_app/src/Controller/ItemController.php +++ b/server/web_app/src/Controller/ItemController.php @@ -2,7 +2,9 @@ namespace App\Controller; +use App\Entity\Item; use App\Repository\ItemRepository; +use App\Repository\WishListRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; @@ -17,15 +19,18 @@ final class ItemController extends AbstractController { private EntityManagerInterface $entityManager; private ItemRepository $itemRepository; + private WishListRepository $wishListRepository; private ValidatorInterface $validator; public function __construct( EntityManagerInterface $entityManager, ItemRepository $itemRepository, + WishListRepository $wishListRepository, ValidatorInterface $validator ) { $this->entityManager = $entityManager; $this->itemRepository = $itemRepository; + $this->wishListRepository = $wishListRepository; $this->validator = $validator; } @@ -112,47 +117,248 @@ final class ItemController extends AbstractController } #[Route('/{itemId}', methods: ['GET'])] -public function getItemsById($itemId): JsonResponse -{ - $item = $this->itemRepository->findOneById($itemId); + public function getItemsById($itemId): JsonResponse + { + $item = $this->itemRepository->findOneById($itemId); - if (!$item) { - return new JsonResponse(['error' => 'Item not found'], Response::HTTP_NOT_FOUND); - } + if (!$item) { + return new JsonResponse(['error' => 'Item not found'], Response::HTTP_NOT_FOUND); + } + + $wishList = $item->getWishList(); + $user = $wishList->getUser(); // Assuming a wishlist has an associated user - $wishList = $item->getWishList(); - $user = $wishList->getUser(); // Assuming a wishlist has an associated user - - $itemDTO = [ - 'id' => $item->getId(), - 'wishList' => [ - 'id' => $wishList->getId(), - 'user' => [ - 'id' => $user->getId(), - 'username' => $user->getUserName(), - 'mail' => $user->getEmail(), - 'role' => $user->getRoles(), - 'isBlocked' => $user->isBlocked(), - 'createdAt' => $user->getCreatedAt()->format('Y-m-d H:i:s'), + $itemDTO = [ + 'id' => $item->getId(), + 'wishList' => [ + 'id' => $wishList->getId(), + 'user' => [ + 'id' => $user->getId(), + 'username' => $user->getUserName(), + 'mail' => $user->getEmail(), + 'role' => $user->getRoles(), + 'isBlocked' => $user->isBlocked(), + 'createdAt' => $user->getCreatedAt()->format('Y-m-d H:i:s'), + ], + 'name' => $wishList->getName(), + 'description' => $wishList->getDescription(), + 'expirationDate' => $wishList->getExpirationDate()->format('Y-m-d'), + 'isActive' => $wishList->isActive(), + 'createdAt' => $wishList->getCreatedAt()->format('Y-m-d H:i:s'), ], - 'name' => $wishList->getName(), - 'description' => $wishList->getDescription(), - 'expirationDate' => $wishList->getExpirationDate()->format('Y-m-d'), - 'isActive' => $wishList->isActive(), - 'createdAt' => $wishList->getCreatedAt()->format('Y-m-d H:i:s'), - ], - 'title' => $item->getTitle(), - 'description' => $item->getDescription(), - 'price' => $item->getPrice(), - 'purchaseUrl' => $item->getPurchaseUrl(), - 'createdAt' => $item->getCreatedAt()->format('Y-m-d H:i:s'), - ]; - - return $this->json([ - 'item' => $itemDTO, - 'path' => 'src/Controller/ItemController.php', - ]); -} + 'title' => $item->getTitle(), + 'description' => $item->getDescription(), + 'price' => $item->getPrice(), + 'purchaseUrl' => $item->getPurchaseUrl(), + 'createdAt' => $item->getCreatedAt()->format('Y-m-d H:i:s'), + ]; + + return $this->json([ + 'item' => $itemDTO, + 'path' => 'src/Controller/ItemController.php', + ]); + } + + // NEW METHODS + #[Route('', methods: ['POST'])] + public function createItem(Request $request): JsonResponse + { + $data = json_decode($request->getContent(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + return new JsonResponse( + ['error' => 'Invalid JSON payload'], + Response::HTTP_BAD_REQUEST + ); + } + + // Check required fields + if (!isset($data['title']) || !isset($data['price']) || !isset($data['wishList'])) { + return new JsonResponse( + ['error' => 'Missing required fields: title, price and wishList are required'], + Response::HTTP_BAD_REQUEST + ); + } + + $item = new Item(); + + try { + $wishList = $this->wishListRepository->findOneById($data['wishList']); + if (!$wishList) { + return new JsonResponse( + ['error' => 'WishList not found'], + Response::HTTP_BAD_REQUEST + ); + } + $item->setWishList($wishList); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Invalid wishList: ' . $e->getMessage()], + Response::HTTP_BAD_REQUEST + ); + } + + $item->setTitle($data['title']); + $item->setDescription($data['description'] ?? null); + $item->setPrice((float)$data['price']); + $item->setPurchaseUrl($data['purchaseUrl'] ?? null); + $item->setCreatedAt(new \DateTimeImmutable()); + + // Validate using ValidatorInterface + $errors = $this->validator->validate($item); + + if (count($errors) > 0) { + $errorMessages = []; + foreach ($errors as $error) { + $errorMessages[$error->getPropertyPath()] = $error->getMessage(); + } + return new JsonResponse( + ['validation_errors' => $errorMessages], + Response::HTTP_UNPROCESSABLE_ENTITY + ); + } + + try { + $this->entityManager->persist($item); + $this->entityManager->flush(); + + return new JsonResponse([ + 'id' => $item->getId(), + 'title' => $item->getTitle(), + 'price' => $item->getPrice(), + 'wishListId' => $item->getWishList()->getId(), + 'createdAt' => $item->getCreatedAt()->format('Y-m-d H:i:s'), + 'path' => 'src/Controller/ItemController.php' + ], Response::HTTP_CREATED); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Failed to create item: ' . $e->getMessage()], + Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + } + + #[Route('/{id}', methods: ['PATCH'])] + public function updateItem(int $id, Request $request): JsonResponse + { + $item = $this->itemRepository->findOneById($id); + + if (!$item) { + return new JsonResponse( + ['error' => 'Item not found'], + Response::HTTP_NOT_FOUND + ); + } + + $data = json_decode($request->getContent(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + return new JsonResponse( + ['error' => 'Invalid JSON payload'], + Response::HTTP_BAD_REQUEST + ); + } + + if (isset($data['title'])) { + $item->setTitle($data['title']); + } + + if (isset($data['description'])) { + $item->setDescription($data['description']); + } + + if (isset($data['price'])) { + $item->setPrice((float)$data['price']); + } + + if (isset($data['purchaseUrl'])) { + $item->setPurchaseUrl($data['purchaseUrl']); + } + + if (isset($data['wishList'])) { + try { + $wishList = $this->wishListRepository->findOneById($data['wishList']); + if (!$wishList) { + return new JsonResponse( + ['error' => 'WishList not found'], + Response::HTTP_BAD_REQUEST + ); + } + $item->setWishList($wishList); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Invalid wishList: ' . $e->getMessage()], + Response::HTTP_BAD_REQUEST + ); + } + } + + // Validate using ValidatorInterface + $errors = $this->validator->validate($item); + + if (count($errors) > 0) { + $errorMessages = []; + foreach ($errors as $error) { + $errorMessages[$error->getPropertyPath()] = $error->getMessage(); + } + return new JsonResponse( + ['validation_errors' => $errorMessages], + Response::HTTP_UNPROCESSABLE_ENTITY + ); + } + + try { + $this->entityManager->flush(); + + return new JsonResponse([ + 'message' => "sucessfully updated !", + 'item' => [ + 'id' => $item->getId(), + 'title' => $item->getTitle(), + 'price' => $item->getPrice(), + 'wishListId' => $item->getWishList()->getId(), + 'updatedAt' => (new \DateTimeImmutable())->format('Y-m-d H:i:s'), + ], + 'path' => 'src/Controller/ItemController.php' + ]); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Failed to update item: ' . $e->getMessage()], + Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + } + + #[Route('/{id}', methods: ['DELETE'])] + public function deleteItem(int $id): JsonResponse + { + $item = $this->itemRepository->findOneById($id); + + if (!$item) { + return new JsonResponse( + ['error' => 'Item not found'], + Response::HTTP_NOT_FOUND + ); + } + + try { + $this->entityManager->remove($item); + $this->entityManager->flush(); + + return new JsonResponse( + [ + 'message' => "successfully deleted", + 'path' => 'src/Controller/ItemController.php', + ], + Response::HTTP_OK + ); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Failed to delete item: ' . $e->getMessage()], + Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + } diff --git a/server/web_app/src/Controller/WishListController.php b/server/web_app/src/Controller/WishListController.php index 8a888468f28cc4bd57cd79147d01fede94ffea91..946e06d2a88a2c01a2ab7679a4d93e4945380a9d 100644 --- a/server/web_app/src/Controller/WishListController.php +++ b/server/web_app/src/Controller/WishListController.php @@ -7,8 +7,10 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; +use App\Entity\WishList; use App\Repository\WishListRepository; use App\Repository\ItemRepository; +use App\Repository\UserRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Component\HttpFoundation\Request; @@ -19,17 +21,20 @@ final class WishListController extends AbstractController private EntityManagerInterface $entityManager; private WishListRepository $wishListRepository; private ItemRepository $itemRepository; + private UserRepository $userRepository; private ValidatorInterface $validator; public function __construct( EntityManagerInterface $entityManager, WishListRepository $wishListRepository, ItemRepository $itemRepository, + UserRepository $userRepository, ValidatorInterface $validator ) { $this->entityManager = $entityManager; $this->wishListRepository = $wishListRepository; $this->itemRepository = $itemRepository; + $this->userRepository = $userRepository; $this->validator = $validator; } @@ -165,6 +170,201 @@ final class WishListController extends AbstractController ]); } + // NEW METHODS + #[Route('', methods: ['POST'])] + public function createWishList(Request $request): JsonResponse + { + $data = json_decode($request->getContent(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + return new JsonResponse( + ['error' => 'Invalid JSON payload'], + Response::HTTP_BAD_REQUEST + ); + } + + $wishList = new WishList(); + + if (isset($data['user'])) { + try { + $user = $this->userRepository->findOneById($data['user']); + $wishList->setUser($user); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Invalid user id' . $e ], + Response::HTTP_BAD_REQUEST + ); + } + } + + $wishList->setName($data['name'] ?? ''); + $wishList->setDescription($data['description'] ?? null); + + if (isset($data['expirationDate'])) { + try { + $wishList->setExpirationDate(new \DateTime($data['expirationDate'])); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Invalid expiration date format'], + Response::HTTP_BAD_REQUEST + ); + } + } + + $wishList->setIsActive($data['isActive'] ?? true); + $wishList->setUrlViewMode($data['urlViewMode'] ?? 'http://urlViewMode.com'); + $wishList->setUrlEditMode($data['urlEditMode'] ?? 'http://urlEditMode.com'); + $wishList->setCreatedAt(new \DateTimeImmutable()); + + // Validate using ValidatorInterface + $errors = $this->validator->validate($wishList); + + if (count($errors) > 0) { + $errorMessages = []; + foreach ($errors as $error) { + $errorMessages[$error->getPropertyPath()] = $error->getMessage(); + } + return new JsonResponse( + ['validation_errors' => $errorMessages], + Response::HTTP_UNPROCESSABLE_ENTITY + ); + } + + try { + $this->entityManager->persist($wishList); + $this->entityManager->flush(); + + return new JsonResponse([ + 'id' => $wishList->getId(), + 'name' => $wishList->getName(), + 'description' => $wishList->getDescription(), + 'isActive' => $wishList->isActive(), + 'createdAt' => $wishList->getCreatedAt()->format('Y-m-d H:i:s'), + 'path' => 'src/Controller/WishListController.php' + ], Response::HTTP_CREATED); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Failed to create wishlist: ' . $e->getMessage()], + Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + } + + #[Route('/{id}', methods: ['PATCH'])] + public function updateWishList(int $id, Request $request): JsonResponse + { + $wishList = $this->wishListRepository->find($id); + + if (!$wishList) { + return new JsonResponse( + ['error' => 'Wishlist not found'], + Response::HTTP_NOT_FOUND + ); + } + + $data = json_decode($request->getContent(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + return new JsonResponse( + ['error' => 'Invalid JSON payload'], + Response::HTTP_BAD_REQUEST + ); + } + + if (isset($data['name'])) { + $wishList->setName($data['name']); + } + + if (isset($data['description'])) { + $wishList->setDescription($data['description']); + } + + if (isset($data['expirationDate'])) { + try { + $wishList->setExpirationDate(new \DateTime($data['expirationDate'])); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Invalid expiration date format'], + Response::HTTP_BAD_REQUEST + ); + } + } + + if (isset($data['isActive'])) { + $wishList->setIsActive($data['isActive']); + } + + if (isset($data['urlViewMode'])) { + $wishList->setUrlViewMode($data['urlViewMode']); + } + + if (isset($data['urlEditMode'])) { + $wishList->setUrlEditMode($data['urlEditMode']); + } + + // Validate using ValidatorInterface + $errors = $this->validator->validate($wishList); + + if (count($errors) > 0) { + $errorMessages = []; + foreach ($errors as $error) { + $errorMessages[$error->getPropertyPath()] = $error->getMessage(); + } + return new JsonResponse( + ['validation_errors' => $errorMessages], + Response::HTTP_UNPROCESSABLE_ENTITY + ); + } + try { + $this->entityManager->flush(); + return new JsonResponse([ + 'message' => 'WishList updated successfully', + 'wishList' => [ + 'id' => $wishList->getId(), + 'name' => $wishList->getName(), + 'description' => $wishList->getDescription(), + 'isActive' => $wishList->isActive(), + 'updatedAt' => (new \DateTimeImmutable())->format('Y-m-d H:i:s') + ] + ]); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Failed to update wishlist: ' . $e->getMessage()], + Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + } + + #[Route('/{id}', methods: ['DELETE'])] + public function deleteWishList(int $id): JsonResponse + { + $wishList = $this->wishListRepository->find($id); + + if (!$wishList) { + return new JsonResponse( + ['error' => 'Wishlist not found'], + Response::HTTP_NOT_FOUND + ); + } + + try { + $this->entityManager->remove($wishList); + $this->entityManager->flush(); + + return new JsonResponse( + [ + 'message' => 'WishList deleted successfully', + 'path' => 'src/Controller/WishListController.php', + ], + Response::HTTP_OK + ); + } catch (\Exception $e) { + return new JsonResponse( + ['error' => 'Failed to delete wishlist: ' . $e->getMessage()], + Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + } } diff --git a/server/web_app/src/DataFixtures/PurchaseFixtures.php b/server/web_app/src/DataFixtures/PurchaseFixtures.php index c8cfe609622905ac141651ff62ace5025c87b2b2..9f13a0b39db08e2c7e05a73326bea7813d106c92 100644 --- a/server/web_app/src/DataFixtures/PurchaseFixtures.php +++ b/server/web_app/src/DataFixtures/PurchaseFixtures.php @@ -64,25 +64,7 @@ class PurchaseFixtures extends Fixture implements DependentFixtureInterface 'item' => $items[6], // Mechanical Keyboard 'url_proof' => 'https://example.com/proof7.jpg', 'message' => 'Enjoy your gift!', - ], - [ - 'user' => $users[9], - 'item' => $items[7], // E-Reader - 'url_proof' => 'https://example.com/proof8.jpg', - 'message' => 'Something I thought you’d love!', - ], - [ - 'user' => $users[5], - 'item' => $items[8], // Noise Cancelling Earbuds - 'url_proof' => 'https://example.com/proof9.jpg', - 'message' => 'A special gift for a special person!', - ], - [ - 'user' => $users[2], - 'item' => $items[9], // Camera Drone - 'url_proof' => 'https://example.com/proof10.jpg', - 'message' => 'Just a small token of appreciation!', - ], + ] ]; foreach ($purchasesData as $data) {