From 38389422e6a0b797850f53560bd05743d54efcce Mon Sep 17 00:00:00 2001 From: lehojun Date: Mon, 19 May 2025 17:05:36 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT]=20#19=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=9E=91=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/PostRepository.java | 7 +++ .../example/be/service/PostServiceImpl.java | 58 +++++++++++++++++++ .../example/be/service/UserServiceImpl.java | 2 + .../be/web/controller/PostController.java | 32 ++++++++++ .../java/com/example/be/web/dto/PostDTO.java | 41 +++++++++++++ 5 files changed, 140 insertions(+) create mode 100644 src/main/java/com/example/be/repository/PostRepository.java create mode 100644 src/main/java/com/example/be/service/PostServiceImpl.java create mode 100644 src/main/java/com/example/be/web/controller/PostController.java create mode 100644 src/main/java/com/example/be/web/dto/PostDTO.java diff --git a/src/main/java/com/example/be/repository/PostRepository.java b/src/main/java/com/example/be/repository/PostRepository.java new file mode 100644 index 0000000..e35d693 --- /dev/null +++ b/src/main/java/com/example/be/repository/PostRepository.java @@ -0,0 +1,7 @@ +package com.example.be.repository; + +import com.example.be.domain.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository extends JpaRepository { +} diff --git a/src/main/java/com/example/be/service/PostServiceImpl.java b/src/main/java/com/example/be/service/PostServiceImpl.java new file mode 100644 index 0000000..c663d52 --- /dev/null +++ b/src/main/java/com/example/be/service/PostServiceImpl.java @@ -0,0 +1,58 @@ +package com.example.be.service; + + +import com.example.be.apiPayload.ApiResponse; +import com.example.be.apiPayload.code.status.ErrorStatus; +import com.example.be.apiPayload.exception.handler.UserHandler; +import com.example.be.domain.Post; +import com.example.be.domain.User; +import com.example.be.repository.PostRepository; +import com.example.be.repository.UserRepository; +import com.example.be.web.dto.CommonDTO; +import com.example.be.web.dto.PostDTO; +import com.example.be.web.dto.UserDTO; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.UUID; + + +@Service +@RequiredArgsConstructor +public class PostServiceImpl { + private final JwtUtilServiceImpl jwtUtilService; + private final UserRepository userRepository; + private final PostRepository postRepository; + + public CommonDTO.IsSuccessDTO write(PostDTO.postRequestDTO request, HttpServletRequest req) { + + String accessToken = jwtUtilService.extractTokenFromCookie(req, "accessToken"); + + // 토큰이 없는 경우 처리 + if(accessToken == null) { + throw new UserHandler(ErrorStatus._NOT_FOUND_USER); + } + + // 토큰에서 사용자 ID 추출 + String userId = jwtUtilService.getUserIdFromToken(accessToken); + + // 사용자 정보 조회 + User user = userRepository.findByUserId(UUID.fromString(userId)) + .orElseThrow(() -> new UserHandler(ErrorStatus._NOT_FOUND_USER)); + + Post post = Post.builder() + .title(request.getTitle()) + .content(request.getContent()) + .user(user) + .createDate(LocalDateTime.now()) + .build(); + + postRepository.save(post); + + + return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build(); + } +} diff --git a/src/main/java/com/example/be/service/UserServiceImpl.java b/src/main/java/com/example/be/service/UserServiceImpl.java index 7786098..897f690 100644 --- a/src/main/java/com/example/be/service/UserServiceImpl.java +++ b/src/main/java/com/example/be/service/UserServiceImpl.java @@ -127,6 +127,8 @@ public UserDTO.UserResponseDto getUserInfo(String accessToken) { .loginType(user.getProvider()) .build(); } + + public CommonDTO.IsSuccessDTO logout(HttpServletResponse response, HttpServletRequest request) { Cookie[] cookies = request.getCookies(); diff --git a/src/main/java/com/example/be/web/controller/PostController.java b/src/main/java/com/example/be/web/controller/PostController.java new file mode 100644 index 0000000..e19cbe5 --- /dev/null +++ b/src/main/java/com/example/be/web/controller/PostController.java @@ -0,0 +1,32 @@ +package com.example.be.web.controller; + +import com.example.be.apiPayload.ApiResponse; +import com.example.be.apiPayload.code.status.ErrorStatus; +import com.example.be.apiPayload.exception.handler.UserHandler; +import com.example.be.domain.User; +import com.example.be.repository.UserRepository; +import com.example.be.service.JwtUtilServiceImpl; +import com.example.be.service.PostServiceImpl; +import com.example.be.web.dto.CommonDTO; +import com.example.be.web.dto.PostDTO; +import com.example.be.web.dto.UserDTO; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/post") +@RequiredArgsConstructor +public class PostController { + + private final PostServiceImpl postService; + + @PostMapping("/write") + @Operation(summary = "게시글 작성 API") + public ApiResponse write(@RequestBody PostDTO.postRequestDTO request, HttpServletRequest req) { + + return ApiResponse.onSuccess(postService.write(request, req)); + } + +} diff --git a/src/main/java/com/example/be/web/dto/PostDTO.java b/src/main/java/com/example/be/web/dto/PostDTO.java new file mode 100644 index 0000000..f6d26e9 --- /dev/null +++ b/src/main/java/com/example/be/web/dto/PostDTO.java @@ -0,0 +1,41 @@ +package com.example.be.web.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.Date; +import java.util.List; + +public class PostDTO { + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class postRequestDTO{ + String title; + String content; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class postResponseDTO { + String title; + String content; + String user; + LocalDate date; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class postListResponseDTO{ + List postList; + } +}