diff --git a/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java index 2f3a20b..77ee252 100644 --- a/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java @@ -33,7 +33,11 @@ public enum ErrorStatus implements BaseErrorCode { _NOT_USER_COMMENT(HttpStatus.NOT_FOUND, "COMMENT402", "해당 유저의 댓글이 아닙니다."), //스터디룸 관련 에러 - _NOT_FOUND_ROOM(HttpStatus.NOT_FOUND, "ROOM401", "해당 방의 이름을 찾을 수 없습니다."); + _NOT_FOUND_ROOM(HttpStatus.NOT_FOUND, "ROOM401", "해당 방의 이름을 찾을 수 없습니다."), + + //디데이 관련 에러 + _NOT_USER_DDAY(HttpStatus.BAD_REQUEST, "DDAY401", "해당 유저의 디데이가 아닙니다."), + _NOT_FOUND_DDAY(HttpStatus.NOT_FOUND, "DDAY402", "해당 디데이를 찾을 수 없습니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/com/example/be/apiPayload/exception/handler/DDayHandler.java b/src/main/java/com/example/be/apiPayload/exception/handler/DDayHandler.java new file mode 100644 index 0000000..b65d81f --- /dev/null +++ b/src/main/java/com/example/be/apiPayload/exception/handler/DDayHandler.java @@ -0,0 +1,10 @@ +package com.example.be.apiPayload.exception.handler; + +import com.example.be.apiPayload.code.BaseErrorCode; +import com.example.be.apiPayload.exception.GeneralException; + +public class DDayHandler extends GeneralException { + public DDayHandler(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/example/be/domain/DDay.java b/src/main/java/com/example/be/domain/DDay.java new file mode 100644 index 0000000..15243f0 --- /dev/null +++ b/src/main/java/com/example/be/domain/DDay.java @@ -0,0 +1,28 @@ +package com.example.be.domain; + +import com.example.be.domain.enums.Role; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDate; + +@Entity +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DDay { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + private LocalDate day; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; +} diff --git a/src/main/java/com/example/be/domain/User.java b/src/main/java/com/example/be/domain/User.java index 3068895..b5bc522 100644 --- a/src/main/java/com/example/be/domain/User.java +++ b/src/main/java/com/example/be/domain/User.java @@ -55,6 +55,9 @@ public class User { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List posts; + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) + private List dDays; + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private Participant participant; diff --git a/src/main/java/com/example/be/repository/DDayRepository.java b/src/main/java/com/example/be/repository/DDayRepository.java new file mode 100644 index 0000000..d455dc0 --- /dev/null +++ b/src/main/java/com/example/be/repository/DDayRepository.java @@ -0,0 +1,16 @@ +package com.example.be.repository; + +import com.example.be.domain.DDay; +import com.example.be.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + + +public interface DDayRepository extends JpaRepository { + + List findDDayByUser(User user); + + Optional findByIdAndUser(Long id, User user); +} diff --git a/src/main/java/com/example/be/service/DDayServiceImpl.java b/src/main/java/com/example/be/service/DDayServiceImpl.java new file mode 100644 index 0000000..0ba7ef4 --- /dev/null +++ b/src/main/java/com/example/be/service/DDayServiceImpl.java @@ -0,0 +1,94 @@ +package com.example.be.service; + +import com.example.be.apiPayload.code.status.ErrorStatus; +import com.example.be.apiPayload.exception.handler.DDayHandler; +import com.example.be.apiPayload.exception.handler.UserHandler; +import com.example.be.domain.DDay; +import com.example.be.domain.User; +import com.example.be.repository.DDayRepository; +import com.example.be.repository.UserRepository; +import com.example.be.web.dto.CommonDTO; +import com.example.be.web.dto.DDayDTO; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class DDayServiceImpl { + private final UserRepository userRepository; + private final JwtUtilServiceImpl jwtUtilService; + private final DDayRepository dayRepository; + + private User getUserFromRequest(HttpServletRequest request) { + try { + String accessToken = jwtUtilService.extractTokenFromCookie(request, "accessToken"); + if (accessToken != null) { + String userId = jwtUtilService.getUserIdFromToken(accessToken); + return userRepository.findByUserId(UUID.fromString(userId)).orElse(null); + } + } catch (Exception e) { + throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE); + } + return null; + } + + public CommonDTO.IsSuccessDTO createDDay(HttpServletRequest request, DDayDTO.DDayRequestDto requestDto) { + User user = getUserFromRequest(request); + + DDay dDay = DDay.builder() + .name(requestDto.getName()) + .day(requestDto.getDay()) + .user(user) + .build(); + + dayRepository.save(dDay); + + return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build(); + } + + public List getDDays(HttpServletRequest request) { + User user = getUserFromRequest(request); + List dDayList = dayRepository.findDDayByUser(user); + + return dDayList.stream() + .map(day -> DDayDTO.DDayResponseDto.builder() + .id(day.getId()) + .name(day.getName()) + .day(day.getDay()) + .build()) + .collect(Collectors.toList()); + } + + public CommonDTO.IsSuccessDTO deleteDDay (HttpServletRequest request, Long id) { + User user = getUserFromRequest(request); + + dayRepository.findById(id).orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_FOUND_DDAY)); + DDay dDay = dayRepository.findByIdAndUser(id, user) + .orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_USER_DDAY)); + + dayRepository.delete(dDay); + + return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build(); + } + + public CommonDTO.IsSuccessDTO editDDay (HttpServletRequest request, DDayDTO.DDayEditRequestDto requestDto) { + User user = getUserFromRequest(request); + + dayRepository.findById(requestDto.getId()).orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_FOUND_DDAY)); + DDay dDay = dayRepository.findByIdAndUser(requestDto.getId(), user) + .orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_USER_DDAY)); + + dDay.setName(requestDto.getName()); + dDay.setDay(requestDto.getDay()); + + dayRepository.save(dDay); + + return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build(); + } +} diff --git a/src/main/java/com/example/be/web/controller/DDayController.java b/src/main/java/com/example/be/web/controller/DDayController.java new file mode 100644 index 0000000..f117bea --- /dev/null +++ b/src/main/java/com/example/be/web/controller/DDayController.java @@ -0,0 +1,50 @@ +package com.example.be.web.controller; + +import com.example.be.apiPayload.ApiResponse; +import com.example.be.service.DDayServiceImpl; +import com.example.be.web.dto.CommentDTO; +import com.example.be.web.dto.CommonDTO; +import com.example.be.web.dto.DDayDTO; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import retrofit2.http.POST; + +import java.util.List; + +@RestController +@RequestMapping("/day") +@RequiredArgsConstructor +public class DDayController { + private final DDayServiceImpl dayService; + + @PostMapping("") + @Operation(summary = "디데이 추가 API", description = "디데이를 추가합니다.") + public ApiResponse createDDay( + HttpServletRequest request, + @RequestBody DDayDTO.DDayRequestDto requestDto) { + return ApiResponse.onSuccess(dayService.createDDay(request, requestDto)); + } + + @DeleteMapping("/{id}") + @Operation(summary = "디데이 삭제 API", description = "디데이를 삭제합니다.") + public ApiResponse deleteDDay( + HttpServletRequest request, @PathVariable Long id) { + return ApiResponse.onSuccess(dayService.deleteDDay(request, id)); + } + + @PostMapping("/{id}") + @Operation(summary = "디데이 수정 API", description = "디데이를 수정합니다.") + public ApiResponse editDDay( + HttpServletRequest request, @RequestBody DDayDTO.DDayEditRequestDto requestDto) { + return ApiResponse.onSuccess(dayService.editDDay(request, requestDto)); + } + + @GetMapping("") + @Operation(summary = "디데이 조회 API", description = "디데이를 조회합니다.") + public ApiResponse> getDDay( + HttpServletRequest request) { + return ApiResponse.onSuccess(dayService.getDDays(request)); + } +} diff --git a/src/main/java/com/example/be/web/dto/DDayDTO.java b/src/main/java/com/example/be/web/dto/DDayDTO.java new file mode 100644 index 0000000..7618b91 --- /dev/null +++ b/src/main/java/com/example/be/web/dto/DDayDTO.java @@ -0,0 +1,39 @@ +package com.example.be.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +public class DDayDTO { + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class DDayRequestDto { + private String name; + private LocalDate day; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class DDayResponseDto { + private Long id; + private String name; + private LocalDate day; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class DDayEditRequestDto { + private Long id; + private String name; + private LocalDate day; + } +}