Skip to content

Commit 0aa40cc

Browse files
authored
feat: 위시리스트 조회, 편집, 삭제 기능 구현 (#53)
* feat: wishlist 삭제 기능 추가 * feat: wishlist 조회 기능 추가 * feat: wishlist 편집 기능 추가 * refactor: 일부 API 메서드 변경 * refactor: setter을 제거
1 parent a8e0944 commit 0aa40cc

4 files changed

Lines changed: 97 additions & 1 deletion

File tree

src/main/java/com/amcamp/domain/wishlist/api/WishlistController.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.amcamp.domain.wishlist.api;
22

33
import com.amcamp.domain.wishlist.application.WishlistService;
4-
import com.amcamp.domain.wishlist.dto.request.WishlistCreateRequest;
54
import com.amcamp.domain.wishlist.dto.response.WishlistInfoResponse;
65
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.ResponseEntity;
77
import org.springframework.web.bind.annotation.*;
88
import org.springframework.web.multipart.MultipartFile;
99

10+
import java.util.List;
11+
1012
@RestController
1113
@RequestMapping("/wishlist")
1214
@RequiredArgsConstructor
@@ -19,4 +21,25 @@ public void createWishlist(@RequestPart("title") String title,
1921
@RequestPart("image") MultipartFile file){
2022
wishlistService.createWishlist(title, file);
2123
}
24+
25+
@GetMapping
26+
public List<WishlistInfoResponse> findAllWishlist(){
27+
return wishlistService.findAllWishlist();
28+
}
29+
30+
@PatchMapping("/{wishlistId}")
31+
public ResponseEntity<Void> editWishlist(@PathVariable Long wishlistId,
32+
@RequestPart(value = "title", required = false) String title,
33+
@RequestPart(value = "image", required = false) MultipartFile file){
34+
wishlistService.editWishlist(wishlistId, title, file);
35+
36+
return ResponseEntity.ok().build();
37+
}
38+
39+
@DeleteMapping("/{wishlistId}")
40+
public ResponseEntity<Void> deleteWishlist(@PathVariable Long wishlistId){
41+
wishlistService.deleteWishlist(wishlistId);
42+
43+
return ResponseEntity.ok().build();
44+
}
2245
}

src/main/java/com/amcamp/domain/wishlist/application/WishlistService.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
import com.amcamp.domain.image.application.ImageService;
44
import com.amcamp.domain.member.domain.Member;
5+
import com.amcamp.domain.track.dao.TrackRepository;
56
import com.amcamp.domain.wishlist.dao.WishlistRepository;
67
import com.amcamp.domain.wishlist.domain.Wishlist;
78
import com.amcamp.domain.wishlist.dto.response.WishlistInfoResponse;
9+
import com.amcamp.global.error.exception.CustomException;
10+
import com.amcamp.global.error.exception.ErrorCode;
811
import com.amcamp.global.util.MemberUtil;
912
import lombok.RequiredArgsConstructor;
1013
import org.springframework.stereotype.Service;
1114
import org.springframework.transaction.annotation.Transactional;
1215
import org.springframework.web.multipart.MultipartFile;
1316

17+
import java.util.List;
18+
1419
@Service
1520
@Transactional
1621
@RequiredArgsConstructor
@@ -19,6 +24,7 @@ public class WishlistService {
1924
private final WishlistRepository wishlistRepository;
2025
private final MemberUtil memberUtil;
2126
private final ImageService imageService;
27+
private final TrackRepository trackRepository;
2228

2329
public void createWishlist(String title, MultipartFile file) {
2430
Member member = memberUtil.getCurrentMember();
@@ -30,5 +36,51 @@ public void createWishlist(String title, MultipartFile file) {
3036

3137
new WishlistInfoResponse(wishlist.getId(), wishlist.getTitle(), wishlist.getImageUrl());
3238
}
39+
40+
public void deleteWishlist(Long wishlistId) {
41+
Member currentMember = memberUtil.getCurrentMember();
42+
Wishlist wishlist = findWishlistById(wishlistId);
43+
44+
validateOwnership(wishlist, currentMember);
45+
46+
wishlistRepository.delete(wishlist);
47+
}
48+
49+
public List<WishlistInfoResponse> findAllWishlist() {
50+
Member currentMember = memberUtil.getCurrentMember();
51+
52+
return wishlistRepository.findByMember(currentMember)
53+
.stream()
54+
.map(WishlistInfoResponse::from)
55+
.toList();
56+
}
57+
58+
public void editWishlist(Long wishlistId, String title, MultipartFile file) {
59+
Member currentMember = memberUtil.getCurrentMember();
60+
Wishlist wishlist = findWishlistById(wishlistId);
61+
62+
validateOwnership(wishlist, currentMember);
63+
64+
if (title != null && !title.isBlank()) {
65+
wishlist.updateTitle(title);
66+
}
67+
68+
if (file != null && !file.isEmpty()) {
69+
String imageUrl = imageService.uploadInitWishlistImage(file);
70+
wishlist.updateImageUrl(imageUrl);
71+
imageService.storeImageInfo(imageUrl, wishlist.getId().toString());
72+
}
73+
}
74+
75+
private void validateOwnership(Wishlist wishlist, Member currentMember) {
76+
if (!wishlist.getMember().equals(currentMember)) {
77+
throw new CustomException(ErrorCode.WISHLIST_MEMBER_MISMATCH);
78+
}
79+
}
80+
81+
private Wishlist findWishlistById(Long wishlistId) {
82+
return wishlistRepository.findById(wishlistId)
83+
.orElseThrow(() -> new CustomException((ErrorCode.WISHLIST_NOT_FOUND)));
84+
}
3385
}
3486

src/main/java/com/amcamp/domain/wishlist/domain/Wishlist.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33

44
import com.amcamp.domain.common.model.BaseTimeEntity;
55
import com.amcamp.domain.member.domain.Member;
6+
import com.amcamp.domain.track.domain.Track;
67
import jakarta.persistence.*;
78
import lombok.*;
89

10+
import java.util.ArrayList;
11+
import java.util.List;
12+
913
@Getter
1014
@Setter
1115
@Entity
@@ -27,6 +31,10 @@ public class Wishlist extends BaseTimeEntity {
2731
@JoinColumn(name = "member_id", nullable = false)
2832
private Member member;
2933

34+
@OneToMany(mappedBy = "wishlist", cascade = CascadeType.ALL, orphanRemoval = true)
35+
private List<Track> tracks = new ArrayList<>();
36+
37+
3038
@Builder(access = AccessLevel.PRIVATE)
3139
private Wishlist(Member member, String title, String imageUrl) {
3240
this.member = member;
@@ -37,4 +45,12 @@ private Wishlist(Member member, String title, String imageUrl) {
3745
public static Wishlist createWishlist(Member member, String title, String imageUrl) {
3846
return Wishlist.builder().member(member).title(title).imageUrl(imageUrl).build();
3947
}
48+
49+
public void updateTitle(String title) {
50+
this.title = title;
51+
}
52+
53+
public void updateImageUrl(String imageUrl) {
54+
this.imageUrl = imageUrl;
55+
}
4056
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
package com.amcamp.domain.wishlist.dto.response;
22

3+
import com.amcamp.domain.wishlist.domain.Wishlist;
4+
35
public record WishlistInfoResponse(Long id, String title, String imageUrl) {
6+
public static WishlistInfoResponse from(Wishlist wishlist) {
7+
return new WishlistInfoResponse(wishlist.getId(), wishlist.getTitle(), wishlist.getImageUrl());
8+
}
49
}

0 commit comments

Comments
 (0)