diff --git a/src/main/java/ttakkeun/ttakkeun_server/controller/CalendarController.java b/src/main/java/ttakkeun/ttakkeun_server/controller/CalendarController.java index 25b7631..0e0088f 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/controller/CalendarController.java +++ b/src/main/java/ttakkeun/ttakkeun_server/controller/CalendarController.java @@ -18,10 +18,11 @@ public class CalendarController { @GetMapping("/{year}/{month}/{date}") public ApiResponse getCalendarData( // @RequestHeader("Authorization") String accessToken, + @RequestParam Long petId, @PathVariable int year, @PathVariable int month, @PathVariable int date) { - CalendarResponseDto result = calendarService.getCalendarData(year, month, date); + CalendarResponseDto result = calendarService.getCalendarData(petId, year, month, date); return ApiResponse.onSuccess(result); } } diff --git a/src/main/java/ttakkeun/ttakkeun_server/controller/TipController.java b/src/main/java/ttakkeun/ttakkeun_server/controller/TipController.java index c7e593b..023244e 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/controller/TipController.java +++ b/src/main/java/ttakkeun/ttakkeun_server/controller/TipController.java @@ -61,10 +61,11 @@ public ApiResponse> uploadTipImages( @Operation(summary = "팁 조회 API") @GetMapping public ApiResponse> getTips( + @AuthenticationPrincipal Member member, @RequestParam("category") Category category, @RequestParam(name = "page", defaultValue = "0") int page) { - List result = tipService.getTipsByCategory(category, page, 21); + List result = tipService.getTipsByCategory(category, page, 21, member); return ApiResponse.onSuccess(result); } @@ -72,17 +73,19 @@ public ApiResponse> getTips( @Operation(summary = "전체 팁 조회 API") @GetMapping("/all") public ApiResponse> getAllTips( + @AuthenticationPrincipal Member member, @RequestParam(name = "page", defaultValue = "0") int page) { - List result = tipService.getAllTips(page, 21); + List result = tipService.getAllTips(page, 21, member); return ApiResponse.onSuccess(result); } @Operation(summary = "Best 팁 조회 API") @GetMapping("/best") public ApiResponse> getBestTips( + @AuthenticationPrincipal Member member ) { - List result = tipService.getBestTips(); + List result = tipService.getBestTips(member); return ApiResponse.onSuccess(result); } } diff --git a/src/main/java/ttakkeun/ttakkeun_server/dto/tip/TipResponseDTO.java b/src/main/java/ttakkeun/ttakkeun_server/dto/tip/TipResponseDTO.java index 19c6226..79604d5 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/dto/tip/TipResponseDTO.java +++ b/src/main/java/ttakkeun/ttakkeun_server/dto/tip/TipResponseDTO.java @@ -22,4 +22,19 @@ public class TipResponseDTO { private LocalDateTime createdAt; private List imageUrls; private String authorName; + private Boolean isLike; + private Boolean isPopular; + + public TipResponseDTO(Long tipId, Category category, String title, String content, Integer recommendCount, + LocalDateTime createdAt, List imageUrls, String authorName, Boolean isPopular) { + this.tipId = tipId; + this.category = category; + this.title = title; + this.content = content; + this.recommendCount = recommendCount; + this.createdAt = createdAt; + this.imageUrls = imageUrls; + this.authorName = authorName; + this.isPopular = isPopular; + } } diff --git a/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoDto.java b/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoDto.java index 7530b8b..08b4ce7 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoDto.java +++ b/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoDto.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import software.amazon.awssdk.services.s3.endpoints.internal.Value; import ttakkeun.ttakkeun_server.entity.enums.TodoStatus; @Getter @@ -14,6 +15,6 @@ public class TodoDto { private Long todoId; private String todoName; - private TodoStatus todoStatus; + private Boolean todoStatus; } diff --git a/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoResponseDto.java b/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoResponseDto.java index b568c43..1929bcc 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoResponseDto.java +++ b/src/main/java/ttakkeun/ttakkeun_server/dto/todo/TodoResponseDto.java @@ -6,11 +6,13 @@ import java.time.LocalDate; + @Getter @Setter @AllArgsConstructor public class TodoResponseDto { private Long todoId; private LocalDate todoDate; + private boolean todoStatus; } diff --git a/src/main/java/ttakkeun/ttakkeun_server/entity/Member.java b/src/main/java/ttakkeun/ttakkeun_server/entity/Member.java index 8265ca8..91956a1 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/entity/Member.java +++ b/src/main/java/ttakkeun/ttakkeun_server/entity/Member.java @@ -66,7 +66,7 @@ public String getPassword() { @Override public String getUsername() { - return ""; + return this.userName; } @Override diff --git a/src/main/java/ttakkeun/ttakkeun_server/entity/Tip.java b/src/main/java/ttakkeun/ttakkeun_server/entity/Tip.java index 33e4123..4739460 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/entity/Tip.java +++ b/src/main/java/ttakkeun/ttakkeun_server/entity/Tip.java @@ -47,6 +47,9 @@ public class Tip extends BaseEntity { @Builder.Default private LocalDateTime createdAt = LocalDateTime.now(); + @Builder.Default + private boolean isPopular = false; + public void addImage(TipImage image) { image.setTip(this); this.images.add(image); diff --git a/src/main/java/ttakkeun/ttakkeun_server/repository/LikeTipRepository.java b/src/main/java/ttakkeun/ttakkeun_server/repository/LikeTipRepository.java index 186dc23..54a28d6 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/repository/LikeTipRepository.java +++ b/src/main/java/ttakkeun/ttakkeun_server/repository/LikeTipRepository.java @@ -19,4 +19,6 @@ public interface LikeTipRepository extends JpaRepository { int countByTip(Tip tip); boolean existsByTipAndMember(Tip tip, Member member); + + //boolean existsIsLike(Tip tip, Member member); } diff --git a/src/main/java/ttakkeun/ttakkeun_server/repository/TipRepository.java b/src/main/java/ttakkeun/ttakkeun_server/repository/TipRepository.java index e7e6a82..ac4264a 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/repository/TipRepository.java +++ b/src/main/java/ttakkeun/ttakkeun_server/repository/TipRepository.java @@ -15,8 +15,11 @@ public interface TipRepository extends JpaRepository { Page findByCategory(Category category, Pageable pageable); + @Query("SELECT t FROM Tip t WHERE t.recommendCount <> 0 ORDER BY t.recommendCount DESC, t.createdAt DESC LIMIT 10") List findByIsPopularTrue(); + // 최신 10개 팁 조회 + List findTop10ByOrderByCreatedAt(); } diff --git a/src/main/java/ttakkeun/ttakkeun_server/repository/TodoRepository.java b/src/main/java/ttakkeun/ttakkeun_server/repository/TodoRepository.java index 7808066..227eb03 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/repository/TodoRepository.java +++ b/src/main/java/ttakkeun/ttakkeun_server/repository/TodoRepository.java @@ -12,7 +12,7 @@ @Repository public interface TodoRepository extends JpaRepository { - List findByTodoDate(LocalDate selectDate); + List findByTodoDateAndPet(LocalDate selectDate, Pet pet); long countByTodoCategoryAndPet(Category todoCategory, Pet pet); long countByTodoCategoryAndPetAndTodoStatus(Category todoCategory, Pet pet, TodoStatus todoStatus); diff --git a/src/main/java/ttakkeun/ttakkeun_server/service/CalendarService.java b/src/main/java/ttakkeun/ttakkeun_server/service/CalendarService.java index 9609800..1d6b04a 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/service/CalendarService.java +++ b/src/main/java/ttakkeun/ttakkeun_server/service/CalendarService.java @@ -3,9 +3,13 @@ import org.springframework.stereotype.Service; import ttakkeun.ttakkeun_server.dto.todo.CalendarResponseDto; import ttakkeun.ttakkeun_server.dto.todo.TodoDto; +import ttakkeun.ttakkeun_server.entity.Pet; import ttakkeun.ttakkeun_server.entity.Todo; import ttakkeun.ttakkeun_server.entity.enums.Category; +import ttakkeun.ttakkeun_server.repository.PetRepository; import ttakkeun.ttakkeun_server.repository.TodoRepository; +import ttakkeun.ttakkeun_server.entity.enums.TodoStatus; + import java.time.LocalDate; import java.util.List; @@ -15,16 +19,21 @@ public class CalendarService { private final TodoRepository todoRepository; + private final PetRepository petRepository; - public CalendarService(TodoRepository todoRepository) { + public CalendarService(TodoRepository todoRepository, PetRepository petRepository) { this.todoRepository = todoRepository; + this.petRepository = petRepository; } - public CalendarResponseDto getCalendarData(int year, int month, int date) { + public CalendarResponseDto getCalendarData(Long petId, int year, int month, int date) { LocalDate selectDate = LocalDate.of(year, month, date); + Pet pet = petRepository.findById(petId) + .orElseThrow(() -> new IllegalArgumentException("Pet not found with id: " + petId)); + - List todos = todoRepository.findByTodoDate(selectDate); + List todos = todoRepository.findByTodoDateAndPet(selectDate, pet); // 투두 항목별로 분류하기 List earTodos = filterTodosByCategory(todos, Category.EAR); @@ -39,11 +48,15 @@ public CalendarResponseDto getCalendarData(int year, int month, int date) { ); } + private boolean convertStatusToBoolean(TodoStatus status) { + return status == TodoStatus.DONE; + } + private List convertToDto(List todos) { return todos.stream().map(todo -> new TodoDto( todo.getTodoId(), todo.getTodoName(), - todo.getTodoStatus() + convertStatusToBoolean(todo.getTodoStatus()) )).collect(Collectors.toList()); } @@ -53,7 +66,7 @@ private List filterTodosByCategory(List todos, Category todoCateg .map(todo -> new TodoDto( todo.getTodoId(), todo.getTodoName(), - todo.getTodoStatus() + convertStatusToBoolean(todo.getTodoStatus()) )) .collect(Collectors.toList()); } diff --git a/src/main/java/ttakkeun/ttakkeun_server/service/TipService.java b/src/main/java/ttakkeun/ttakkeun_server/service/TipService.java index 84daff7..fa6b7f6 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/service/TipService.java +++ b/src/main/java/ttakkeun/ttakkeun_server/service/TipService.java @@ -16,6 +16,7 @@ import ttakkeun.ttakkeun_server.entity.TipImage; import ttakkeun.ttakkeun_server.entity.enums.Category; +import ttakkeun.ttakkeun_server.repository.LikeTipRepository; import ttakkeun.ttakkeun_server.repository.MemberRepository; import ttakkeun.ttakkeun_server.repository.TipRepository; @@ -31,6 +32,7 @@ public class TipService { private final MemberService memberService; private final S3ImageService s3ImageService; private final MemberRepository memberRepository; + private final LikeTipRepository likeTipRepository; // 팁 생성 @Transactional @@ -59,10 +61,27 @@ public TipResponseDTO createTip(TipCreateRequestDTO request, Long memberId, List tip.getImages().stream() .map(TipImage::getTipImageUrl) .collect(Collectors.toList()), - member.getUsername() + tip.getMember().getUsername(), + false, + tip.isPopular() ); } + // 베스트 팁 업데이트 + @Transactional + public void updateBestTips() { + // 기존 베스트 팁들을 모두 일반 팁으로 변경 + List currentBestTips = tipRepository.findByIsPopularTrue(); + currentBestTips.forEach(tip -> tip.setPopular(false)); + + // 최신 10개의 팁을 베스트 팁으로 설정 + List latestTips = tipRepository.findTop10ByOrderByCreatedAt(); + latestTips.forEach(tip -> tip.setPopular(true)); + + tipRepository.saveAll(currentBestTips); + tipRepository.saveAll(latestTips); + } + // 팁 생성시 이미지 업로드 @Transactional @@ -95,7 +114,7 @@ public List uploadTipImages(Long tipId, Long memberId, List getTipsByCategory(Category category, int page, int size) { + public List getTipsByCategory(Category category, int page, int size, Member member) { Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); Page tipsPage = tipRepository.findByCategory(category, pageable); @@ -108,7 +127,9 @@ public List getTipsByCategory(Category category, int page, int s tip.getRecommendCount(), tip.getCreatedAt(), tip.getImages().stream().map(TipImage::getTipImageUrl).collect(Collectors.toList()), - tip.getMember().getUsername() + tip.getMember().getUsername(), + likeTipRepository.existsByTipAndMember(tip, member), + tip.isPopular() )) .collect(Collectors.toList()); } @@ -116,7 +137,7 @@ public List getTipsByCategory(Category category, int page, int s // 전체 카테고리 조회 @Transactional(readOnly = true) - public List getAllTips(int page, int size) { + public List getAllTips(int page, int size, Member member) { Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt")); Page tipsPage = tipRepository.findAll(pageable); @@ -129,7 +150,9 @@ public List getAllTips(int page, int size) { tip.getRecommendCount(), tip.getCreatedAt(), tip.getImages().stream().map(TipImage::getTipImageUrl).collect(Collectors.toList()), - tip.getMember().getUsername() + tip.getMember().getUsername(), + likeTipRepository.existsByTipAndMember(tip, member), + tip.isPopular() )) .collect(Collectors.toList()); } @@ -137,7 +160,7 @@ public List getAllTips(int page, int size) { // Best 카테고리 조회 @Transactional(readOnly = true) - public List getBestTips() { + public List getBestTips(Member member) { List topTips = tipRepository.findByIsPopularTrue(); return topTips.stream() @@ -149,7 +172,9 @@ public List getBestTips() { tip.getRecommendCount(), tip.getCreatedAt(), tip.getImages().stream().map(TipImage::getTipImageUrl).collect(Collectors.toList()), - tip.getMember().getUsername() + tip.getMember().getUsername(), + likeTipRepository.existsByTipAndMember(tip, member), + tip.isPopular() )) .collect(Collectors.toList()); } diff --git a/src/main/java/ttakkeun/ttakkeun_server/service/TodoService.java b/src/main/java/ttakkeun/ttakkeun_server/service/TodoService.java index ceff4ab..8a58802 100644 --- a/src/main/java/ttakkeun/ttakkeun_server/service/TodoService.java +++ b/src/main/java/ttakkeun/ttakkeun_server/service/TodoService.java @@ -31,12 +31,13 @@ public TodoResponseDto createTodo(TodoCreateRequestDto request) { .todoName(request.getTodoName()) .todoCategory(request.getTodoCategory()) .todoDate(LocalDate.now()) + .todoStatus(TodoStatus.ONPROGRESS) .pet(pet) .build(); todoRepository.save(todo); - return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate()); + return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate(),convertStatusToBoolean(todo.getTodoStatus())); } @Transactional @@ -52,7 +53,7 @@ public TodoResponseDto updateTodoStatus(Long todoId) { todoRepository.save(todo); - return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate()); + return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate(), convertStatusToBoolean(todo.getTodoStatus())); } @Transactional @@ -65,7 +66,11 @@ public TodoResponseDto updateTodoContent(Long todoId, TodoContentUpdateRequestDt todo.setTodoStatus(request.getTodoStatus()); todoRepository.save(todo); - return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate()); + return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate(), convertStatusToBoolean(todo.getTodoStatus())); + } + + private boolean convertStatusToBoolean(TodoStatus status) { + return status == TodoStatus.DONE; } @Transactional @@ -97,7 +102,7 @@ public TodoResponseDto repeatTodoTomorrow(Long todoId) { todoRepository.save(newTodo); - return new TodoResponseDto(newTodo.getTodoId(), newTodo.getTodoDate()); + return new TodoResponseDto(newTodo.getTodoId(), newTodo.getTodoDate(), convertStatusToBoolean(newTodo.getTodoStatus())); } @Transactional @@ -113,7 +118,7 @@ public TodoResponseDto doTomorrow(Long todoId) { todoRepository.save(todo); - return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate()); + return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate(), convertStatusToBoolean(todo.getTodoStatus())); } @Transactional @@ -137,7 +142,7 @@ public TodoResponseDto repeatAnotherDay(Long todoId, RepeatAnotherDayRequestDto todoRepository.save(newTodo); - return new TodoResponseDto(newTodo.getTodoId(), newTodo.getTodoDate()); + return new TodoResponseDto(newTodo.getTodoId(), newTodo.getTodoDate(), convertStatusToBoolean(newTodo.getTodoStatus())); } @Transactional @@ -153,6 +158,6 @@ public TodoResponseDto changeDate(Long todoId, ChangeDateRequestDto requestDto) todo.setTodoDate(newDate); todoRepository.save(todo); - return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate()); + return new TodoResponseDto(todo.getTodoId(), todo.getTodoDate(), convertStatusToBoolean(todo.getTodoStatus())); } }