diff --git a/src/main/java/org/terning/terningserver/controller/AuthController.java b/src/main/java/org/terning/terningserver/controller/AuthController.java index 45522ba..33f3496 100644 --- a/src/main/java/org/terning/terningserver/controller/AuthController.java +++ b/src/main/java/org/terning/terningserver/controller/AuthController.java @@ -48,7 +48,7 @@ public ResponseEntity> reissueToken( @PostMapping("/sign-up") public ResponseEntity> signUp( - @RequestHeader("authId") String authId, + @RequestHeader("Authorization") String authId, @RequestBody SignUpRequestDto request ) { diff --git a/src/main/java/org/terning/terningserver/controller/HomeController.java b/src/main/java/org/terning/terningserver/controller/HomeController.java index 3c82c30..bda9e47 100644 --- a/src/main/java/org/terning/terningserver/controller/HomeController.java +++ b/src/main/java/org/terning/terningserver/controller/HomeController.java @@ -13,8 +13,7 @@ import java.util.List; -import static org.terning.terningserver.exception.enums.SuccessMessage.SUCCESS_GET_ANNOUNCEMENTS; -import static org.terning.terningserver.exception.enums.SuccessMessage.SUCCESS_GET_UPCOMING_ANNOUNCEMENTS; +import static org.terning.terningserver.exception.enums.SuccessMessage.*; @RestController @RequiredArgsConstructor @@ -41,8 +40,17 @@ public ResponseEntity>> getUpcomi @AuthenticationPrincipal Long userId ){ - List scrapList = scrapService.getUpcomingScrap(userId); + boolean hasScrapped = scrapService.hasUserScrapped(userId); + List scrapList = scrapService.getUpcomingScrap(userId); - return ResponseEntity.ok(SuccessResponse.of(SUCCESS_GET_UPCOMING_ANNOUNCEMENTS, scrapList)); + UpcomingScrapResponseDto responseDto = new UpcomingScrapResponseDto(hasScrapped, scrapList); + + if(!hasScrapped){ + return ResponseEntity.ok(SuccessResponse.of(SUCCESS_GET_UPCOMING_ANNOUNCEMENTS_NO_SCRAP, responseDto)); + } else if (scrapList.isEmpty()) { + return ResponseEntity.ok(SuccessResponse.of(SUCCESS_GET_UPCOMING_ANNOUNCEMENTS_EMPTY_LIST, responseDto)); + } else { + return ResponseEntity.ok(SuccessResponse.of(SUCCESS_GET_UPCOMING_ANNOUNCEMENTS, responseDto)); + } } } diff --git a/src/main/java/org/terning/terningserver/controller/swagger/AuthSwagger.java b/src/main/java/org/terning/terningserver/controller/swagger/AuthSwagger.java index fd46b21..cfdb603 100644 --- a/src/main/java/org/terning/terningserver/controller/swagger/AuthSwagger.java +++ b/src/main/java/org/terning/terningserver/controller/swagger/AuthSwagger.java @@ -1,6 +1,7 @@ package org.terning.terningserver.controller.swagger; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -20,23 +21,27 @@ public interface AuthSwagger { @Operation(summary = "소셜 로그인", description = "AuthType에 맞는 소셜 로그인 API") ResponseEntity> signIn( + @Parameter(name = "Authorization", description = "", example = "authAccessToken") @RequestHeader("Authorization") String authAccessToken, @RequestBody SignInRequestDto request ); @Operation(summary = "토큰 재발급", description = "토큰 재발급 API") ResponseEntity> reissueToken( + @Parameter(name = "Authorization", description = "", example = "refreshToken") @RequestHeader("Authorization") String refreshToken ); @Operation(summary = "사용자 필터링 정보 생성", description = "사용자 필터링 정보 생성 API") ResponseEntity> filter( + @Parameter(name = "User-Id", description = "", example = "userId") @RequestHeader("User-Id") Long userId, @RequestBody SignUpFilterRequestDto request ); @Operation(summary = "회원가입", description = "회원가입 API") ResponseEntity> signUp( + @Parameter(name = "Authorization", description = "", example = "authId") @RequestHeader("authId") String authId, @RequestBody SignUpRequestDto request ); diff --git a/src/main/java/org/terning/terningserver/dto/user/response/UpcomingScrapResponseDto.java b/src/main/java/org/terning/terningserver/dto/user/response/UpcomingScrapResponseDto.java index 73a6959..6fc834f 100644 --- a/src/main/java/org/terning/terningserver/dto/user/response/UpcomingScrapResponseDto.java +++ b/src/main/java/org/terning/terningserver/dto/user/response/UpcomingScrapResponseDto.java @@ -4,33 +4,41 @@ import org.terning.terningserver.domain.Scrap; import org.terning.terningserver.util.DateUtil; +import java.util.List; + @Builder public record UpcomingScrapResponseDto( - Long internshipAnnouncementId, - String companyImage, - String dDay, - String title, - String workingPeriod, - boolean isScrapped, - String color, - String deadline, - String startYearMonth, - String companyInfo + boolean hasScrapped, + List scraps ) { - public static UpcomingScrapResponseDto of(final Scrap scrap){ - String startYearMonth = scrap.getInternshipAnnouncement().getStartYear() + "년 " + scrap.getInternshipAnnouncement().getStartMonth() + "월"; + @Builder + public record ScrapDetail( + Long internshipAnnouncementId, + String companyImage, + String dDay, + String title, + String workingPeriod, + boolean isScrapped, + String color, + String deadline, + String startYearMonth, + String companyInfo + ) { + public static ScrapDetail of(final Scrap scrap) { + String startYearMonth = scrap.getInternshipAnnouncement().getStartYear() + "년 " + scrap.getInternshipAnnouncement().getStartMonth() + "월"; - return UpcomingScrapResponseDto.builder() - .internshipAnnouncementId(scrap.getInternshipAnnouncement().getId()) - .companyImage(scrap.getInternshipAnnouncement().getCompany().getCompanyImage()) - .dDay(DateUtil.convert(scrap.getInternshipAnnouncement().getDeadline())) - .title(scrap.getInternshipAnnouncement().getTitle()) - .deadline(DateUtil.convertDeadline(scrap.getInternshipAnnouncement().getDeadline())) - .isScrapped(true) // 스크랩된 항목이므로 항상 true - .color(scrap.getColorToHexValue()) - .workingPeriod(scrap.getInternshipAnnouncement().getWorkingPeriod()) - .startYearMonth(startYearMonth) - .companyInfo(scrap.getInternshipAnnouncement().getCompany().getCompanyInfo()) - .build(); + return ScrapDetail.builder() + .internshipAnnouncementId(scrap.getInternshipAnnouncement().getId()) + .companyImage(scrap.getInternshipAnnouncement().getCompany().getCompanyImage()) + .dDay(DateUtil.convert(scrap.getInternshipAnnouncement().getDeadline())) + .title(scrap.getInternshipAnnouncement().getTitle()) + .deadline(DateUtil.convertDeadline(scrap.getInternshipAnnouncement().getDeadline())) + .isScrapped(true) // 스크랩된 항목이므로 항상 true + .color(scrap.getColorToHexValue()) + .workingPeriod(scrap.getInternshipAnnouncement().getWorkingPeriod()) + .startYearMonth(startYearMonth) + .companyInfo(scrap.getInternshipAnnouncement().getCompany().getCompanyInfo()) + .build(); + } } } diff --git a/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java b/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java index 4f97534..af067cd 100644 --- a/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java +++ b/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java @@ -9,6 +9,8 @@ public enum SuccessMessage { // 홈 화면 SUCCESS_GET_ANNOUNCEMENTS(200, "인턴 공고 불러오기를 성공했습니다"), SUCCESS_GET_UPCOMING_ANNOUNCEMENTS(200, "곧 마감인 인턴 공고 요청을 성공했습니다"), + SUCCESS_GET_UPCOMING_ANNOUNCEMENTS_NO_SCRAP(200, "아직 스크랩된 인턴 공고가 없어요!"), + SUCCESS_GET_UPCOMING_ANNOUNCEMENTS_EMPTY_LIST(200, "일주일 내에 마감인 공고가 없어요\n캘린더에서 스크랩한 공고 일정을 확인해 보세요"), // 소셜 로그인 SUCCESS_SIGN_IN(200, "소셜 로그인에 성공하였습니다"), diff --git a/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java b/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java index e4d0d1c..daeb384 100644 --- a/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java +++ b/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java @@ -14,7 +14,7 @@ public interface ScrapRepository extends JpaRepository, ScrapReposi void deleteByInternshipAnnouncementIdAndUserId(Long internshipId, Long userId); - List findByUserIdAndInternshipAnnouncement_DeadlineBetween(Long userId, LocalDate start, LocalDate end); + boolean existsByUserId(Long userId); } diff --git a/src/main/java/org/terning/terningserver/service/ScrapService.java b/src/main/java/org/terning/terningserver/service/ScrapService.java index 820faf5..e3b7072 100644 --- a/src/main/java/org/terning/terningserver/service/ScrapService.java +++ b/src/main/java/org/terning/terningserver/service/ScrapService.java @@ -11,7 +11,9 @@ import java.util.List; public interface ScrapService { - List getUpcomingScrap(Long userId); + + boolean hasUserScrapped(long userId); + List getUpcomingScrap(long userId); void createScrap(Long internshipAnnouncementId, CreateScrapRequestDto request, Long userId); diff --git a/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java b/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java index 9bee889..a239f71 100644 --- a/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java +++ b/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java @@ -39,11 +39,16 @@ public class ScrapServiceImpl implements ScrapService { private final UserRepository userRepository; @Override - public List getUpcomingScrap(Long userId){ + public boolean hasUserScrapped(long userId) { + return scrapRepository.existsByUserId(userId); + } + + @Override + public List getUpcomingScrap(long userId){ LocalDate today = LocalDate.now(); LocalDate oneWeekFromToday = today.plusDays(7); return scrapRepository.findScrapsByUserIdAndDeadlineBetweenOrderByDeadline(userId, today, oneWeekFromToday).stream() - .map(UpcomingScrapResponseDto::of) + .map(UpcomingScrapResponseDto.ScrapDetail::of) .toList(); }