Skip to content

Commit 85d84e9

Browse files
authored
Merge pull request #123 from freeMates/20250607_#122_기능추가_좋아요_bookmark랑_코스에_좋아요부재
course랑 북마크 좋아요기능 추가 toggle
2 parents 73018f7 + ef9d241 commit 85d84e9

20 files changed

Lines changed: 357 additions & 164 deletions

src/main/java/jombi/freemates/controller/BookmarkController.java

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@
1010
import jombi.freemates.model.constant.PinColor;
1111
import jombi.freemates.model.constant.Visibility;
1212
import jombi.freemates.model.dto.BookmarkRequest;
13-
import jombi.freemates.model.dto.BookmarkResponse;
13+
import jombi.freemates.model.dto.BookmarkDto;
1414
import jombi.freemates.model.dto.CustomUserDetails;
1515
import jombi.freemates.model.dto.PlaceDto;
1616
import jombi.freemates.service.BookmarkService;
1717
import jombi.freemates.util.docs.ApiChangeLog;
1818
import jombi.freemates.util.docs.ApiChangeLogs;
19-
import lombok.Builder.Default;
2019
import lombok.RequiredArgsConstructor;
2120
import lombok.extern.slf4j.Slf4j;
2221
import org.springframework.data.domain.Page;
@@ -78,7 +77,7 @@ public class BookmarkController {
7877
@PostMapping(value = "/create",
7978
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
8079
@ResponseStatus(HttpStatus.CREATED)
81-
public ResponseEntity<BookmarkResponse> create(
80+
public ResponseEntity<BookmarkDto> create(
8281
@RequestParam String title,
8382
@RequestParam String description,
8483
@RequestParam PinColor pinColor,
@@ -88,13 +87,14 @@ public ResponseEntity<BookmarkResponse> create(
8887
MultipartFile image,
8988
@AuthenticationPrincipal CustomUserDetails user
9089
) {
91-
BookmarkRequest req = new BookmarkRequest();
92-
req.setTitle(title);
93-
req.setDescription(description);
94-
req.setPinColor(pinColor);
95-
req.setVisibility(visibility);
96-
BookmarkResponse response = bookmarkService.create(user, req, image);
97-
return ResponseEntity.status(HttpStatus.CREATED).body(response);
90+
BookmarkRequest req = BookmarkRequest.builder()
91+
.title(title)
92+
.description(description)
93+
.pinColor(pinColor)
94+
.visibility(visibility)
95+
.build();
96+
BookmarkDto dto = bookmarkService.create(user, req, image);
97+
return ResponseEntity.status(HttpStatus.CREATED).body(dto);
9898
}
9999

100100
@ApiChangeLogs({
@@ -123,7 +123,7 @@ public ResponseEntity<BookmarkResponse> create(
123123
"""
124124
)
125125
@GetMapping("/mylist")
126-
public List<BookmarkResponse> getMyBookmarks(
126+
public List<BookmarkDto> getMyBookmarks(
127127
@AuthenticationPrincipal CustomUserDetails customUserDetails
128128
) {
129129
return bookmarkService.getMyBookmarks(customUserDetails);
@@ -161,13 +161,13 @@ public List<BookmarkResponse> getMyBookmarks(
161161
"""
162162
)
163163
@GetMapping("/list")
164-
public ResponseEntity<Page<BookmarkResponse>> getBookmarks(
164+
public ResponseEntity<Page<BookmarkDto>> getBookmarks(
165165
@RequestParam(defaultValue = "0") int page,
166166
@RequestParam(defaultValue = "10") int size,
167167
@RequestParam(defaultValue = "PUBLIC") Visibility visibility
168168
) {
169169
log.debug("page:{}, size:{}, visibility:{}", page, size, visibility);
170-
Page<BookmarkResponse> bookmarks = bookmarkService.getBookmarks(page, size, visibility);
170+
Page<BookmarkDto> bookmarks = bookmarkService.getBookmarks(page, size, visibility);
171171
return ResponseEntity.ok(bookmarks);
172172
}
173173

@@ -215,34 +215,39 @@ public ResponseEntity<Void> addPlaceToBookmark(
215215
bookmarkService.addPlaceToBookmark(customUserDetails, bookmarkId, placeId);
216216
return ResponseEntity.ok().build(); // 혹은 204 No Content
217217
}
218+
218219
@ApiChangeLogs({
219220
@ApiChangeLog(
220-
date = "2025-06-05",
221+
date = "2025-06-06",
221222
author = Author.LEEDAYE,
222-
issueNumber = 114,
223-
description = "북마크에 따른 장소 목록 가져오기"
223+
issueNumber = 105,
224+
description = "좋아요~"
224225
)
225226
})
226227
@Operation(
227-
summary = "북마크에 따른 장소 목록 가져오기",
228+
summary = "북마크 좋아요",
228229
description = """
229230
## 인증(JWT): **필요**
230231
231232
## 요청 파라미터
232233
- **Path Variable**
233-
- `bookmarkId` (UUID): 북마크 ID
234+
- `bookmarkId` (UUID): 좋아요를 누를 즐겨찾기 ID
234235
235-
## 반환값 (`List<PlaceDto>`)
236-
- 즐겨찾기에 추가된 장소 목록
236+
## 반환값
237+
- **HTTP Status 200 OK** (혹은 204 No Content)
237238
238239
## 에러코드
239-
- `BOOKMARK_NOT_FOUND (404)`: 존재하지 않는 북마크입니다.
240+
- `UNAUTHORIZED (401)`: 인증되지 않은 사용자입니다.
241+
- 'BOOKMARK_NOT_FOUND (404)': 존재하지 않는 북마크입니다.
240242
"""
241243
)
242-
243-
@GetMapping("/places/{bookmarkId}")
244-
public List<PlaceDto> getPlaces(@PathVariable UUID bookmarkId) {
245-
return bookmarkService.getPlacesByBookmarkId(bookmarkId);
244+
@PostMapping("/like/{bookmarkId}")
245+
public ResponseEntity<Void> likeBookmark(
246+
@AuthenticationPrincipal CustomUserDetails customUserDetails,
247+
@PathVariable("bookmarkId") UUID bookmarkId
248+
) {
249+
bookmarkService.likeBookmark(customUserDetails, bookmarkId);
250+
return ResponseEntity.ok().build(); // 혹은 204 No Content
246251
}
247252

248253
}

src/main/java/jombi/freemates/controller/CourseController.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.springframework.http.ResponseEntity;
2323
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2424
import org.springframework.web.bind.annotation.GetMapping;
25+
import org.springframework.web.bind.annotation.PathVariable;
2526
import org.springframework.web.bind.annotation.PostMapping;
2627
import org.springframework.web.bind.annotation.RequestMapping;
2728
import org.springframework.web.bind.annotation.RequestParam;
@@ -182,6 +183,44 @@ public ResponseEntity<Page<CourseDto>> getCourses(
182183
return ResponseEntity.ok(pagedCourses);
183184
}
184185

186+
/**
187+
* 코스 좋아요
188+
*/
189+
@ApiChangeLogs({
190+
@ApiChangeLog(
191+
date = "2025-06-06",
192+
author = Author.LEEDAYE,
193+
issueNumber = 105,
194+
description = "코스 좋아요 추가/취소"
195+
)
196+
})
197+
@Operation(
198+
summary = "코스 좋아요",
199+
description = """
200+
## 인증(JWT): **필요**
201+
202+
## 요청 파라미터
203+
- **Path Variable**
204+
- `courseId` (UUID): 좋아요를 누를 코스 ID
205+
206+
## 반환값
207+
- **HTTP Status 200 OK** (혹은 204 No Content)
208+
209+
## 에러코드
210+
- `UNAUTHORIZED (401)`: 인증되지 않은 사용자입니다.
211+
- `COURSE_NOT_FOUND (404)`: 존재하지 않는 코스입니다.
212+
"""
213+
)
214+
@PostMapping("/like/{courseId}")
215+
public ResponseEntity<Void> likeCourse(
216+
@AuthenticationPrincipal CustomUserDetails customUserDetails,
217+
@PathVariable("courseId") UUID courseId
218+
) {
219+
courseService.likeCourse(customUserDetails, courseId);
220+
return ResponseEntity.ok().build();
221+
}
222+
223+
185224

186225

187226

src/main/java/jombi/freemates/controller/PlaceController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.swagger.v3.oas.annotations.tags.Tag;
55
import jombi.freemates.model.constant.Author;
66
import jombi.freemates.model.constant.CategoryType;
7-
import jombi.freemates.model.dto.GeoCodePlaceDto;
87
import jombi.freemates.model.dto.PlaceDto;
98
import jombi.freemates.model.postgres.Place;
109
import jombi.freemates.service.PlaceService;
@@ -113,7 +112,7 @@ public ResponseEntity<Page<PlaceDto>> getPlacesByCategory(
113112
"""
114113
)
115114
@GetMapping("/geocode")
116-
public ResponseEntity<GeoCodePlaceDto> getPlaceByGeocode(
115+
public ResponseEntity<PlaceDto> getPlaceByGeocode(
117116
@RequestParam String x,
118117
@RequestParam String y
119118
) {

src/main/java/jombi/freemates/model/dto/BookmarkResponse.java renamed to src/main/java/jombi/freemates/model/dto/BookmarkDto.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package jombi.freemates.model.dto;
22

3+
import java.util.List;
34
import java.util.UUID;
45
import jombi.freemates.model.constant.PinColor;
56
import jombi.freemates.model.constant.Visibility;
@@ -16,7 +17,7 @@
1617
@Setter
1718
@AllArgsConstructor
1819
@NoArgsConstructor
19-
public class BookmarkResponse {
20+
public class BookmarkDto {
2021

2122
private UUID bookmarkId;
2223
private String imageUrl;
@@ -26,5 +27,9 @@ public class BookmarkResponse {
2627
private Visibility visibility;
2728
private UUID memberId;
2829
private String nickname;
30+
private Long likeCount; // 좋아요 수
31+
32+
private List<PlaceDto> placeDtos;
33+
2934

3035
}

src/main/java/jombi/freemates/model/dto/CourseDto.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,10 @@ public class CourseDto {
3939
@Schema(description = "이미지 URL (업로드한 경우)")
4040
private String imageUrl;
4141

42-
43-
@Schema(description = "해당 코스에 포함된 장소들의 ID 리스트")
44-
private List<UUID> placeIds;
45-
4642
@Schema(description = "해당 코스에 포함된 장소들의 상세 정보 리스트")
47-
private List<CoursePlaceDto> coursePlaceDtos;
43+
private List<PlaceDto> placeDtos;
44+
45+
@Schema(description = "코스 좋아요 수")
46+
private Long likeCount;
4847

4948
}

src/main/java/jombi/freemates/model/dto/CoursePlaceDto.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java/jombi/freemates/model/dto/GeoCodePlaceDto.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/main/java/jombi/freemates/model/dto/PlaceDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class PlaceDto {
2727
private Long likeCount;
2828
private Long viewCount;
2929
private String distance;
30+
private String x;
31+
private String y;
3032

3133

3234

src/main/java/jombi/freemates/model/postgres/Bookmark.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,18 @@
2020
import jombi.freemates.model.constant.PinColor;
2121
import jombi.freemates.model.constant.Visibility;
2222
import lombok.AllArgsConstructor;
23+
import lombok.Builder;
2324
import lombok.Getter;
2425
import lombok.NoArgsConstructor;
26+
import lombok.Setter;
2527
import lombok.experimental.SuperBuilder;
2628

2729
@Entity
2830
@Getter
2931
@SuperBuilder
3032
@NoArgsConstructor
3133
@AllArgsConstructor
34+
@Setter
3235
public class Bookmark extends BasePostgresEntity{
3336

3437
@Id
@@ -45,6 +48,9 @@ public class Bookmark extends BasePostgresEntity{
4548

4649
private String description;
4750

51+
@Builder.Default
52+
private Long likeCount = 0L; // 좋아요 수
53+
4854
@Enumerated(EnumType.STRING)
4955
private PinColor pinColor;
5056

@@ -53,6 +59,7 @@ public class Bookmark extends BasePostgresEntity{
5359

5460
@OneToMany(mappedBy = "bookmark",
5561
fetch = FetchType.LAZY)
62+
@Builder.Default
5663
private List<BookmarkPlace> bookmarkPlaces = new ArrayList<>();
5764

5865

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package jombi.freemates.model.postgres;
2+
3+
import jakarta.persistence.EmbeddedId;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.FetchType;
6+
import jakarta.persistence.JoinColumn;
7+
import jakarta.persistence.ManyToOne;
8+
import jakarta.persistence.MapsId;
9+
import jombi.freemates.model.postgres.id.BookmarkLikeId;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
import lombok.experimental.SuperBuilder;
14+
15+
@Entity
16+
@Getter
17+
@SuperBuilder
18+
@NoArgsConstructor
19+
@AllArgsConstructor
20+
public class BookmarkLike {
21+
@EmbeddedId
22+
private BookmarkLikeId id;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@MapsId("memberId")
26+
@JoinColumn(name = "member_id", nullable = false)
27+
private Member member;
28+
29+
@ManyToOne(fetch = FetchType.LAZY)
30+
@MapsId("bookmarkId")
31+
@JoinColumn(name = "bookmark_id", nullable = false)
32+
private Bookmark bookmark;}

0 commit comments

Comments
 (0)