Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
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 jakarta.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
Expand All @@ -17,8 +19,8 @@ public class PostController {

// GET /posts
@GetMapping
public ResponseEntity<List<Post>> getPosts() {
return ResponseEntity.ok(postService.getPosts());
public ResponseEntity<List<Post>> getPosts(@RequestParam("tag") @Nullable Tag tag{
return ResponseEntity.ok(postService.getPosts(tag));
}

// GET /posts/{postId}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
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 com.com.cnu.devlog_springboot.type.Tag;
import jakarta.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/projects")
@RequiredArgsConstructor
public class ProjectController {
private final ProjectService projectService;

// GET /projects
@GetMapping
public ResponseEntity<List<Project>> getProjects() {
return ResponseEntity.ok(projectService.getProjects());
}

// GET /projects/{projectId}
@GetMapping("{projectId}")
public ResponseEntity<Project> getProject(@PathVariable("projectId")Integer projectId) {
return ResponseEntity.ok(projectService.getProject(projectId));
}

// POST /projects
@PostMapping
public ResponseEntity<Project> createProject(@RequestBody ProjectRequest projectRequest) {
return ResponseEntity.ok(projectService.creatProject(projectRequest));
}

// PUT /projects/{projectId}
// ex. localhost:8080/projects/3
@PutMapping("{projectId}")
public ResponseEntity<Project> updateProject(
@PathVariable("projectId")Integer projectId,
@RequestBody ProjectRequest projectRequest
) {
return ResponseEntity.ok(projectService.updateProject(projectId, projectRequest));
}

// DELETE /projects/{projectId}
@DeleteMapping("{projectId}")
public ResponseEntity<Void> deleteProject(@PathVariable("projectId") Integer projectId) {
projectService.deleteProject(projectId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.com.cnu.devlog_springboot.exception;

import com.com.cnu.devlog_springboot.model.response.ErrorResponse;
import jakarta.servlet.http.HttpServlet;
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<ErrorResponse> handleDevlogException(
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()
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.com.cnu.devlog_springboot.model.response;

public record ErrorResponse (
String title,
Integer status,
Integer code,
String instance

) {

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.com.cnu.devlog_springboot.repository;

import com.com.cnu.devlog_springboot.model.Post;
import com.com.cnu.devlog_springboot.type.Tag;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface PostRepository extends JpaRepository<Post, Integer> {
// Post save(Post post);
// List<Post> findAll();
// Optional<Post> findById(Integer postId);
// void delete(Post post);
List<Post> findAllByTag(Tag tag);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.com.cnu.devlog_springboot.repository;

import com.com.cnu.devlog_springboot.model.Project;
import com.com.cnu.devlog_springboot.type.Tag;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ProjectRepository extends JpaRepository<Project, Integer> {
// Project save(Project project);
// List<Project> findAll();
// Optional<Project> findById(Integer projectId);
// void delete(Project project);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
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 jakarta.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -13,7 +17,10 @@
public class PostService {
private final PostRepository postRepository;

public List<Post> getPosts() {
public List<Post> getPosts(@Nullable Tag tag) {
if (tag != null) {
return postRepository.findAllByTag(tag);
}
return postRepository.findAll();
}

Expand All @@ -38,7 +45,7 @@ public Post updatePost(Integer postId, PostRequest postRequest) {

public Post getPost(Integer postId) {
return postRepository.findById(postId)
.orElse(null);
.orElseThrow(() -> new DevlogException(ErrorCode.POST_NOT_FOUND));
}

public void deletePost(Integer postId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
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 com.com.cnu.devlog_springboot.type.Tag;
import jakarta.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;

@Service
@RequiredArgsConstructor
public class ProjectService {
private final ProjectRepository projectRepository;

public List<Project> getProjects() {
return projectRepository.findAll();
}

public Project creatProject(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) {
Project project = projectRepository.findById(projectId)
.orElseThrow(() -> new DevlogException(ErrorCode.PROJECT_NOT_FOUND));
projectRepository.delete(project);
}
}
30 changes: 30 additions & 0 deletions src/main/java/com/com/cnu/devlog_springboot/type/ErrorCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.com.cnu.devlog_springboot.type;

import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
public enum ErrorCode {
//4XX
POST_NOT_FOUND(
HttpStatus.NOT_FOUND,
4000,
"해당 게시물을 찾을 수 없습니다."
),

PROJECT_NOT_FOUND(
HttpStatus.NOT_FOUND,
404,
"해당 프로젝트을 찾을 수 없습니다."
);

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;
}

}