Skip to content
Merged

Step5 #144

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
123 changes: 123 additions & 0 deletions src/main/java/codesquad/domain/Answer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package codesquad.domain;

import codesquad.UnAuthorizedException;
import org.slf4j.Logger;
import support.domain.AbstractEntity;

import javax.persistence.Entity;
import javax.persistence.ForeignKey;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import java.util.Objects;

import static org.slf4j.LoggerFactory.getLogger;

@Entity
public class Answer extends AbstractEntity {
private static final Logger logger = getLogger(Answer.class);

@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(name = "fk_answer_writer"))
private User writer;

@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(name = "fk_answer_issue"))
private Issue issue;

private String answer;

private boolean deleted = false;

public Answer() {

}

public Answer(String answer) {
this.answer = answer;
}

public User getWriter() {
return writer;
}

public void setWriter(User writer) {
this.writer = writer;
}

public Issue getIssue() {
return issue;
}

public void setIssue(Issue issue) {
this.issue = issue;
}

public void toIssue(Issue issue) {
this.issue = issue;
}

public String getAnswer() {
return answer;
}

public void setAnswer(String answer) {
this.answer = answer;
}

public boolean isDeleted() {
return deleted;
}

public void setDeleted(boolean deleted) {
this.deleted = deleted;
}

public void writerBy(User loginUser) {
this.writer = loginUser;
}

public void update(User loginUser, String target) {
if (!writer.equals(loginUser)) {
throw new UnAuthorizedException();
}
this.answer = target;
}

public void delete(User loginUser) {
if (!writer.equals(loginUser)) {
throw new UnAuthorizedException();
}
this.deleted = true;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
Answer answer1 = (Answer) o;
return Objects.equals(writer, answer1.writer) &&
Objects.equals(issue, answer1.issue) &&
Objects.equals(answer, answer1.answer);
}

@Override
public int hashCode() {
return Objects.hash(super.hashCode(), writer, issue, answer);
}


@Override
public String toString() {
return "Answer{" +
"writer=" + writer +
", issue=" + issue +
", answer='" + answer + '\'' +
'}';
}



}


9 changes: 9 additions & 0 deletions src/main/java/codesquad/domain/AnswerRepository.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.List;

public interface AnswerRepository extends JpaRepository<Answer, Long> {
List<Answer> findByIssueAndDeleted(Issue issue, boolean deleted);
}
67 changes: 67 additions & 0 deletions src/main/java/codesquad/service/AnswerService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package codesquad.service;

import codesquad.UnAuthorizedException;
import codesquad.domain.*;
import org.slf4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import javax.naming.AuthenticationException;
import java.util.List;

import static org.slf4j.LoggerFactory.getLogger;

@Service
public class AnswerService {
private static final Logger logger = getLogger(AnswerService.class);

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

@Resource(name = "answerRepository")
private AnswerRepository answerRepository;

public Answer add(User loginUser, long issueId, String inputAnswer) {
Issue issue = issueRepository.findById(issueId)
.orElseThrow(UnAuthorizedException::new);

Answer answer = new Answer(inputAnswer);
answer.toIssue(issue);
answer.writerBy(loginUser);

return answerRepository.save(answer);
}

public List<Answer> findAll() {
return answerRepository.findAll();
}

public Answer findById(long id) {
logger.debug("## findById : {}", answerRepository.findById(id).orElse(null));
return answerRepository.findById(id)
.orElseThrow(UnAuthorizedException::new);
}

@Transactional
public Answer update(User loginUser, long id, String updateAnswer) {
Answer answer = answerRepository.findById(id)
.orElseThrow(UnAuthorizedException::new);

answer.update(loginUser, updateAnswer);
return answer;
}

@Transactional
public void delete(User loginUser, long id) {
Answer answer = answerRepository.findById(id)
.orElseThrow(UnAuthorizedException::new);

answer.delete(loginUser);
}

public List<Answer> findByIssue(Issue issue) {
return answerRepository.findByIssueAndDeleted(issue, false);
}
}
10 changes: 5 additions & 5 deletions src/main/java/codesquad/service/IssueService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

@Service
public class IssueService {
private static final Logger log = getLogger(IssueService.class);
private static final Logger logger = getLogger(IssueService.class);

@Resource(name = "issueRepository")
private IssueRepository issueRepository;
Expand All @@ -26,10 +26,10 @@ public class IssueService {
@Resource(name = "labelRepository")
private LabelRepository labelRepository;

public void add(User loginUser, IssueBody issueBody) {
public Issue add(User loginUser, IssueBody issueBody) {
Issue issue = new Issue(issueBody);
issue.writeBy(loginUser);
issueRepository.save(issue);
return issueRepository.save(issue);
}

public Iterable<Issue> findAll() {
Expand Down Expand Up @@ -67,14 +67,14 @@ public Issue delete(User loginUser, long id) {

@Transactional
public void addMilestone(long issuesId, long milestonesId) {
log.debug("### addmilestone");
logger.debug("### addmilestone");
Issue issue = issueRepository.findById(issuesId)
.orElseThrow(UnAuthorizedException::new);

Milestone milestone = milestoneRepository.findById(milestonesId)
.orElseThrow(UnAuthorizedException::new);
issue.addMilestone(milestone);
log.debug("issue : {}", issue.getMilestone());
logger.debug("issue : {}", issue.getMilestone());
}

@Transactional
Expand Down
65 changes: 65 additions & 0 deletions src/main/java/codesquad/web/ApiAnswerController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package codesquad.web;

import codesquad.domain.Answer;
import codesquad.domain.User;
import codesquad.security.LoginUser;
import codesquad.service.AnswerService;
import codesquad.service.IssueService;
import org.slf4j.Logger;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import support.domain.Result;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.net.URI;

import static org.slf4j.LoggerFactory.getLogger;

@RestController
@RequestMapping("/api/issues/{issueId}/answers")
public class ApiAnswerController {
private static final Logger logger = getLogger(ApiAnswerController.class);

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

@Resource(name = "answerService")
private AnswerService answerService;

@PostMapping("")
public ResponseEntity<Answer> create(@LoginUser User loginUser, @PathVariable long issueId, @RequestBody String answer) {

logger.debug("create ## : {}", answer );
Answer newAnswer = answerService.add(loginUser, issueId, answer);
logger.debug("create ## : {}", newAnswer.getFormattedCreateDate());

HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(String.format("/api/issues/%d/answers/", issueId) + newAnswer.getId()));
return new ResponseEntity<Answer>(newAnswer, headers, HttpStatus.CREATED);
}

@GetMapping("/{id}")
public Answer show(@PathVariable long id) {
return answerService.findById(id);
}

@PutMapping("/{id}")
public Answer update(@LoginUser User loginUser, @PathVariable long id, @Valid @RequestBody String answer) {
logger.debug("## update : {}", answer);
return answerService.update(loginUser, id, answer);
}

@GetMapping("/{id}/updateForm")
public Answer updateForm(@PathVariable long id) {
return answerService.findById(id);
}

@DeleteMapping("/{id}")
public void delete(@LoginUser User loginUser, @PathVariable long id) {
logger.debug("## delete : {}", loginUser);
answerService.delete(loginUser, id);
}
}
27 changes: 23 additions & 4 deletions src/main/java/codesquad/web/ApiIssueController.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package codesquad.web;

import codesquad.domain.Issue;
import codesquad.domain.IssueBody;
import codesquad.domain.Milestone;
import codesquad.domain.User;
import codesquad.security.LoginUser;
import codesquad.service.AnswerService;
import codesquad.service.IssueService;
import codesquad.service.MilestoneService;
import com.sun.tools.javac.main.Main;
import org.slf4j.Logger;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import support.domain.Result;

import javax.annotation.Resource;
Expand All @@ -32,6 +32,9 @@ public class ApiIssueController {
@Resource(name = "milestoneService")
private MilestoneService milestoneService;

@Resource(name = "answerService")
private AnswerService answerService;

@GetMapping("/{issuesId}/milestones/{milestonesId}")
public Result addMilestone( @PathVariable long issuesId,
@PathVariable long milestonesId) {
Expand All @@ -55,4 +58,20 @@ public Result addLables(@PathVariable long issuesId, @PathVariable long lableId)
issueService.addLables(issuesId, lableId);
return Result.ok();
}

@PostMapping("")
public ResponseEntity<Issue> create(@LoginUser User loginUser, @RequestBody IssueBody issueBody) {
Issue issue = issueService.add(loginUser, issueBody);

HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create("/api/issues/" + issue.getId()));
return new ResponseEntity<Issue>(headers, HttpStatus.CREATED);
}

@GetMapping("/{id}")
public Issue show(@PathVariable long id) {
return issueService.findById(id);
}


}
16 changes: 16 additions & 0 deletions src/main/java/codesquad/web/ApiUserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
@RestController
@RequestMapping("/api/users")
public class ApiUserController {

private static final Logger log = getLogger(ApiUserController.class);
@Resource(name = "userService")
private UserService userService;
Expand All @@ -46,6 +47,21 @@ public void update(@LoginUser User loginUser, @PathVariable long id, @Valid @Req
userService.update(loginUser, id, updatedUser);
}

// @PostMapping("/login")
// public ResponseEntity<Void> login(HttpSession session, @Valid @RequestBody UserDto userDto) throws UnAuthenticationException {
// log.debug("=#= login {}", userDto);
// User user = userService.login(userDto.getUserId(), userDto.getPassword());
// session.setAttribute(HttpSessionUtils.USER_SESSION_KEY, user);
//
// HttpHeaders headers = new HttpHeaders();
// headers.setLocation(URI.create("/"));
//
// //return new ResponseEntity.ok();
// //todo
//
// return new ResponseEntity<Void>(headers, HttpStatus.OK);
// }

@PostMapping("/login")
public ResponseEntity<Void> login(HttpSession session, @Valid @RequestBody UserDto userDto) throws UnAuthenticationException {
log.debug("=#= login {}", userDto);
Expand Down
Loading