diff --git a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java index 7d6847f..4f569c7 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/PostController.java @@ -3,6 +3,11 @@ import com.com.cnu.devlog_springboot.model.Post; import com.com.cnu.devlog_springboot.model.request.PostRequest; import com.com.cnu.devlog_springboot.service.PostService; + +import com.com.cnu.devlog_springboot.type.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -17,8 +22,12 @@ public class PostController { // GET /posts @GetMapping + public ResponseEntity> getPosts(@RequestParam @Nullable Tag tag) { + return ResponseEntity.ok(postService.getPosts(tag)); + public ResponseEntity> getPosts() { return ResponseEntity.ok(postService.getPosts()); + } // GET /posts/{postId} diff --git a/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java b/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java new file mode 100644 index 0000000..4b244ad --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/controller/ProjectController.java @@ -0,0 +1,53 @@ +package com.com.cnu.devlog_springboot.controller; + +import com.com.cnu.devlog_springboot.model.Project; +import com.com.cnu.devlog_springboot.model.request.ProjectRequest; +import com.com.cnu.devlog_springboot.service.ProjectService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/projects") +@RequiredArgsConstructor +public class ProjectController { + + private final ProjectService projectService; + + @GetMapping + public ResponseEntity> getProjects() { + return ResponseEntity.ok(projectService.getProjects()); + } + + @GetMapping("/{projectId}") + public ResponseEntity getProject(@PathVariable Integer projectId) { + return ResponseEntity.ok(projectService.getProject(projectId)); + } + + @PostMapping + public ResponseEntity createProject(@RequestBody ProjectRequest projectRequest) { + return ResponseEntity.ok(projectService.createProject(projectRequest)); + } + + @PutMapping("{projectId}") + public ResponseEntity updateProject( + @PathVariable("projectId")Integer projectId, + @RequestBody ProjectRequest projectRequest + ) { + return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest)); + } + + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable("projectId") Integer projectId) { + projectService.deleteProject(projectId); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java new file mode 100644 index 0000000..9da0b4e --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/DevlogException.java @@ -0,0 +1,11 @@ +package com.com.cnu.devlog_springboot.exception; + +import com.com.cnu.devlog_springboot.type.ErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class DevlogException extends RuntimeException { + private final ErrorCode errorCode; +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..b141cb9 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/exception/GlobalExceptionHandler.java @@ -0,0 +1,27 @@ +package com.com.cnu.devlog_springboot.exception; + +import com.com.cnu.devlog_springboot.model.reponse.ErrorResponse; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(DevlogException.class) + public ResponseEntity handlerDevlogException( + HttpServletRequest request, DevlogException e + ) { + return ResponseEntity.status(e.getErrorCode().getHttpStatus()) + .body( + new ErrorResponse( + e.getErrorCode().getDescription(), + e.getErrorCode().getHttpStatus().value(), + e.getErrorCode().getErrorCode(), + request.getRequestURI() + ) + ); + + } +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java b/src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java new file mode 100644 index 0000000..01c6743 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/model/reponse/ErrorResponse.java @@ -0,0 +1,9 @@ +package com.com.cnu.devlog_springboot.model.reponse; + +public record ErrorResponse( + String title, + Integer status, + Integer code, + String instance +) { +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.java b/src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.java new file mode 100644 index 0000000..f9c509d --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/repository/ProgectRepository.java @@ -0,0 +1,7 @@ +package com.com.cnu.devlog_springboot.repository; + +import com.com.cnu.devlog_springboot.model.Project; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectRepository extends JpaRepository { +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java b/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java index 3823d7a..d1c8680 100644 --- a/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java +++ b/src/main/java/com/com/cnu/devlog_springboot/service/PostService.java @@ -1,9 +1,19 @@ package com.com.cnu.devlog_springboot.service; +import com.com.cnu.devlog_springboot.exception.DevlogException; import com.com.cnu.devlog_springboot.model.Post; import com.com.cnu.devlog_springboot.model.request.PostRequest; import com.com.cnu.devlog_springboot.repository.PostRepository; +import com.com.cnu.devlog_springboot.type.ErrorCode; +import com.com.cnu.devlog_springboot.type.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.lang.Nullable; + +import com.com.cnu.devlog_springboot.model.Post; +import com.com.cnu.devlog_springboot.model.request.PostRequest; +import com.com.cnu.devlog_springboot.repository.PostRepository; +import lombok.RequiredArgsConstructor; + import org.springframework.stereotype.Service; import java.util.List; @@ -13,7 +23,14 @@ public class PostService { private final PostRepository postRepository; + + public List getPosts(@Nullable Tag tag) { + if(tag != null) { + return postRepository.findAllByTag(tag); + } + public List getPosts() { + return postRepository.findAll(); } @@ -33,11 +50,18 @@ public Post updatePost(Integer postId, PostRequest postRequest) { post.setContents(postRequest.contents()); return postRepository.save(post); }) + + .orElseThrow(() -> new DevlogException(ErrorCode.POST_NOT_FOUND)); + .orElse(null); + } public Post getPost(Integer postId) { return postRepository.findById(postId) + + .orElseThrow(() -> new DevlogException(ErrorCode.POST_NOT_FOUND)); + .orElse(null); } diff --git a/src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java b/src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java new file mode 100644 index 0000000..7e16243 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/service/ProgectService.java @@ -0,0 +1,53 @@ +package com.com.cnu.devlog_springboot.service; + +import com.com.cnu.devlog_springboot.exception.DevlogException; +import com.com.cnu.devlog_springboot.model.Project; +import com.com.cnu.devlog_springboot.model.request.ProjectRequest; +import com.com.cnu.devlog_springboot.repository.ProjectRepository; +import com.com.cnu.devlog_springboot.type.ErrorCode; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ProjectService { + private final ProjectRepository projectRepository; + + public List getProjects() { + return projectRepository.findAll(); + } + + public Project createProject(ProjectRequest projectRequest) { + return projectRepository.save(new Project( + null, + projectRequest.title(), + projectRequest.summary(), + projectRequest.contents(), + projectRequest.startDate(), + projectRequest.endDate() + )); + } + public Project updateProject(Integer projectId, ProjectRequest projectRequest) { + return projectRepository.findById(projectId) + .map(Project -> { + Project.setTitle(projectRequest.title()); + Project.setSummary(projectRequest.summary()); + Project.setContents(projectRequest.contents()); + Project.setStartDate(projectRequest.startDate()); + Project.setEndDate(projectRequest.endDate()); + return projectRepository.save(Project); + }) + .orElseThrow(()-> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + public Project getProject(Integer projectId) { + return projectRepository.findById(projectId) + .orElseThrow(()-> new DevlogException(ErrorCode.PROJECT_NOT_FOUND)); + } + + public void deleteProject(Integer projectId) { + projectRepository.findById(projectId) + .ifPresent(projectRepository::delete); + } +} diff --git a/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java b/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java new file mode 100644 index 0000000..f8460f3 --- /dev/null +++ b/src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java @@ -0,0 +1,29 @@ +package com.com.cnu.devlog_springboot.type; + + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum ErrorCode { + POST_NOT_FOUND( + HttpStatus.NOT_FOUND, + 4000, + "해당 게시글을 찾을 수 없습니다."), + + PROJECT_NOT_FOUND( + HttpStatus.NOT_FOUND, + 4001, + "해당 프로젝트를 찾을 수 없습니다.") + ; + + private final HttpStatus httpStatus; + private final Integer errorCode; + private final String description; + + ErrorCode(HttpStatus httpStatus, Integer errorCode, String description) { + this.httpStatus = httpStatus; + this.errorCode = errorCode; + this.description = description; + } +} diff --git a/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java b/src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests (2).java similarity index 100% rename from src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests.java rename to src/test/java/com/com/cnu/devlog_springboot/DevlogSpringbootApplicationTests (2).java