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
20 changes: 20 additions & 0 deletions src/main/java/capstone/checkIT/DTO/MonthDTO/MonthRequestDTO.java
Original file line number Diff line number Diff line change
@@ -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;


}
}
42 changes: 42 additions & 0 deletions src/main/java/capstone/checkIT/DTO/MonthDTO/MonthResponseDTO.java
Original file line number Diff line number Diff line change
@@ -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<String> checkDay;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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", "현재 접속중인 디바이스가 아닙니다."),
Expand All @@ -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;
Expand Down
63 changes: 63 additions & 0 deletions src/main/java/capstone/checkIT/controller/MonthController.java
Original file line number Diff line number Diff line change
@@ -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<MonthResponseDTO.CreateMonthDto> 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<MonthResponseDTO.CreateMonthDto> 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<MonthResponseDTO.getMonthDto> 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<String> 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<MonthResponseDTO.getMonthDto> getMonth(HttpServletRequest token, @PathVariable Long monthId){
String accessToken = jwtManager.getToken(token);
MonthResponseDTO.getMonthDto response = monthService.getMonth(accessToken, monthId);
return ApiResponse.onSuccess(response);
}
}
Original file line number Diff line number Diff line change
@@ -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<Check, Long> {
List<Check> findByProductId(Long productId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface MonthRepository extends JpaRepository<Month, Long> {
List<Month> findByMemberId(Long memberId);
Optional<Month> findByIdAndMemberId(Long Id, Long memberId);

}
Original file line number Diff line number Diff line change
@@ -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<Product, Long> {
Optional<Product> findByName(String name);
}
Original file line number Diff line number Diff line change
@@ -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<Todo, Long> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
@@ -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<Check> 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<String> 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();




}
}