Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 30 additions & 25 deletions src/main/java/jombi/freemates/controller/BookmarkController.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,12 @@
import jombi.freemates.model.constant.PinColor;
import jombi.freemates.model.constant.Visibility;
import jombi.freemates.model.dto.BookmarkRequest;
import jombi.freemates.model.dto.BookmarkResponse;
import jombi.freemates.model.dto.BookmarkDto;
import jombi.freemates.model.dto.CustomUserDetails;
import jombi.freemates.model.dto.PlaceDto;
import jombi.freemates.service.BookmarkService;
import jombi.freemates.util.docs.ApiChangeLog;
import jombi.freemates.util.docs.ApiChangeLogs;
import lombok.Builder.Default;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
Expand Down Expand Up @@ -78,7 +77,7 @@ public class BookmarkController {
@PostMapping(value = "/create",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public ResponseEntity<BookmarkResponse> create(
public ResponseEntity<BookmarkDto> create(
@RequestParam String title,
@RequestParam String description,
@RequestParam PinColor pinColor,
Expand All @@ -88,13 +87,14 @@ public ResponseEntity<BookmarkResponse> create(
MultipartFile image,
@AuthenticationPrincipal CustomUserDetails user
) {
BookmarkRequest req = new BookmarkRequest();
req.setTitle(title);
req.setDescription(description);
req.setPinColor(pinColor);
req.setVisibility(visibility);
BookmarkResponse response = bookmarkService.create(user, req, image);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
BookmarkRequest req = BookmarkRequest.builder()
.title(title)
.description(description)
.pinColor(pinColor)
.visibility(visibility)
.build();
BookmarkDto dto = bookmarkService.create(user, req, image);
return ResponseEntity.status(HttpStatus.CREATED).body(dto);
}

@ApiChangeLogs({
Expand Down Expand Up @@ -123,7 +123,7 @@ public ResponseEntity<BookmarkResponse> create(
"""
)
@GetMapping("/mylist")
public List<BookmarkResponse> getMyBookmarks(
public List<BookmarkDto> getMyBookmarks(
@AuthenticationPrincipal CustomUserDetails customUserDetails
) {
return bookmarkService.getMyBookmarks(customUserDetails);
Expand Down Expand Up @@ -161,13 +161,13 @@ public List<BookmarkResponse> getMyBookmarks(
"""
)
@GetMapping("/list")
public ResponseEntity<Page<BookmarkResponse>> getBookmarks(
public ResponseEntity<Page<BookmarkDto>> getBookmarks(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "PUBLIC") Visibility visibility
) {
log.debug("page:{}, size:{}, visibility:{}", page, size, visibility);
Page<BookmarkResponse> bookmarks = bookmarkService.getBookmarks(page, size, visibility);
Page<BookmarkDto> bookmarks = bookmarkService.getBookmarks(page, size, visibility);
return ResponseEntity.ok(bookmarks);
}

Expand Down Expand Up @@ -215,34 +215,39 @@ public ResponseEntity<Void> addPlaceToBookmark(
bookmarkService.addPlaceToBookmark(customUserDetails, bookmarkId, placeId);
return ResponseEntity.ok().build(); // 혹은 204 No Content
}

@ApiChangeLogs({
@ApiChangeLog(
date = "2025-06-05",
date = "2025-06-06",
author = Author.LEEDAYE,
issueNumber = 114,
description = "북마크에 따른 장소 목록 가져오기"
issueNumber = 105,
description = "좋아요~"
)
})
@Operation(
summary = "북마크에 따른 장소 목록 가져오기",
summary = "북마크 좋아요",
description = """
## 인증(JWT): **필요**

## 요청 파라미터
- **Path Variable**
- `bookmarkId` (UUID): 북마크 ID
- `bookmarkId` (UUID): 좋아요를 누를 즐겨찾기 ID

## 반환값 (`List<PlaceDto>`)
- 즐겨찾기에 추가된 장소 목록
## 반환값
- **HTTP Status 200 OK** (혹은 204 No Content)

## 에러코드
- `BOOKMARK_NOT_FOUND (404)`: 존재하지 않는 북마크입니다.
- `UNAUTHORIZED (401)`: 인증되지 않은 사용자입니다.
- 'BOOKMARK_NOT_FOUND (404)': 존재하지 않는 북마크입니다.
"""
)

@GetMapping("/places/{bookmarkId}")
public List<PlaceDto> getPlaces(@PathVariable UUID bookmarkId) {
return bookmarkService.getPlacesByBookmarkId(bookmarkId);
@PostMapping("/like/{bookmarkId}")
public ResponseEntity<Void> likeBookmark(
@AuthenticationPrincipal CustomUserDetails customUserDetails,
@PathVariable("bookmarkId") UUID bookmarkId
) {
bookmarkService.likeBookmark(customUserDetails, bookmarkId);
return ResponseEntity.ok().build(); // 혹은 204 No Content
}

}
39 changes: 39 additions & 0 deletions src/main/java/jombi/freemates/controller/CourseController.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
Expand Down Expand Up @@ -182,6 +183,44 @@ public ResponseEntity<Page<CourseDto>> getCourses(
return ResponseEntity.ok(pagedCourses);
}

/**
* 코스 좋아요
*/
@ApiChangeLogs({
@ApiChangeLog(
date = "2025-06-06",
author = Author.LEEDAYE,
issueNumber = 105,
description = "코스 좋아요 추가/취소"
)
})
@Operation(
summary = "코스 좋아요",
description = """
## 인증(JWT): **필요**

## 요청 파라미터
- **Path Variable**
- `courseId` (UUID): 좋아요를 누를 코스 ID

## 반환값
- **HTTP Status 200 OK** (혹은 204 No Content)

## 에러코드
- `UNAUTHORIZED (401)`: 인증되지 않은 사용자입니다.
- `COURSE_NOT_FOUND (404)`: 존재하지 않는 코스입니다.
"""
)
@PostMapping("/like/{courseId}")
public ResponseEntity<Void> likeCourse(
@AuthenticationPrincipal CustomUserDetails customUserDetails,
@PathVariable("courseId") UUID courseId
) {
courseService.likeCourse(customUserDetails, courseId);
return ResponseEntity.ok().build();
}





Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import io.swagger.v3.oas.annotations.tags.Tag;
import jombi.freemates.model.constant.Author;
import jombi.freemates.model.constant.CategoryType;
import jombi.freemates.model.dto.GeoCodePlaceDto;
import jombi.freemates.model.dto.PlaceDto;
import jombi.freemates.model.postgres.Place;
import jombi.freemates.service.PlaceService;
Expand Down Expand Up @@ -113,7 +112,7 @@ public ResponseEntity<Page<PlaceDto>> getPlacesByCategory(
"""
)
@GetMapping("/geocode")
public ResponseEntity<GeoCodePlaceDto> getPlaceByGeocode(
public ResponseEntity<PlaceDto> getPlaceByGeocode(
@RequestParam String x,
@RequestParam String y
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package jombi.freemates.model.dto;

import java.util.List;
import java.util.UUID;
import jombi.freemates.model.constant.PinColor;
import jombi.freemates.model.constant.Visibility;
Expand All @@ -16,7 +17,7 @@
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class BookmarkResponse {
public class BookmarkDto {

private UUID bookmarkId;
private String imageUrl;
Expand All @@ -26,5 +27,9 @@ public class BookmarkResponse {
private Visibility visibility;
private UUID memberId;
private String nickname;
private Long likeCount; // 좋아요 수

private List<PlaceDto> placeDtos;


}
9 changes: 4 additions & 5 deletions src/main/java/jombi/freemates/model/dto/CourseDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,10 @@ public class CourseDto {
@Schema(description = "이미지 URL (업로드한 경우)")
private String imageUrl;


@Schema(description = "해당 코스에 포함된 장소들의 ID 리스트")
private List<UUID> placeIds;

@Schema(description = "해당 코스에 포함된 장소들의 상세 정보 리스트")
private List<CoursePlaceDto> coursePlaceDtos;
private List<PlaceDto> placeDtos;

@Schema(description = "코스 좋아요 수")
private Long likeCount;

}
25 changes: 0 additions & 25 deletions src/main/java/jombi/freemates/model/dto/CoursePlaceDto.java

This file was deleted.

27 changes: 0 additions & 27 deletions src/main/java/jombi/freemates/model/dto/GeoCodePlaceDto.java

This file was deleted.

2 changes: 2 additions & 0 deletions src/main/java/jombi/freemates/model/dto/PlaceDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public class PlaceDto {
private Long likeCount;
private Long viewCount;
private String distance;
private String x;
private String y;



Expand Down
7 changes: 7 additions & 0 deletions src/main/java/jombi/freemates/model/postgres/Bookmark.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,18 @@
import jombi.freemates.model.constant.PinColor;
import jombi.freemates.model.constant.Visibility;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;

@Entity
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Setter
public class Bookmark extends BasePostgresEntity{

@Id
Expand All @@ -45,6 +48,9 @@ public class Bookmark extends BasePostgresEntity{

private String description;

@Builder.Default
private Long likeCount = 0L; // 좋아요 수

@Enumerated(EnumType.STRING)
private PinColor pinColor;

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

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


Expand Down
32 changes: 32 additions & 0 deletions src/main/java/jombi/freemates/model/postgres/BookmarkLike.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package jombi.freemates.model.postgres;

import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.MapsId;
import jombi.freemates.model.postgres.id.BookmarkLikeId;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

@Entity
@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class BookmarkLike {
@EmbeddedId
private BookmarkLikeId id;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("memberId")
@JoinColumn(name = "member_id", nullable = false)
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("bookmarkId")
@JoinColumn(name = "bookmark_id", nullable = false)
private Bookmark bookmark;}
Loading