From 5f1430db71f30493e06d5d22f9a464227b723b15 Mon Sep 17 00:00:00 2001 From: lehojun Date: Thu, 12 Jun 2025 16:53:47 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[FEAT]=20#46=20=EB=94=94=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/be/domain/DDay.java | 28 +++++++++++++++++++ src/main/java/com/example/be/domain/User.java | 3 ++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/com/example/be/domain/DDay.java 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; From 82acea0dbfd37ca83e27f31c786ab766462c4d20 Mon Sep 17 00:00:00 2001 From: lehojun Date: Thu, 12 Jun 2025 16:54:04 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[FEAT]=20#46=20=EB=94=94=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/be/repository/DDayRepository.java | 9 ++++ .../example/be/service/DDayServiceImpl.java | 51 ++++++++++++++++++ .../be/web/controller/DDayController.java | 53 +++++++++++++++++++ .../java/com/example/be/web/dto/DDayDTO.java | 19 +++++++ 4 files changed, 132 insertions(+) create mode 100644 src/main/java/com/example/be/repository/DDayRepository.java create mode 100644 src/main/java/com/example/be/service/DDayServiceImpl.java create mode 100644 src/main/java/com/example/be/web/controller/DDayController.java create mode 100644 src/main/java/com/example/be/web/dto/DDayDTO.java 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..c157471 --- /dev/null +++ b/src/main/java/com/example/be/repository/DDayRepository.java @@ -0,0 +1,9 @@ +package com.example.be.repository; + +import com.example.be.domain.DDay; +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface DDayRepository extends JpaRepository { + +} 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..787ca71 --- /dev/null +++ b/src/main/java/com/example/be/service/DDayServiceImpl.java @@ -0,0 +1,51 @@ +package com.example.be.service; + +import com.example.be.apiPayload.code.status.ErrorStatus; +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.UUID; + +@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(); + } + +} 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..b8de5eb --- /dev/null +++ b/src/main/java/com/example/be/web/controller/DDayController.java @@ -0,0 +1,53 @@ +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.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@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)); + } + +// @PostMapping("") +// @Operation(summary = "디데이 삭제 API", description = "디데이를 삭제합니다.") +// public ApiResponse createComment( +// @RequestBody CommentDTO.CommentRequestDTO requestDTO, +// HttpServletRequest request) { +// return ApiResponse.onSuccess(commentService.createComment(requestDTO, request)); +// } +// +// @PostMapping("") +// @Operation(summary = "디데이 수정 API", description = "디데이를 수정합니다.") +// public ApiResponse createComment( +// @RequestBody CommentDTO.CommentRequestDTO requestDTO, +// HttpServletRequest request) { +// return ApiResponse.onSuccess(commentService.createComment(requestDTO, request)); +// } +// +// @PostMapping("") +// @Operation(summary = "디데이 조회 API", description = "디데이를 조회합니다.") +// public ApiResponse createComment( +// @RequestBody CommentDTO.CommentRequestDTO requestDTO, +// HttpServletRequest request) { +// return ApiResponse.onSuccess(commentService.createComment(requestDTO, 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..7617c9b --- /dev/null +++ b/src/main/java/com/example/be/web/dto/DDayDTO.java @@ -0,0 +1,19 @@ +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; + } +} From 8bd0c96a15b299ab207e2b5c560781b42eca8367 Mon Sep 17 00:00:00 2001 From: lehojun Date: Thu, 12 Jun 2025 17:16:43 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[FEAT]=20#46=20=EB=94=94=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/be/repository/DDayRepository.java | 4 ++++ .../example/be/service/DDayServiceImpl.java | 15 ++++++++++++++ .../be/web/controller/DDayController.java | 20 +++++++++---------- .../java/com/example/be/web/dto/DDayDTO.java | 10 ++++++++++ 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/be/repository/DDayRepository.java b/src/main/java/com/example/be/repository/DDayRepository.java index c157471..0993d66 100644 --- a/src/main/java/com/example/be/repository/DDayRepository.java +++ b/src/main/java/com/example/be/repository/DDayRepository.java @@ -1,9 +1,13 @@ 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; + public interface DDayRepository extends JpaRepository { + List findDDayByUser(User user); } diff --git a/src/main/java/com/example/be/service/DDayServiceImpl.java b/src/main/java/com/example/be/service/DDayServiceImpl.java index 787ca71..7dc11fe 100644 --- a/src/main/java/com/example/be/service/DDayServiceImpl.java +++ b/src/main/java/com/example/be/service/DDayServiceImpl.java @@ -12,7 +12,10 @@ 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 @@ -48,4 +51,16 @@ public CommonDTO.IsSuccessDTO createDDay(HttpServletRequest request, DDayDTO.DDa 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()); + } } diff --git a/src/main/java/com/example/be/web/controller/DDayController.java b/src/main/java/com/example/be/web/controller/DDayController.java index b8de5eb..13871f0 100644 --- a/src/main/java/com/example/be/web/controller/DDayController.java +++ b/src/main/java/com/example/be/web/controller/DDayController.java @@ -8,10 +8,9 @@ import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/day") @@ -43,11 +42,10 @@ public ApiResponse createDDay( // return ApiResponse.onSuccess(commentService.createComment(requestDTO, request)); // } // -// @PostMapping("") -// @Operation(summary = "디데이 조회 API", description = "디데이를 조회합니다.") -// public ApiResponse createComment( -// @RequestBody CommentDTO.CommentRequestDTO requestDTO, -// HttpServletRequest request) { -// return ApiResponse.onSuccess(commentService.createComment(requestDTO, request)); -// } + @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 index 7617c9b..15afbcb 100644 --- a/src/main/java/com/example/be/web/dto/DDayDTO.java +++ b/src/main/java/com/example/be/web/dto/DDayDTO.java @@ -16,4 +16,14 @@ 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; + } } From 803946cd12251c24fb1ab010c9abf83b7394e16d Mon Sep 17 00:00:00 2001 From: lehojun Date: Thu, 12 Jun 2025 17:25:59 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[FEAT]=20#46=20=EB=94=94=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../be/apiPayload/code/status/ErrorStatus.java | 6 +++++- .../apiPayload/exception/handler/DDayHandler.java | 10 ++++++++++ .../com/example/be/repository/DDayRepository.java | 3 +++ .../com/example/be/service/DDayServiceImpl.java | 13 +++++++++++++ .../example/be/web/controller/DDayController.java | 13 ++++++------- 5 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/be/apiPayload/exception/handler/DDayHandler.java 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/repository/DDayRepository.java b/src/main/java/com/example/be/repository/DDayRepository.java index 0993d66..d455dc0 100644 --- a/src/main/java/com/example/be/repository/DDayRepository.java +++ b/src/main/java/com/example/be/repository/DDayRepository.java @@ -5,9 +5,12 @@ 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 index 7dc11fe..9ce4297 100644 --- a/src/main/java/com/example/be/service/DDayServiceImpl.java +++ b/src/main/java/com/example/be/service/DDayServiceImpl.java @@ -1,6 +1,7 @@ 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; @@ -63,4 +64,16 @@ public List getDDays(HttpServletRequest request) { .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(); + } } diff --git a/src/main/java/com/example/be/web/controller/DDayController.java b/src/main/java/com/example/be/web/controller/DDayController.java index 13871f0..8062596 100644 --- a/src/main/java/com/example/be/web/controller/DDayController.java +++ b/src/main/java/com/example/be/web/controller/DDayController.java @@ -26,13 +26,12 @@ public ApiResponse createDDay( return ApiResponse.onSuccess(dayService.createDDay(request, requestDto)); } -// @PostMapping("") -// @Operation(summary = "디데이 삭제 API", description = "디데이를 삭제합니다.") -// public ApiResponse createComment( -// @RequestBody CommentDTO.CommentRequestDTO requestDTO, -// HttpServletRequest request) { -// return ApiResponse.onSuccess(commentService.createComment(requestDTO, request)); -// } + @DeleteMapping("/{id}") + @Operation(summary = "디데이 삭제 API", description = "디데이를 삭제합니다.") + public ApiResponse deleteDDay( + HttpServletRequest request, @PathVariable Long id) { + return ApiResponse.onSuccess(dayService.deleteDDay(request, id)); + } // // @PostMapping("") // @Operation(summary = "디데이 수정 API", description = "디데이를 수정합니다.") From 569f7a2816310384374825a8a0b230a4a70bda9a Mon Sep 17 00:00:00 2001 From: lehojun Date: Thu, 12 Jun 2025 17:34:00 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[FEAT]=20#46=20=EB=94=94=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/be/service/DDayServiceImpl.java | 15 +++++++++++++++ .../be/web/controller/DDayController.java | 18 +++++++++--------- .../java/com/example/be/web/dto/DDayDTO.java | 10 ++++++++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/be/service/DDayServiceImpl.java b/src/main/java/com/example/be/service/DDayServiceImpl.java index 9ce4297..0ba7ef4 100644 --- a/src/main/java/com/example/be/service/DDayServiceImpl.java +++ b/src/main/java/com/example/be/service/DDayServiceImpl.java @@ -76,4 +76,19 @@ public CommonDTO.IsSuccessDTO deleteDDay (HttpServletRequest request, Long id) { 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 index 8062596..f117bea 100644 --- a/src/main/java/com/example/be/web/controller/DDayController.java +++ b/src/main/java/com/example/be/web/controller/DDayController.java @@ -9,6 +9,7 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import retrofit2.http.POST; import java.util.List; @@ -32,15 +33,14 @@ public ApiResponse deleteDDay( HttpServletRequest request, @PathVariable Long id) { return ApiResponse.onSuccess(dayService.deleteDDay(request, id)); } -// -// @PostMapping("") -// @Operation(summary = "디데이 수정 API", description = "디데이를 수정합니다.") -// public ApiResponse createComment( -// @RequestBody CommentDTO.CommentRequestDTO requestDTO, -// HttpServletRequest request) { -// return ApiResponse.onSuccess(commentService.createComment(requestDTO, request)); -// } -// + + @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( diff --git a/src/main/java/com/example/be/web/dto/DDayDTO.java b/src/main/java/com/example/be/web/dto/DDayDTO.java index 15afbcb..7618b91 100644 --- a/src/main/java/com/example/be/web/dto/DDayDTO.java +++ b/src/main/java/com/example/be/web/dto/DDayDTO.java @@ -26,4 +26,14 @@ public static class DDayResponseDto { private String name; private LocalDate day; } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class DDayEditRequestDto { + private Long id; + private String name; + private LocalDate day; + } }