diff --git a/src/main/java/com/back/domain/mybar/controller/MyBarController.java b/src/main/java/com/back/domain/mybar/controller/MyBarController.java new file mode 100644 index 00000000..f6226240 --- /dev/null +++ b/src/main/java/com/back/domain/mybar/controller/MyBarController.java @@ -0,0 +1,33 @@ +package com.back.domain.mybar.controller; + +import com.back.domain.mybar.dto.MyBarListResponseDto; +import com.back.domain.mybar.service.MyBarService; +import com.back.global.rsData.RsData; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/me/bar") +@RequiredArgsConstructor +@Validated +public class MyBarController { + + private final MyBarService myBarService; + + @GetMapping + public RsData getMyBarList( + @AuthenticationPrincipal(expression = "id") Long userId, + @RequestParam(defaultValue = "0") @Min(0) int page, + @RequestParam(defaultValue = "20") @Min(1) @Max(100) int pageSize + ) { + MyBarListResponseDto body = myBarService.getMyBar(userId, page, pageSize); + return RsData.successOf(body); // code=200, message="success" + } +} diff --git a/src/main/java/com/back/domain/mybar/dto/MyBarItemResponseDto.java b/src/main/java/com/back/domain/mybar/dto/MyBarItemResponseDto.java new file mode 100644 index 00000000..124af8af --- /dev/null +++ b/src/main/java/com/back/domain/mybar/dto/MyBarItemResponseDto.java @@ -0,0 +1,27 @@ +package com.back.domain.mybar.dto; + +import com.back.domain.mybar.entity.MyBar; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +public class MyBarItemResponseDto { + private Long id; + private Long cocktailId; + private String cocktailName; + private String imageUrl; + private LocalDateTime createdAt; + + public static MyBarItemResponseDto from(MyBar m) { + return MyBarItemResponseDto.builder() + .id(m.getId()) + .cocktailId(m.getCocktail().getCocktailId()) + .cocktailName(m.getCocktail().getCocktailName()) + .imageUrl(m.getCocktail().getImageUrl()) + .createdAt(m.getCreatedAt()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/back/domain/mybar/dto/MyBarListResponseDto.java b/src/main/java/com/back/domain/mybar/dto/MyBarListResponseDto.java new file mode 100644 index 00000000..040a3806 --- /dev/null +++ b/src/main/java/com/back/domain/mybar/dto/MyBarListResponseDto.java @@ -0,0 +1,14 @@ +package com.back.domain.mybar.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class MyBarListResponseDto { + private List items; + private boolean hasNext; // 다음 페이지 존재 여부 + private Integer nextPage; // 다음 페이지 번호(없으면 null) +} \ No newline at end of file diff --git a/src/main/java/com/back/domain/mybar/entity/MyBar.java b/src/main/java/com/back/domain/mybar/entity/MyBar.java new file mode 100644 index 00000000..376b9cf2 --- /dev/null +++ b/src/main/java/com/back/domain/mybar/entity/MyBar.java @@ -0,0 +1,47 @@ +package com.back.domain.mybar.entity; + +import com.back.domain.cocktail.entity.Cocktail; +import com.back.domain.mybar.enums.KeepStatus; +import com.back.domain.user.entity.User; +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@EntityListeners(AuditingEntityListener.class) +public class MyBar { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** 킵 생성 시각 */ + @CreatedDate + private LocalDateTime createdAt; + + /** 킵 해제 시각 (ACTIVE일 때는 null) */ + private LocalDateTime deletedAt; + + /** 킵한 사용자 */ + @ManyToOne + private User user; + + /** 킵한 칵테일 */ + @ManyToOne + private Cocktail cocktail; + + /** 킵 상태 */ + @Enumerated(EnumType.STRING) + @Column(nullable = false) + // 기본값은 ACTIVE (활성 상태) + // ACTIVE: 킵한 상태, DELETED: 킵 해제한 상태 (Soft Delete) + private KeepStatus status = KeepStatus.ACTIVE; +} diff --git a/src/main/java/com/back/domain/mybar/enums/KeepStatus.java b/src/main/java/com/back/domain/mybar/enums/KeepStatus.java new file mode 100644 index 00000000..e740f1a1 --- /dev/null +++ b/src/main/java/com/back/domain/mybar/enums/KeepStatus.java @@ -0,0 +1,9 @@ +package com.back.domain.mybar.enums; + +import lombok.Getter; + +@Getter +public enum KeepStatus { + ACTIVE, + DELETED +} diff --git a/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java b/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java new file mode 100644 index 00000000..97e8ed91 --- /dev/null +++ b/src/main/java/com/back/domain/mybar/repository/MyBarRepository.java @@ -0,0 +1,17 @@ +package com.back.domain.mybar.repository; + +import com.back.domain.mybar.entity.MyBar; +import com.back.domain.mybar.enums.KeepStatus; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MyBarRepository extends JpaRepository { + /** 나만의 bar(킵) 목록: ACTIVE만, id desc */ + Page findByUserIdAndStatusOrderByIdDesc(Long userId, KeepStatus status, Pageable pageable); + + /** 프로필/요약용: ACTIVE 개수 */ + long countByUserIdAndStatus(Long userId, KeepStatus status); +} diff --git a/src/main/java/com/back/domain/mybar/service/MyBarService.java b/src/main/java/com/back/domain/mybar/service/MyBarService.java new file mode 100644 index 00000000..b49c46df --- /dev/null +++ b/src/main/java/com/back/domain/mybar/service/MyBarService.java @@ -0,0 +1,36 @@ +package com.back.domain.mybar.service; + +import com.back.domain.mybar.dto.MyBarItemResponseDto; +import com.back.domain.mybar.dto.MyBarListResponseDto; +import com.back.domain.mybar.entity.MyBar; +import com.back.domain.mybar.enums.KeepStatus; +import com.back.domain.mybar.repository.MyBarRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MyBarService { + + private final MyBarRepository myBarRepository; + + @Transactional(readOnly = true) + public MyBarListResponseDto getMyBar(Long userId, int page, int pageSize) { + Page myBarPage = myBarRepository.findByUserIdAndStatusOrderByIdDesc(userId, KeepStatus.ACTIVE, PageRequest.of(page, pageSize)); + + List myBars = myBarPage.getContent(); + List items = new ArrayList<>(); + for (MyBar myBar : myBars) items.add(MyBarItemResponseDto.from(myBar)); + + boolean hasNext = myBarPage.hasNext(); + Integer nextPage = hasNext ? myBarPage.getNumber() + 1 : null; + + return new MyBarListResponseDto(items, hasNext, nextPage); + } +} diff --git a/src/main/java/com/back/domain/wishlist/dto/WishlistRequestDto.java b/src/main/java/com/back/domain/wishlist/dto/WishlistRequestDto.java deleted file mode 100644 index ec91f985..00000000 --- a/src/main/java/com/back/domain/wishlist/dto/WishlistRequestDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.back.domain.wishlist.dto; - -import com.back.domain.wishlist.enums.WishlistStatus; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class WishlistRequestDto { - - @NotNull - private Long userId; - - // 생성 시 기본값 ACTIVE, 필요시 상태 지정 업데이트용으로 재사용 가능 - private WishlistStatus status; -} - diff --git a/src/main/java/com/back/domain/wishlist/dto/WishlistResponseDto.java b/src/main/java/com/back/domain/wishlist/dto/WishlistResponseDto.java deleted file mode 100644 index ee4de3a1..00000000 --- a/src/main/java/com/back/domain/wishlist/dto/WishlistResponseDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.back.domain.wishlist.dto; - -import com.back.domain.wishlist.entity.Wishlist; -import com.back.domain.wishlist.enums.WishlistStatus; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class WishlistResponseDto { - private Long id; - private Long userId; - private WishlistStatus status; - private LocalDateTime createdAt; - - public static WishlistResponseDto from(Wishlist wishlist) { - if (wishlist == null) return null; - return WishlistResponseDto.builder() - .id(wishlist.getId()) - .userId(wishlist.getUser() != null ? wishlist.getUser().getId() : null) - .status(wishlist.getStatus()) - .createdAt(wishlist.getCreatedAt()) - .build(); - } -} - diff --git a/src/main/java/com/back/domain/wishlist/entity/Wishlist.java b/src/main/java/com/back/domain/wishlist/entity/Wishlist.java deleted file mode 100644 index f48bc18a..00000000 --- a/src/main/java/com/back/domain/wishlist/entity/Wishlist.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.back.domain.wishlist.entity; - -import com.back.domain.cocktail.entity.Cocktail; -import com.back.domain.user.entity.User; -import com.back.domain.wishlist.enums.WishlistStatus; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.time.LocalDateTime; - -@Entity -@Getter -@Setter -@NoArgsConstructor -public class Wishlist { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private LocalDateTime createdAt; - - @ManyToOne - private User user; // 찜한 사용자 (위시리스트의 주인) - -// TODO: Cocktail 도메인 추가 후 활성화 - @ManyToOne - private Cocktail cocktail; - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - // 위시리스트 상태 - 기본값은 ACTIVE (활성 상태) - // ACTIVE: 찜한 상태, DELETED: 찜 해제한 상태 (Soft Delete) - private WishlistStatus status = WishlistStatus.ACTIVE; -} diff --git a/src/main/java/com/back/domain/wishlist/enums/WishlistStatus.java b/src/main/java/com/back/domain/wishlist/enums/WishlistStatus.java deleted file mode 100644 index 8ed6c9ca..00000000 --- a/src/main/java/com/back/domain/wishlist/enums/WishlistStatus.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.back.domain.wishlist.enums; - -import lombok.Getter; - -@Getter -public enum WishlistStatus { - ACTIVE, - DELETED -} diff --git a/src/main/java/com/back/domain/wishlist/repository/WishlistRepository.java b/src/main/java/com/back/domain/wishlist/repository/WishlistRepository.java deleted file mode 100644 index e09d66c0..00000000 --- a/src/main/java/com/back/domain/wishlist/repository/WishlistRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.back.domain.wishlist.repository; - -import com.back.domain.wishlist.entity.Wishlist; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface WishlistRepository extends JpaRepository { -}