diff --git a/src/main/java/capstone/checkIT/DTO/MonthDTO/MonthRequestDTO.java b/src/main/java/capstone/checkIT/DTO/MonthDTO/MonthRequestDTO.java new file mode 100644 index 0000000..03d6a2e --- /dev/null +++ b/src/main/java/capstone/checkIT/DTO/MonthDTO/MonthRequestDTO.java @@ -0,0 +1,20 @@ +package capstone.checkIT.DTO.MonthDTO; + +import capstone.checkIT.entity.Member; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +public class MonthRequestDTO { + @Setter + @Getter + @Builder + public static class CreateMonthDto { + + private String productName; + + private Integer frequency; + + + } +} diff --git a/src/main/java/capstone/checkIT/DTO/MonthDTO/MonthResponseDTO.java b/src/main/java/capstone/checkIT/DTO/MonthDTO/MonthResponseDTO.java new file mode 100644 index 0000000..c4202af --- /dev/null +++ b/src/main/java/capstone/checkIT/DTO/MonthDTO/MonthResponseDTO.java @@ -0,0 +1,42 @@ +package capstone.checkIT.DTO.MonthDTO; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +public class MonthResponseDTO { + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class CreateMonthDto { + private Long id; + + private Long memberId; + + private String productName; + + private Integer frequency; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class getMonthDto{ + + private Long monthId; + + private Long memberId; + + private String productName; + + private String sentence; + + private List checkDay; + } + +} diff --git a/src/main/java/capstone/checkIT/apipayLoad/code/status/ErrorStatus.java b/src/main/java/capstone/checkIT/apipayLoad/code/status/ErrorStatus.java index 2f79662..ab5c42c 100644 --- a/src/main/java/capstone/checkIT/apipayLoad/code/status/ErrorStatus.java +++ b/src/main/java/capstone/checkIT/apipayLoad/code/status/ErrorStatus.java @@ -21,9 +21,6 @@ public enum ErrorStatus implements BaseCode { TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED, "TOKEN4002", "토큰이 만료되었습니다"), TOKEN_NOT_FOUND(HttpStatus.UNAUTHORIZED, "TOKEN4003", "인증이 필요한 요청입니다"), TOKEN_UNKNOWN_ERROR(HttpStatus.UNAUTHORIZED, "TOKEN500", "토큰이 존재하지 않습니다."), - - - // DEVICE DEVICE_NOT_FOUND(HttpStatus.UNAUTHORIZED, "DEVICE4001", "해당 디바이스가 존재하지 않습니다."), DEVICE_UNVALID(HttpStatus.UNAUTHORIZED, "DEVICE4002", "현재 접속중인 디바이스가 아닙니다."), @@ -32,7 +29,13 @@ public enum ErrorStatus implements BaseCode { // Location START_TIME_NOT_FOUND(HttpStatus.BAD_REQUEST, "STARTTIME4001", "해당 시작시간이 존재하지 않습니다."), - LOCATION_NOT_FOUND(HttpStatus.BAD_REQUEST, "LOCATION4001", "위치정보를 찾을 수 없습니다."); + LOCATION_NOT_FOUND(HttpStatus.BAD_REQUEST, "LOCATION4001", "위치정보를 찾을 수 없습니다."), + + //Month + MONTH_NOT_EXIST(HttpStatus.BAD_REQUEST, "MONTH4001","해당하는 한달 목표가 존재하지 않습니다."), + // product + PRODUCT_NOT_EXIST(HttpStatus.BAD_REQUEST,"PRODUCT4001","해당하는 소지품이 없습니다."); + private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/capstone/checkIT/controller/MonthController.java b/src/main/java/capstone/checkIT/controller/MonthController.java index cd01c52..a7f75b3 100644 --- a/src/main/java/capstone/checkIT/controller/MonthController.java +++ b/src/main/java/capstone/checkIT/controller/MonthController.java @@ -1,4 +1,67 @@ package capstone.checkIT.controller; +import capstone.checkIT.DTO.MonthDTO.MonthRequestDTO; +import capstone.checkIT.DTO.MonthDTO.MonthResponseDTO; +import capstone.checkIT.apipayLoad.ApiResponse; +import capstone.checkIT.config.JwtManager; +import capstone.checkIT.service.monthService.MonthService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/months") public class MonthController { + private final MonthService monthService; + private final JwtManager jwtManager; + + @PostMapping + @Operation(summary="한달 목표 생성 API", + description="한달 목표 생성 API",security = {@SecurityRequirement(name="session-token")} ) + public ApiResponse createMonth(HttpServletRequest token, @RequestBody @Valid MonthRequestDTO.CreateMonthDto request){ + String accessToken = jwtManager.getToken(token); + MonthResponseDTO.CreateMonthDto response = monthService.createMonth(accessToken, request); + return ApiResponse.onSuccess(response); + + } + + @PatchMapping("/{monthId}") + @Operation(summary="한달 목표 수정 API", + description="한달 목표 수정 API",security = {@SecurityRequirement(name="session-token")} ) + public ApiResponse updateMonth(HttpServletRequest token, @PathVariable Long monthId, @RequestBody @Valid MonthRequestDTO.CreateMonthDto request){ + String accessToken = jwtManager.getToken(token); + MonthResponseDTO.CreateMonthDto response= monthService.updateMonth(accessToken, monthId, request); + return ApiResponse.onSuccess(response); + } + + @PatchMapping("/achieves/{monthId}") + @Operation(summary="한달 목표 하루 달성 API", + description="한달 목표 하루 달성 API",security = {@SecurityRequirement(name="session-token")} ) + public ApiResponse achieveDay(HttpServletRequest token, @PathVariable Long monthId, @RequestParam boolean newIsStart){ + String accessToken = jwtManager.getToken(token); + MonthResponseDTO.getMonthDto response = monthService.achieveDay(accessToken, monthId, newIsStart); + return ApiResponse.onSuccess(response); + } + + @DeleteMapping("/{monthId}") + @Operation(summary="한달 목표 삭제 API", + description="한달 목표 삭제 API",security = {@SecurityRequirement(name="session-token")} ) + public ApiResponse deleteMonth(HttpServletRequest token, @PathVariable Long monthId){ + String accessToken = jwtManager.getToken(token); + monthService.deleteMonth(accessToken, monthId); + return ApiResponse.onSuccess("삭제 성공"); + } + + @GetMapping("/{monthId}") + @Operation(summary="한달 목표 조회 API", + description="한달 목표 조회 API",security = {@SecurityRequirement(name="session-token")} ) + public ApiResponse getMonth(HttpServletRequest token, @PathVariable Long monthId){ + String accessToken = jwtManager.getToken(token); + MonthResponseDTO.getMonthDto response = monthService.getMonth(accessToken, monthId); + return ApiResponse.onSuccess(response); + } } diff --git a/src/main/java/capstone/checkIT/repository/CheckRepository.java b/src/main/java/capstone/checkIT/repository/CheckRepository.java index 1d535ed..da0cfd7 100644 --- a/src/main/java/capstone/checkIT/repository/CheckRepository.java +++ b/src/main/java/capstone/checkIT/repository/CheckRepository.java @@ -1,4 +1,10 @@ package capstone.checkIT.repository; -public interface CheckRepository { +import capstone.checkIT.entity.Check; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CheckRepository extends JpaRepository { + List findByProductId(Long productId); } diff --git a/src/main/java/capstone/checkIT/repository/MonthRepository.java b/src/main/java/capstone/checkIT/repository/MonthRepository.java index c9969be..d3ba05b 100644 --- a/src/main/java/capstone/checkIT/repository/MonthRepository.java +++ b/src/main/java/capstone/checkIT/repository/MonthRepository.java @@ -4,8 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface MonthRepository extends JpaRepository { - List findByMemberId(Long memberId); + Optional findByIdAndMemberId(Long Id, Long memberId); } diff --git a/src/main/java/capstone/checkIT/repository/ProductRepository.java b/src/main/java/capstone/checkIT/repository/ProductRepository.java index b91af31..bc6eaae 100644 --- a/src/main/java/capstone/checkIT/repository/ProductRepository.java +++ b/src/main/java/capstone/checkIT/repository/ProductRepository.java @@ -1,4 +1,10 @@ package capstone.checkIT.repository; -public interface ProductRepository { +import capstone.checkIT.entity.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ProductRepository extends JpaRepository { + Optional findByName(String name); } diff --git a/src/main/java/capstone/checkIT/repository/TodoRepository.java b/src/main/java/capstone/checkIT/repository/TodoRepository.java index ed763e7..bef7fe5 100644 --- a/src/main/java/capstone/checkIT/repository/TodoRepository.java +++ b/src/main/java/capstone/checkIT/repository/TodoRepository.java @@ -1,4 +1,8 @@ package capstone.checkIT.repository; -public interface TodoRepository { +import capstone.checkIT.entity.Todo; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TodoRepository extends JpaRepository { + } diff --git a/src/main/java/capstone/checkIT/service/memberService/MemberServiceImpl.java b/src/main/java/capstone/checkIT/service/memberService/MemberServiceImpl.java index 03b1e84..8e265bd 100644 --- a/src/main/java/capstone/checkIT/service/memberService/MemberServiceImpl.java +++ b/src/main/java/capstone/checkIT/service/memberService/MemberServiceImpl.java @@ -7,6 +7,7 @@ import capstone.checkIT.config.JwtManager; import capstone.checkIT.converter.MyInfoConverter; import capstone.checkIT.entity.Member; +import capstone.checkIT.exception.GeneralException; import capstone.checkIT.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -24,7 +25,7 @@ public MemberResponseDTO.MypageDTO getMyPage(String accessToken) { Long memberId = jwtManager.validateJwt(accessToken); Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new TempHandler(ErrorStatus.LOGIN_ERROR_EMAIL)); + .orElseThrow(() -> new GeneralException(ErrorStatus.LOGIN_ERROR_EMAIL)); return MyInfoConverter.toMyInfoResponseDTO(member); @@ -34,7 +35,7 @@ public MemberResponseDTO.MypageDTO getMyPage(String accessToken) { public MemberResponseDTO.MypageDTO updateMyInfo(String accessToken, MemberRequestDTO.MyDetailInfoDto myDetailInfoDto){ Long memberId = jwtManager.validateJwt(accessToken); Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new TempHandler(ErrorStatus.LOGIN_ERROR_EMAIL)); + .orElseThrow(() -> new GeneralException(ErrorStatus.LOGIN_ERROR_EMAIL)); // update code member.setName(myDetailInfoDto.getName()); diff --git a/src/main/java/capstone/checkIT/service/monthService/MonthService.java b/src/main/java/capstone/checkIT/service/monthService/MonthService.java index c364d15..dfdd303 100644 --- a/src/main/java/capstone/checkIT/service/monthService/MonthService.java +++ b/src/main/java/capstone/checkIT/service/monthService/MonthService.java @@ -1,4 +1,13 @@ package capstone.checkIT.service.monthService; +import capstone.checkIT.DTO.MonthDTO.MonthRequestDTO; +import capstone.checkIT.DTO.MonthDTO.MonthResponseDTO; +import capstone.checkIT.entity.Month; + public interface MonthService { + MonthResponseDTO.CreateMonthDto createMonth (String accessToken, MonthRequestDTO.CreateMonthDto request); + MonthResponseDTO.CreateMonthDto updateMonth (String accessToken, Long MonthId, MonthRequestDTO.CreateMonthDto request); + void deleteMonth (String accessToken, Long MonthId); + MonthResponseDTO.getMonthDto getMonth(String accessToken, Long MonthId); + MonthResponseDTO.getMonthDto achieveDay(String accessToken,Long monthId,boolean newIsStart); } diff --git a/src/main/java/capstone/checkIT/service/monthService/MonthServiceImpl.java b/src/main/java/capstone/checkIT/service/monthService/MonthServiceImpl.java index aad10ea..c3a50b3 100644 --- a/src/main/java/capstone/checkIT/service/monthService/MonthServiceImpl.java +++ b/src/main/java/capstone/checkIT/service/monthService/MonthServiceImpl.java @@ -1,9 +1,150 @@ package capstone.checkIT.service.monthService; +import capstone.checkIT.DTO.MonthDTO.MonthRequestDTO; +import capstone.checkIT.DTO.MonthDTO.MonthResponseDTO; +import capstone.checkIT.apipayLoad.code.status.ErrorStatus; +import capstone.checkIT.config.JwtManager; +import capstone.checkIT.entity.*; +import capstone.checkIT.exception.GeneralException; +import capstone.checkIT.repository.CheckRepository; +import capstone.checkIT.repository.MemberRepository; +import capstone.checkIT.repository.MonthRepository; +import capstone.checkIT.repository.ProductRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; @Service @RequiredArgsConstructor public class MonthServiceImpl implements MonthService { + private final MonthRepository monthRepository; + private final JwtManager jwtManager; + private final MemberRepository memberRepository; + private final CheckRepository checkRepository; + private final ProductRepository productRepository; + @Override + @Transactional + public MonthResponseDTO.CreateMonthDto createMonth (String accessToken, MonthRequestDTO.CreateMonthDto request){ + Long memberId = jwtManager.validateJwt(accessToken); + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.LOGIN_ERROR_EMAIL)); + Month month =Month.builder() + .productName(request.getProductName()) + .frequency(request.getFrequency()) + .member(member) + .build(); + monthRepository.save(month); + + return MonthResponseDTO.CreateMonthDto.builder() + .id(month.getId()) + .memberId(month.getMember().getId()) + .productName(month.getProductName()) + .frequency(month.getFrequency()) + .build(); + } + @Override + @Transactional + public MonthResponseDTO.CreateMonthDto updateMonth (String accessToken, Long MonthId, MonthRequestDTO.CreateMonthDto request){ + Long memberId = jwtManager.validateJwt(accessToken); + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.LOGIN_ERROR_EMAIL)); + Month month = monthRepository.findById(MonthId) + .orElseThrow(() -> new GeneralException(ErrorStatus.MONTH_NOT_EXIST)); + + month.setProductName(request.getProductName()); + month.setFrequency(request.getFrequency()); + + monthRepository.save(month); + + return MonthResponseDTO.CreateMonthDto.builder() + .id(MonthId) + .memberId(memberId) + .productName(month.getProductName()) + .frequency(month.getFrequency()) + .build(); + } + + @Override + @Transactional + public void deleteMonth (String accessToken, Long MonthId){ + Long memberId = jwtManager.validateJwt(accessToken); + Month month = monthRepository.findByIdAndMemberId(MonthId, memberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.MONTH_NOT_EXIST)); + + monthRepository.delete(month); + } + + @Override + @Transactional + public MonthResponseDTO.getMonthDto getMonth (String accessToken, Long MonthId){ + Long memberId = jwtManager.validateJwt(accessToken); + Month month = monthRepository.findByIdAndMemberId(MonthId, memberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.MONTH_NOT_EXIST)); + + return MonthResponseDTO.getMonthDto.builder() + .monthId(month.getId()) + .memberId(month.getMember().getId()) + .sentence(month.getSentence()) + .checkDay(month.getCheckDay()) + .build(); + } + + @Override + @Transactional + public MonthResponseDTO.getMonthDto achieveDay(String accessToken,Long monthId,boolean newIsStart){ + Long memberId= jwtManager.validateJwt(accessToken); + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new GeneralException(ErrorStatus.LOGIN_ERROR_EMAIL)); + Month month = monthRepository.findByIdAndMemberId(monthId, memberId) + .orElseThrow(()->new GeneralException(ErrorStatus.MONTH_NOT_EXIST)); + + Product product=productRepository.findByName(month.getProductName()) + .orElseThrow(()->new GeneralException(ErrorStatus.PRODUCT_NOT_EXIST)); + + + //기존 isStart 상태 확인 + boolean currentIsStart= member.getIsStart(); + + //isStart가 true -> false로 변경된 경우만 처리 + if(currentIsStart && !newIsStart){ + List checks=checkRepository.findByProductId(product.getId()); + + long trueCheckCount=checks.stream() + .filter(Check::getIsChecked) + .count(); + boolean allTrue=checks.stream() + .allMatch(Check::getIsChecked); + + if(allTrue || trueCheckCount >=3){ + // month의 startDate부터 오늘까지의 날짜 차이를 계산 + long daysDifference = ChronoUnit.DAYS.between(month.getStartDate(), LocalDate.now()) + 1; + + List checkDayList = month.getCheckDay(); // 기존 리스트 가져오기 + if (checkDayList == null) { + checkDayList = new ArrayList<>(); // 리스트가 null이면 새로 생성 + } + checkDayList.add(String.valueOf(daysDifference)); + month.setCheckDay(checkDayList); + monthRepository.save(month); + } + + } + + return MonthResponseDTO.getMonthDto.builder() + .monthId(month.getId()) + .memberId(memberId) + .productName(product.getName()) + .sentence(month.getSentence()) + .checkDay(month.getCheckDay()) + .build(); + + + + + } }