Skip to content
Merged

Step2 #107

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/main/java/codesquad/domain/Issue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package codesquad.domain;

import codesquad.dto.IssueDto;
import support.domain.AbstractEntity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.validation.constraints.Size;

@Entity
public class Issue extends AbstractEntity {

@Size(min = 3, max = 80)
@Column(nullable = false, length = 80)
private String subject;

@Size(min = 3)
@Lob
@Column(nullable = false)
private String comment;

public Issue() {
}

public Issue(String subject, String comment) {
this.subject = subject;
this.comment = comment;
}

public String getSubject() {
return subject;
}

public void setSubject(String subject) {
this.subject = subject;
}

public String getComment() {
return comment;
}

public void setComment(String comment) {
this.comment = comment;
}

public IssueDto _toIssueDto() {
return new IssueDto(this.subject, this.comment);
}
}
9 changes: 9 additions & 0 deletions src/main/java/codesquad/domain/IssueRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package codesquad.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface IssueRepository extends JpaRepository<Issue, Long> {
Optional<Issue> findBySubject(String subject);
}
65 changes: 65 additions & 0 deletions src/main/java/codesquad/dto/IssueDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package codesquad.dto;

import codesquad.domain.Issue;

import javax.validation.constraints.Size;
import java.util.Objects;

public class IssueDto {
@Size(min = 3, max = 80)
private String subject;

@Size(min = 3)
private String comment;

public IssueDto() {
}

public IssueDto(String subject, String comment) {
super();
this.subject = subject;
this.comment = comment;
}

public String getSubject() {
return subject;
}

public void setSubject(String subject) {
this.subject = subject;
}

public String getComment() {
return comment;
}

public void setComment(String comment) {
this.comment = comment;
}

public Issue _toIssue() {
return new Issue(this.subject, this.comment);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
IssueDto issueDto = (IssueDto) o;
return Objects.equals(subject, issueDto.subject) &&
Objects.equals(comment, issueDto.comment);
}

@Override
public int hashCode() {
return Objects.hash(subject, comment);
}

@Override
public String toString() {
return "IssueDto{" +
"subject='" + subject + '\'' +
", comment='" + comment + '\'' +
'}';
}
}
2 changes: 2 additions & 0 deletions src/main/java/codesquad/dto/UserDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import codesquad.domain.User;

import javax.validation.constraints.Size;
import java.util.Objects;

public class UserDto {
@Size(min = 3, max = 20)
Expand Down Expand Up @@ -62,6 +63,7 @@ public int hashCode() {
return result;
}


@Override
public boolean equals(Object obj) {
if (this == obj)
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/codesquad/service/IssueService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package codesquad.service;

import java.util.List;

import codesquad.UnAuthorizedException;
import codesquad.domain.Issue;
import codesquad.domain.IssueRepository;
import codesquad.dto.IssueDto;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class IssueService {

@Resource(name = "issueRepository")
private IssueRepository issueRepository;


public void add(IssueDto issueDto) {
issueRepository.save(issueDto._toIssue());
}

public Iterable<Issue> findAll() {
return issueRepository.findAll();
}

public IssueDto findById(long id) {
return issueRepository.findById(id)
.orElseThrow(UnAuthorizedException::new)._toIssueDto();
}
}
23 changes: 23 additions & 0 deletions src/main/java/codesquad/validate/RestResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package codesquad.validate;

import java.util.HashMap;
import java.util.Map;

public class RestResponse extends RestStatus{
private Map<String, Object> result;

public RestResponse() {
super(true);
result = new HashMap<>();
}

public void addAttribute(String key, Object value) {
result.put(key, value);
}

public Map<String, Object> getResult() {
return result;
}


}
20 changes: 20 additions & 0 deletions src/main/java/codesquad/validate/RestStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package codesquad.validate;

public class RestStatus {
private boolean status;

public RestStatus(boolean status) {
this.status = status;
}

public boolean isStatus() {
return status;
}

@Override
public String toString() {
return "RestStatus{" +
"status=" + status +
'}';
}
}
27 changes: 27 additions & 0 deletions src/main/java/codesquad/validate/ValidationError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package codesquad.validate;

public class ValidationError {
private String fieldName;
private String errorMessage;

public ValidationError(String fieldName, String errorMessage) {
this.fieldName = fieldName;
this.errorMessage = errorMessage;
}

public String getFieldName() {
return fieldName;
}

public String getErrorMessage() {
return errorMessage;
}

@Override
public String toString() {
return "ValidationError{" +
"fieldName='" + fieldName + '\'' +
", errorMessage='" + errorMessage + '\'' +
'}';
}
}
21 changes: 21 additions & 0 deletions src/main/java/codesquad/validate/ValidationErrorsResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package codesquad.validate;

import java.util.ArrayList;
import java.util.List;

public class ValidationErrorsResponse extends RestStatus{
private List<ValidationError> errors;

public ValidationErrorsResponse() {
super(false);
errors = new ArrayList<>();
}

public void addValicationError(ValidationError error) {
errors.add(error);
}

public List<ValidationError> getErrors() {
return errors;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package codesquad.validate;

import org.slf4j.Logger;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.annotation.Resource;

import java.util.List;
import java.util.Optional;

import static org.slf4j.LoggerFactory.getLogger;

@RestControllerAdvice
public class ValidationExceptionControllerAdvice {
private static final Logger log = getLogger(ValidationExceptionControllerAdvice.class);

@Resource(name = "messageSourceAccessor")
private MessageSourceAccessor msa;

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ValidationErrorsResponse handlerValidationException(MethodArgumentNotValidException exception) {
List<ObjectError> errors = exception.getBindingResult().getAllErrors();
ValidationErrorsResponse response = new ValidationErrorsResponse();
for (ObjectError error : errors) {
log.debug("object error : {}", error);
FieldError fieldError = (FieldError) error;
response.addValicationError(new ValidationError(fieldError.getField(), getErrorMessage(fieldError)));
}
return response;
}

private String getErrorMessage(FieldError fieldError) {
Optional<String> code = getFirstCode(fieldError);
if (!code.isPresent()) {
return null;
}

String errorMessage = msa.getMessage(code.get(), fieldError.getArguments(), fieldError.getDefaultMessage());
log.info("error message : {}", errorMessage);
return errorMessage;
}

private Optional<String> getFirstCode(FieldError fieldError) {
String[] codes = fieldError.getCodes();
if (codes == null || codes.length == 0) {
return Optional.empty();
}
return Optional.of(codes[0]);
}
}
25 changes: 25 additions & 0 deletions src/main/java/codesquad/web/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package codesquad.web;

import codesquad.service.IssueService;
import org.slf4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import javax.annotation.Resource;

import static org.slf4j.LoggerFactory.getLogger;

@Controller
public class HomeController {
private static final Logger log = getLogger(HomeController.class);

@Resource(name = "issueService")
private IssueService issueService;

@GetMapping("/")
public String list(Model model) {
model.addAttribute("issues", issueService.findAll());
return "index";
}
}
Loading