From cdd31fd6b7b39ff8c6d4b98f7db0999e8817b903 Mon Sep 17 00:00:00 2001 From: Patryk Date: Mon, 12 May 2025 19:57:00 +0200 Subject: [PATCH] init wishlist files --- .../controller/WishlistController.java | 67 +++++++++++++++++ .../artisanconnectbackend/dto/NoticeDTO.java | 2 + .../dto/WishlistDTO.java | 12 +++ .../entities/Wishlist.java | 24 ++++++ .../repository/WishlistRepository.java | 18 +++++ .../service/NoticeService.java | 21 +++++- .../service/WishlistService.java | 75 +++++++++++++++++++ 7 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 src/main/java/_11/asktpk/artisanconnectbackend/controller/WishlistController.java create mode 100644 src/main/java/_11/asktpk/artisanconnectbackend/dto/WishlistDTO.java create mode 100644 src/main/java/_11/asktpk/artisanconnectbackend/entities/Wishlist.java create mode 100644 src/main/java/_11/asktpk/artisanconnectbackend/repository/WishlistRepository.java create mode 100644 src/main/java/_11/asktpk/artisanconnectbackend/service/WishlistService.java diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/controller/WishlistController.java b/src/main/java/_11/asktpk/artisanconnectbackend/controller/WishlistController.java new file mode 100644 index 0000000..f312d88 --- /dev/null +++ b/src/main/java/_11/asktpk/artisanconnectbackend/controller/WishlistController.java @@ -0,0 +1,67 @@ +package _11.asktpk.artisanconnectbackend.controller; + +import _11.asktpk.artisanconnectbackend.dto.NoticeDTO; +import _11.asktpk.artisanconnectbackend.dto.RequestResponseDTO; +import _11.asktpk.artisanconnectbackend.dto.WishlistDTO; +import _11.asktpk.artisanconnectbackend.entities.Wishlist; +import _11.asktpk.artisanconnectbackend.service.ClientService; +import _11.asktpk.artisanconnectbackend.service.NoticeService; +import _11.asktpk.artisanconnectbackend.service.WishlistService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/v1/wishlist") +public class WishlistController { + + private final WishlistService wishlistService; + private final ClientService clientService; + private final NoticeService noticeService; + + public WishlistController(WishlistService wishlistService, ClientService clientService, NoticeService noticeService) { + this.wishlistService = wishlistService; + this.clientService = clientService; + this.noticeService = noticeService; + } + + @PostMapping("/toggle") + public ResponseEntity toggleWishlist(@RequestBody WishlistDTO wishlistDTO) { + Long noticeId = wishlistDTO.getNoticeId(); + Long clientId = wishlistDTO.getClientId(); + + NoticeDTO noticeDTO = noticeService.getNoticeById(noticeId); + if (noticeDTO == null) { + return ResponseEntity.badRequest().body(new RequestResponseDTO("Notice not found")); + } + boolean added = wishlistService.toggleWishlist( + clientService.getClientById(clientId), + noticeService.getNoticeByIdEntity(noticeId) + ); + + if (added) { + return ResponseEntity.ok(new RequestResponseDTO("Wishlist entry added")); + } else { + return ResponseEntity.ok(new RequestResponseDTO("Wishlist entry removed")); + } + } + + + + @GetMapping("/{clientId}") + public ResponseEntity> getWishlist(@PathVariable Long clientId) { + List wishlist = wishlistService.getWishlistForClientId(clientId); + return ResponseEntity.ok(wishlist); + } +// +// @GetMapping("/get/all") +// public List getAllNotices() { +// return noticeService.getAllNotices(); +// } +@GetMapping("/") +public List getWishlistForClient() { + Long clientId =1L; + return wishlistService.getNoticesInWishlist(clientId); +} +} \ No newline at end of file diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeDTO.java b/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeDTO.java index a433066..80259db 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeDTO.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeDTO.java @@ -28,6 +28,8 @@ public class NoticeDTO { private List attributesNotices; + private boolean isWishlisted; + public NoticeDTO() { } diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/dto/WishlistDTO.java b/src/main/java/_11/asktpk/artisanconnectbackend/dto/WishlistDTO.java new file mode 100644 index 0000000..669d463 --- /dev/null +++ b/src/main/java/_11/asktpk/artisanconnectbackend/dto/WishlistDTO.java @@ -0,0 +1,12 @@ +package _11.asktpk.artisanconnectbackend.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class WishlistDTO { + private Long id; + private Long clientId; + private Long noticeId; +} \ No newline at end of file diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/entities/Wishlist.java b/src/main/java/_11/asktpk/artisanconnectbackend/entities/Wishlist.java new file mode 100644 index 0000000..4def389 --- /dev/null +++ b/src/main/java/_11/asktpk/artisanconnectbackend/entities/Wishlist.java @@ -0,0 +1,24 @@ +package _11.asktpk.artisanconnectbackend.entities; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "wishlist") +@Getter +@Setter +public class Wishlist { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "client_id", nullable = false) + private Client client; + + @ManyToOne + @JoinColumn(name = "notice_id", nullable = false) + private Notice notice; +} \ No newline at end of file diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/repository/WishlistRepository.java b/src/main/java/_11/asktpk/artisanconnectbackend/repository/WishlistRepository.java new file mode 100644 index 0000000..c3bc132 --- /dev/null +++ b/src/main/java/_11/asktpk/artisanconnectbackend/repository/WishlistRepository.java @@ -0,0 +1,18 @@ +package _11.asktpk.artisanconnectbackend.repository; + +import _11.asktpk.artisanconnectbackend.entities.Client; +import _11.asktpk.artisanconnectbackend.entities.Notice; +import _11.asktpk.artisanconnectbackend.entities.Wishlist; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface WishlistRepository extends JpaRepository { + + List findAllByClientId(Long clientId); + + Optional findByClientAndNotice(Client client, Notice notice); + + Boolean existsByClientAndNotice(Client client, Notice notice); +} \ No newline at end of file diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java b/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java index cf6c884..3c5e6f5 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java @@ -5,24 +5,28 @@ import _11.asktpk.artisanconnectbackend.entities.Notice; import _11.asktpk.artisanconnectbackend.repository.ClientRepository; import _11.asktpk.artisanconnectbackend.repository.NoticeRepository; import _11.asktpk.artisanconnectbackend.dto.NoticeDTO; +import _11.asktpk.artisanconnectbackend.repository.WishlistRepository; import jakarta.persistence.EntityNotFoundException; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service public class NoticeService { private final NoticeRepository noticeRepository; private final ClientRepository clientRepository; + private final WishlistRepository wishlistRepository; - public NoticeService(NoticeRepository noticeRepository, ClientRepository clientRepository) { + public NoticeService(NoticeRepository noticeRepository, ClientRepository clientRepository,WishlistRepository wishlistRepository) { this.noticeRepository = noticeRepository; this.clientRepository = clientRepository; + this.wishlistRepository = wishlistRepository;//serwis zamiast repository } - private Notice fromDTO(NoticeDTO dto) { + public Notice fromDTO(NoticeDTO dto) { Notice notice = new Notice(); notice.setTitle(dto.getTitle()); notice.setDescription(dto.getDescription()); @@ -41,6 +45,12 @@ public class NoticeService { private NoticeDTO toDTO(Notice notice) { NoticeDTO dto = new NoticeDTO(); + Optional client = clientRepository.findById(1L); + boolean isWishlisted = false; + if (client.isPresent()) { + Client c = client.get(); + isWishlisted = wishlistRepository.existsByClientAndNotice(c,notice); + } dto.setNoticeId(notice.getIdNotice()); dto.setTitle(notice.getTitle()); dto.setClientId(notice.getClient().getId()); @@ -50,7 +60,7 @@ public class NoticeService { dto.setStatus(notice.getStatus()); dto.setPublishDate(notice.getPublishDate()); dto.setAttributesNotices(notice.getAttributesNotices()); - + dto.setWishlisted(isWishlisted); return dto; } @@ -67,6 +77,11 @@ public class NoticeService { .orElseThrow(() -> new EntityNotFoundException("Nie znaleziono ogłoszenia o ID: " + id)); return toDTO(notice); } + public Notice getNoticeByIdEntity(Long id) { + Notice notice = noticeRepository.findById(id) + .orElseThrow(() -> new EntityNotFoundException("Nie znaleziono ogłoszenia o ID: " + id)); + return notice; + } public Long addNotice(NoticeDTO dto) { return noticeRepository.save(fromDTO(dto)).getIdNotice(); diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/service/WishlistService.java b/src/main/java/_11/asktpk/artisanconnectbackend/service/WishlistService.java new file mode 100644 index 0000000..2e1577a --- /dev/null +++ b/src/main/java/_11/asktpk/artisanconnectbackend/service/WishlistService.java @@ -0,0 +1,75 @@ +package _11.asktpk.artisanconnectbackend.service; + +import _11.asktpk.artisanconnectbackend.dto.WishlistDTO; +import _11.asktpk.artisanconnectbackend.dto.NoticeDTO; +import _11.asktpk.artisanconnectbackend.service.NoticeService; +import _11.asktpk.artisanconnectbackend.entities.Client; +import _11.asktpk.artisanconnectbackend.entities.Notice; +import _11.asktpk.artisanconnectbackend.entities.Wishlist; +import _11.asktpk.artisanconnectbackend.repository.WishlistRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +@Service +public class WishlistService { + + private final WishlistRepository wishlistRepository; + private final NoticeService noticeService; + + public WishlistService(WishlistRepository wishlistRepository, NoticeService noticeService) { + this.wishlistRepository = wishlistRepository; + this.noticeService = noticeService;//tak robimy + } + + public List getWishlistForClientId(Long clientId) { + List wishlistEntities = wishlistRepository.findAllByClientId(clientId); + return wishlistEntities.stream() + .map(this::toDTO) + .toList(); + } + + public boolean isWishlisted(Client client, Notice notice) { + Optional existingEntry = wishlistRepository.findByClientAndNotice(client, notice); + + if (existingEntry.isPresent()) { + return false; + } else { + return true; + } + } + + public boolean toggleWishlist(Client client, Notice notice) { + Optional existingEntry = wishlistRepository.findByClientAndNotice(client, notice); + + if (existingEntry.isPresent()) { + wishlistRepository.delete(existingEntry.get()); + return false; + } else { + Wishlist wishlist = new Wishlist(); + wishlist.setClient(client); + wishlist.setNotice(notice); + wishlistRepository.save(wishlist); + return true; + } + } + + private WishlistDTO toDTO(Wishlist wishlist) { + WishlistDTO dto = new WishlistDTO(); + dto.setId(wishlist.getId()); + dto.setClientId(wishlist.getClient().getId()); + dto.setNoticeId(wishlist.getNotice().getIdNotice()); + + return dto; + } + + public List getNoticesInWishlist(Long clientId) { + List wishlistEntries = wishlistRepository.findAllByClientId(clientId); + + return wishlistEntries.stream() + .map(wishlist -> noticeService.getNoticeById(wishlist.getNotice().getIdNotice())) + .collect(Collectors.toList()); + + } +} \ No newline at end of file