From 45ef6384d8db822e6d4ba05f62dab7e1c1877ebe Mon Sep 17 00:00:00 2001 From: peachoe Date: Mon, 24 Feb 2025 13:42:55 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20wishlist=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/amcamp/domain/wishlist/Wishlist.java | 34 ++++++++++ .../domain/wishlist/WishlistController.java | 63 +++++++++++++++++++ .../domain/wishlist/WishlistRepository.java | 9 +++ .../domain/wishlist/WishlistService.java | 32 ++++++++++ .../domain/wishlist/dto/WishlistRequest.java | 13 ++++ 5 files changed, 151 insertions(+) create mode 100644 src/main/java/com/amcamp/domain/wishlist/Wishlist.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/WishlistController.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/WishlistService.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java diff --git a/src/main/java/com/amcamp/domain/wishlist/Wishlist.java b/src/main/java/com/amcamp/domain/wishlist/Wishlist.java new file mode 100644 index 0000000..15a007d --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/Wishlist.java @@ -0,0 +1,34 @@ +package com.amcamp.domain.wishlist; + +import com.amcamp.domain.member.domain.Member; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Getter +@Setter +@NoArgsConstructor +public class Wishlist { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "member_id") + private Member member; // ๐Ÿ”น ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด (์นด์นด์˜ค ๋กœ๊ทธ์ธ) + + private String trackName; // ๊ณก๋ช… + private String artist; // ๊ฐ€์ˆ˜๋ช… + private String spotifyId; // Spotify ID + private String albumCoverUrl; // ์•จ๋ฒ” ์ด๋ฏธ์ง€ URL + + public Wishlist(Member member, String trackName, String artist, String spotifyId, String albumCoverUrl) { + this.member = member; + this.trackName = trackName; + this.artist = artist; + this.spotifyId = spotifyId; + this.albumCoverUrl = albumCoverUrl; + } +} diff --git a/src/main/java/com/amcamp/domain/wishlist/WishlistController.java b/src/main/java/com/amcamp/domain/wishlist/WishlistController.java new file mode 100644 index 0000000..f9e7c29 --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/WishlistController.java @@ -0,0 +1,63 @@ +package com.amcamp.domain.wishlist; + +import com.amcamp.domain.member.dao.MemberRepository; +import com.amcamp.domain.member.domain.Member; +import com.amcamp.domain.member.domain.OauthInfo; +import org.springframework.http.ResponseEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/wishlist") +public class WishlistController { + private final WishlistService wishlistService; + private final MemberRepository memberRepository; // ๐Ÿ”น MemberRepository๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ + + @Autowired + public WishlistController(WishlistService wishlistService, MemberRepository memberRepository) { + this.wishlistService = wishlistService; + this.memberRepository = memberRepository; + } + + // ๐Ÿ”น ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ Member ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ (AuthService ์—†์ด MemberRepository ์‚ฌ์šฉ) + private Member getAuthenticatedMember(Authentication authentication) { + if (authentication.getPrincipal() instanceof OidcUser oidcUser) { + OauthInfo oauthInfo = OauthInfo.createOauthInfo(oidcUser.getSubject(), oidcUser.getIssuer().toString()); + return memberRepository.findByOauthInfo(oauthInfo) + .orElseThrow(() -> new RuntimeException("Member not found in database")); + } + throw new RuntimeException("Invalid authentication principal"); + } + + // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ๊ณก ์ถ”๊ฐ€ + @PostMapping("/add") + public ResponseEntity addWishlistItem( + @RequestParam String trackName, + @RequestParam String artist, + @RequestParam String spotifyId, + @RequestParam String albumCoverUrl, + Authentication authentication) { + + Member member = getAuthenticatedMember(authentication); + Wishlist wishlist = wishlistService.addToWishlist(member, trackName, artist, spotifyId, albumCoverUrl); + return ResponseEntity.ok(wishlist); + } + + // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์กฐํšŒ + @GetMapping("/list") + public ResponseEntity> getUserWishlist(Authentication authentication) { + Member member = getAuthenticatedMember(authentication); + return ResponseEntity.ok(wishlistService.getUserWishlist(member)); + } + + // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์‚ญ์ œ + @DeleteMapping("/delete/{id}") + public ResponseEntity removeWishlistItem(@PathVariable Long id) { + wishlistService.removeFromWishlist(id); + return ResponseEntity.ok("์œ„์‹œ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); + } +} diff --git a/src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java b/src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java new file mode 100644 index 0000000..0a7978a --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java @@ -0,0 +1,9 @@ +package com.amcamp.domain.wishlist; + +import com.amcamp.domain.member.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +public interface WishlistRepository extends JpaRepository { + List findByMember(Member member); // ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์กฐํšŒ +} diff --git a/src/main/java/com/amcamp/domain/wishlist/WishlistService.java b/src/main/java/com/amcamp/domain/wishlist/WishlistService.java new file mode 100644 index 0000000..770d6ae --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/WishlistService.java @@ -0,0 +1,32 @@ +package com.amcamp.domain.wishlist; + +import com.amcamp.domain.member.domain.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class WishlistService { + private final WishlistRepository wishlistRepository; + + @Autowired + public WishlistService(WishlistRepository wishlistRepository) { + this.wishlistRepository = wishlistRepository; + } + + // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ๊ณก ์ถ”๊ฐ€ + public Wishlist addToWishlist(Member member, String trackName, String artist, String spotifyId, String albumCoverUrl) { + Wishlist wishlist = new Wishlist(member, trackName, artist, spotifyId, albumCoverUrl); + return wishlistRepository.save(wishlist); + } + + // ๐Ÿ”น ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์กฐํšŒ + public List getUserWishlist(Member member) { + return wishlistRepository.findByMember(member); + } + + // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ์—์„œ ๊ณก ์‚ญ์ œ + public void removeFromWishlist(Long id) { + wishlistRepository.deleteById(id); + } +} diff --git a/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java b/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java new file mode 100644 index 0000000..bdeaec2 --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java @@ -0,0 +1,13 @@ +package com.amcamp.domain.wishlist.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class WishlistRequest { + private String trackName; + private String artist; + private String spotifyId; + private String albumCoverUrl; +} From eda2209c147acc4701f9e728e89b99226c5f07a3 Mon Sep 17 00:00:00 2001 From: peachoe Date: Mon, 24 Feb 2025 16:16:10 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20ERD=EC=97=90=20=EB=A7=9E=EC=B6=B0?= =?UTF-8?q?=20wishlist=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/amcamp/domain/wishlist/Wishlist.java | 34 ---------- .../domain/wishlist/WishlistController.java | 63 ------------------- .../domain/wishlist/WishlistService.java | 32 ---------- .../wishlist/api/WishlistController.java | 55 ++++++++++++++++ .../wishlist/application/WishlistService.java | 46 ++++++++++++++ .../{ => dao}/WishlistRepository.java | 5 +- .../domain/wishlist/domain/Wishlist.java | 42 +++++++++++++ .../domain/wishlist/dto/WishlistRequest.java | 14 +++-- 8 files changed, 154 insertions(+), 137 deletions(-) delete mode 100644 src/main/java/com/amcamp/domain/wishlist/Wishlist.java delete mode 100644 src/main/java/com/amcamp/domain/wishlist/WishlistController.java delete mode 100644 src/main/java/com/amcamp/domain/wishlist/WishlistService.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java rename src/main/java/com/amcamp/domain/wishlist/{ => dao}/WishlistRepository.java (60%) create mode 100644 src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java diff --git a/src/main/java/com/amcamp/domain/wishlist/Wishlist.java b/src/main/java/com/amcamp/domain/wishlist/Wishlist.java deleted file mode 100644 index 15a007d..0000000 --- a/src/main/java/com/amcamp/domain/wishlist/Wishlist.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.amcamp.domain.wishlist; - -import com.amcamp.domain.member.domain.Member; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@Getter -@Setter -@NoArgsConstructor -public class Wishlist { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "member_id") - private Member member; // ๐Ÿ”น ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด (์นด์นด์˜ค ๋กœ๊ทธ์ธ) - - private String trackName; // ๊ณก๋ช… - private String artist; // ๊ฐ€์ˆ˜๋ช… - private String spotifyId; // Spotify ID - private String albumCoverUrl; // ์•จ๋ฒ” ์ด๋ฏธ์ง€ URL - - public Wishlist(Member member, String trackName, String artist, String spotifyId, String albumCoverUrl) { - this.member = member; - this.trackName = trackName; - this.artist = artist; - this.spotifyId = spotifyId; - this.albumCoverUrl = albumCoverUrl; - } -} diff --git a/src/main/java/com/amcamp/domain/wishlist/WishlistController.java b/src/main/java/com/amcamp/domain/wishlist/WishlistController.java deleted file mode 100644 index f9e7c29..0000000 --- a/src/main/java/com/amcamp/domain/wishlist/WishlistController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.amcamp.domain.wishlist; - -import com.amcamp.domain.member.dao.MemberRepository; -import com.amcamp.domain.member.domain.Member; -import com.amcamp.domain.member.domain.OauthInfo; -import org.springframework.http.ResponseEntity; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.core.oidc.user.OidcUser; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/wishlist") -public class WishlistController { - private final WishlistService wishlistService; - private final MemberRepository memberRepository; // ๐Ÿ”น MemberRepository๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ - - @Autowired - public WishlistController(WishlistService wishlistService, MemberRepository memberRepository) { - this.wishlistService = wishlistService; - this.memberRepository = memberRepository; - } - - // ๐Ÿ”น ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ Member ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ (AuthService ์—†์ด MemberRepository ์‚ฌ์šฉ) - private Member getAuthenticatedMember(Authentication authentication) { - if (authentication.getPrincipal() instanceof OidcUser oidcUser) { - OauthInfo oauthInfo = OauthInfo.createOauthInfo(oidcUser.getSubject(), oidcUser.getIssuer().toString()); - return memberRepository.findByOauthInfo(oauthInfo) - .orElseThrow(() -> new RuntimeException("Member not found in database")); - } - throw new RuntimeException("Invalid authentication principal"); - } - - // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ๊ณก ์ถ”๊ฐ€ - @PostMapping("/add") - public ResponseEntity addWishlistItem( - @RequestParam String trackName, - @RequestParam String artist, - @RequestParam String spotifyId, - @RequestParam String albumCoverUrl, - Authentication authentication) { - - Member member = getAuthenticatedMember(authentication); - Wishlist wishlist = wishlistService.addToWishlist(member, trackName, artist, spotifyId, albumCoverUrl); - return ResponseEntity.ok(wishlist); - } - - // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์กฐํšŒ - @GetMapping("/list") - public ResponseEntity> getUserWishlist(Authentication authentication) { - Member member = getAuthenticatedMember(authentication); - return ResponseEntity.ok(wishlistService.getUserWishlist(member)); - } - - // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์‚ญ์ œ - @DeleteMapping("/delete/{id}") - public ResponseEntity removeWishlistItem(@PathVariable Long id) { - wishlistService.removeFromWishlist(id); - return ResponseEntity.ok("์œ„์‹œ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); - } -} diff --git a/src/main/java/com/amcamp/domain/wishlist/WishlistService.java b/src/main/java/com/amcamp/domain/wishlist/WishlistService.java deleted file mode 100644 index 770d6ae..0000000 --- a/src/main/java/com/amcamp/domain/wishlist/WishlistService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.amcamp.domain.wishlist; - -import com.amcamp.domain.member.domain.Member; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import java.util.List; - -@Service -public class WishlistService { - private final WishlistRepository wishlistRepository; - - @Autowired - public WishlistService(WishlistRepository wishlistRepository) { - this.wishlistRepository = wishlistRepository; - } - - // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ๊ณก ์ถ”๊ฐ€ - public Wishlist addToWishlist(Member member, String trackName, String artist, String spotifyId, String albumCoverUrl) { - Wishlist wishlist = new Wishlist(member, trackName, artist, spotifyId, albumCoverUrl); - return wishlistRepository.save(wishlist); - } - - // ๐Ÿ”น ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์กฐํšŒ - public List getUserWishlist(Member member) { - return wishlistRepository.findByMember(member); - } - - // ๐Ÿ”น ์œ„์‹œ๋ฆฌ์ŠคํŠธ์—์„œ ๊ณก ์‚ญ์ œ - public void removeFromWishlist(Long id) { - wishlistRepository.deleteById(id); - } -} diff --git a/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java b/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java new file mode 100644 index 0000000..209692d --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java @@ -0,0 +1,55 @@ +package com.amcamp.domain.wishlist.api; + +import com.amcamp.domain.wishlist.application.WishlistService; +import com.amcamp.domain.wishlist.domain.Wishlist; +import com.amcamp.domain.wishlist.dto.WishlistRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/wishlist") +public class WishlistController { + private final WishlistService wishlistService; + + @Autowired + public WishlistController(WishlistService wishlistService) { + this.wishlistService = wishlistService; + } + + private Long getAuthenticatedMemberId(Authentication authentication) { + if (authentication.getPrincipal() instanceof OidcUser oidcUser) { + return Long.parseLong(oidcUser.getSubject()); + } + throw new RuntimeException("Invalid authentication principal"); + } + + @PostMapping + public ResponseEntity createWishlist( + @RequestBody WishlistRequest request, + Authentication authentication) { + + Long memberId = getAuthenticatedMemberId(authentication); + Wishlist wishlist = wishlistService.createWishlist(memberId, request); + return ResponseEntity.ok(wishlist); + } + + + @GetMapping + public ResponseEntity> getUserWishlist(Authentication authentication) { + Long memberId = getAuthenticatedMemberId(authentication); + return ResponseEntity.ok(wishlistService.getUserWishlist(memberId)); + } + + @GetMapping("/{wishlistId}") + public ResponseEntity getWishlist( + @PathVariable Long wishlistId) { + + Wishlist wishlist = wishlistService.getWishlistById(wishlistId); + return ResponseEntity.ok(wishlist); + } +} diff --git a/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java b/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java new file mode 100644 index 0000000..c7d7c9a --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java @@ -0,0 +1,46 @@ +package com.amcamp.domain.wishlist.application; + +import com.amcamp.domain.member.dao.MemberRepository; +import com.amcamp.domain.member.domain.Member; +import com.amcamp.domain.wishlist.dao.WishlistRepository; +import com.amcamp.domain.wishlist.domain.Wishlist; +import com.amcamp.domain.wishlist.dto.WishlistRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +public class WishlistService { + private final WishlistRepository wishlistRepository; + private final MemberRepository memberRepository; + + @Autowired + public WishlistService(WishlistRepository wishlistRepository, MemberRepository memberRepository) { + this.wishlistRepository = wishlistRepository; + this.memberRepository = memberRepository; + } + + public Wishlist createWishlist(Long memberId, WishlistRequest request) { + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new RuntimeException("Member not found")); + + Wishlist wishlist = Wishlist.from(member, request); + return wishlistRepository.save(wishlist); + } + + public Wishlist getWishlistById(Long wishlistId) { + return wishlistRepository.findById(wishlistId) + .orElseThrow(() -> new RuntimeException("Wishlist not found")); + } + + public List getUserWishlist(Long memberId) { + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new RuntimeException("Member not found")); + + return wishlistRepository.findByMember(member); + } +} + diff --git a/src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java b/src/main/java/com/amcamp/domain/wishlist/dao/WishlistRepository.java similarity index 60% rename from src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java rename to src/main/java/com/amcamp/domain/wishlist/dao/WishlistRepository.java index 0a7978a..d130ce5 100644 --- a/src/main/java/com/amcamp/domain/wishlist/WishlistRepository.java +++ b/src/main/java/com/amcamp/domain/wishlist/dao/WishlistRepository.java @@ -1,9 +1,10 @@ -package com.amcamp.domain.wishlist; +package com.amcamp.domain.wishlist.dao; import com.amcamp.domain.member.domain.Member; +import com.amcamp.domain.wishlist.domain.Wishlist; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface WishlistRepository extends JpaRepository { - List findByMember(Member member); // ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์กฐํšŒ + List findByMember(Member member); } diff --git a/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java b/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java new file mode 100644 index 0000000..c136b09 --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java @@ -0,0 +1,42 @@ +package com.amcamp.domain.wishlist.domain; + + +import com.amcamp.domain.common.model.BaseTimeEntity; +import com.amcamp.domain.member.domain.Member; +import com.amcamp.domain.wishlist.dto.WishlistRequest; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "wishlist") +public class Wishlist extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "wishlist_id") + private Long id; + + @Column(nullable = false, length = 50) + private String title; + + @Column(nullable = false, length = 50) + private String description; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + public Wishlist(Member member, String title, String description) { + this.member = member; + this.title = title; + this.description = description; + } + + public static Wishlist from(Member member, WishlistRequest request) { + return new Wishlist(member, request.getTitle(), request.getDescription()); + } +} \ No newline at end of file diff --git a/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java b/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java index bdeaec2..cdfbfef 100644 --- a/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java +++ b/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java @@ -1,13 +1,15 @@ package com.amcamp.domain.wishlist.dto; + +import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; @Getter -@NoArgsConstructor +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class WishlistRequest { - private String trackName; - private String artist; - private String spotifyId; - private String albumCoverUrl; -} + private String title; + private String description; +} \ No newline at end of file From 369139aee7973fcebb5324803b681cfab5b50655 Mon Sep 17 00:00:00 2001 From: peachoe Date: Mon, 24 Feb 2025 17:39:29 +0900 Subject: [PATCH 3/3] feat: code refactoring --- .../wishlist/api/WishlistController.java | 47 +++---------------- .../wishlist/application/WishlistService.java | 40 ++++------------ .../domain/wishlist/domain/Wishlist.java | 14 ++---- .../domain/wishlist/dto/WishlistRequest.java | 15 ------ .../dto/request/WishlistCreateRequest.java | 6 +++ .../dto/response/WishlistInfoResponse.java | 4 ++ 6 files changed, 31 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/dto/request/WishlistCreateRequest.java create mode 100644 src/main/java/com/amcamp/domain/wishlist/dto/response/WishlistInfoResponse.java diff --git a/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java b/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java index 209692d..1c198b3 100644 --- a/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java +++ b/src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java @@ -1,55 +1,20 @@ package com.amcamp.domain.wishlist.api; import com.amcamp.domain.wishlist.application.WishlistService; -import com.amcamp.domain.wishlist.domain.Wishlist; -import com.amcamp.domain.wishlist.dto.WishlistRequest; -import org.springframework.http.ResponseEntity; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import com.amcamp.domain.wishlist.dto.request.WishlistCreateRequest; +import com.amcamp.domain.wishlist.dto.response.WishlistInfoResponse; +import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import java.util.List; - @RestController @RequestMapping("/wishlist") +@RequiredArgsConstructor public class WishlistController { private final WishlistService wishlistService; - @Autowired - public WishlistController(WishlistService wishlistService) { - this.wishlistService = wishlistService; - } - - private Long getAuthenticatedMemberId(Authentication authentication) { - if (authentication.getPrincipal() instanceof OidcUser oidcUser) { - return Long.parseLong(oidcUser.getSubject()); - } - throw new RuntimeException("Invalid authentication principal"); - } @PostMapping - public ResponseEntity createWishlist( - @RequestBody WishlistRequest request, - Authentication authentication) { - - Long memberId = getAuthenticatedMemberId(authentication); - Wishlist wishlist = wishlistService.createWishlist(memberId, request); - return ResponseEntity.ok(wishlist); - } - - - @GetMapping - public ResponseEntity> getUserWishlist(Authentication authentication) { - Long memberId = getAuthenticatedMemberId(authentication); - return ResponseEntity.ok(wishlistService.getUserWishlist(memberId)); - } - - @GetMapping("/{wishlistId}") - public ResponseEntity getWishlist( - @PathVariable Long wishlistId) { - - Wishlist wishlist = wishlistService.getWishlistById(wishlistId); - return ResponseEntity.ok(wishlist); + public WishlistInfoResponse createWishlist(@RequestBody WishlistCreateRequest request){ + return wishlistService.createWishlist(request); } } diff --git a/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java b/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java index c7d7c9a..49770db 100644 --- a/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java +++ b/src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java @@ -1,46 +1,26 @@ package com.amcamp.domain.wishlist.application; -import com.amcamp.domain.member.dao.MemberRepository; import com.amcamp.domain.member.domain.Member; import com.amcamp.domain.wishlist.dao.WishlistRepository; import com.amcamp.domain.wishlist.domain.Wishlist; -import com.amcamp.domain.wishlist.dto.WishlistRequest; -import org.springframework.beans.factory.annotation.Autowired; +import com.amcamp.domain.wishlist.dto.request.WishlistCreateRequest; +import com.amcamp.domain.wishlist.dto.response.WishlistInfoResponse; +import com.amcamp.global.util.MemberUtil; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Service @Transactional +@RequiredArgsConstructor public class WishlistService { private final WishlistRepository wishlistRepository; - private final MemberRepository memberRepository; - - @Autowired - public WishlistService(WishlistRepository wishlistRepository, MemberRepository memberRepository) { - this.wishlistRepository = wishlistRepository; - this.memberRepository = memberRepository; - } - - public Wishlist createWishlist(Long memberId, WishlistRequest request) { - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new RuntimeException("Member not found")); - - Wishlist wishlist = Wishlist.from(member, request); - return wishlistRepository.save(wishlist); - } - - public Wishlist getWishlistById(Long wishlistId) { - return wishlistRepository.findById(wishlistId) - .orElseThrow(() -> new RuntimeException("Wishlist not found")); - } - - public List getUserWishlist(Long memberId) { - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new RuntimeException("Member not found")); + private final MemberUtil memberUtil; - return wishlistRepository.findByMember(member); + public WishlistInfoResponse createWishlist(WishlistCreateRequest request) { + Member member = memberUtil.getCurrentMember(); + Wishlist wishlist = wishlistRepository.save(Wishlist.createWishlist(member, request.title())); + return new WishlistInfoResponse(wishlist.getId(), wishlist.getTitle()); } } diff --git a/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java b/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java index c136b09..806bc57 100644 --- a/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java +++ b/src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java @@ -3,16 +3,15 @@ import com.amcamp.domain.common.model.BaseTimeEntity; import com.amcamp.domain.member.domain.Member; -import com.amcamp.domain.wishlist.dto.WishlistRequest; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "wishlist") public class Wishlist extends BaseTimeEntity { @Id @@ -23,20 +22,17 @@ public class Wishlist extends BaseTimeEntity { @Column(nullable = false, length = 50) private String title; - @Column(nullable = false, length = 50) - private String description; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false) private Member member; - public Wishlist(Member member, String title, String description) { + @Builder(access = AccessLevel.PRIVATE) + private Wishlist(Member member, String title) { this.member = member; this.title = title; - this.description = description; } - public static Wishlist from(Member member, WishlistRequest request) { - return new Wishlist(member, request.getTitle(), request.getDescription()); + public static Wishlist createWishlist(Member member, String title) { + return Wishlist.builder().member(member).title(title).build(); } } \ No newline at end of file diff --git a/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java b/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java deleted file mode 100644 index cdfbfef..0000000 --- a/src/main/java/com/amcamp/domain/wishlist/dto/WishlistRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.amcamp.domain.wishlist.dto; - - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class WishlistRequest { - private String title; - private String description; -} \ No newline at end of file diff --git a/src/main/java/com/amcamp/domain/wishlist/dto/request/WishlistCreateRequest.java b/src/main/java/com/amcamp/domain/wishlist/dto/request/WishlistCreateRequest.java new file mode 100644 index 0000000..f76e58f --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/dto/request/WishlistCreateRequest.java @@ -0,0 +1,6 @@ +package com.amcamp.domain.wishlist.dto.request; + + + +public record WishlistCreateRequest(String title) { +} \ No newline at end of file diff --git a/src/main/java/com/amcamp/domain/wishlist/dto/response/WishlistInfoResponse.java b/src/main/java/com/amcamp/domain/wishlist/dto/response/WishlistInfoResponse.java new file mode 100644 index 0000000..918ee71 --- /dev/null +++ b/src/main/java/com/amcamp/domain/wishlist/dto/response/WishlistInfoResponse.java @@ -0,0 +1,4 @@ +package com.amcamp.domain.wishlist.dto.response; + +public record WishlistInfoResponse(Long id, String title) { +}