Skip to content
Merged

Step3 #120

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

public enum ContentType {
ISSUE;
}
9 changes: 9 additions & 0 deletions src/main/java/codesquad/domain/Contents.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ public class Contents {
@Column(nullable = false)
private String comment;

public Contents() {
}

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

public String getSubject() {
return subject;
}
Expand All @@ -30,4 +38,5 @@ public String getComment() {
public void setComment(String comment) {
this.comment = comment;
}

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

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
public class DeleteHistory {
@Id
@GeneratedValue
private long id;

@Enumerated(EnumType.STRING)
private ContentType contentType;

private Long contentId;

@ManyToOne
@JoinColumn(foreignKey = @ForeignKey(name = "fk_deletehistory_to_issue"))
private User deletedBy;

private LocalDateTime createDate = LocalDateTime.now();

public DeleteHistory() {}

public DeleteHistory(ContentType contentType, Long contentId, User deletedBy, LocalDateTime createDate) {
this.contentType = contentType;
this.contentId = contentId;
this.deletedBy = deletedBy;
this.createDate = createDate;
}

@Override
public String toString() {
return "DeleteHistory{" +
"id=" + id +
", contentType=" + contentType +
", contentId=" + contentId +
", deletedBy=" + deletedBy +
", createDate=" + createDate +
'}';
}
}
6 changes: 6 additions & 0 deletions src/main/java/codesquad/domain/DeleteHistoryRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package codesquad.domain;

import org.springframework.data.repository.CrudRepository;

public interface DeleteHistoryRepository extends CrudRepository<DeleteHistory, Long> {
}
63 changes: 60 additions & 3 deletions src/main/java/codesquad/domain/Issue.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package codesquad.domain;

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

import javax.persistence.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import static org.slf4j.LoggerFactory.getLogger;

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

@Embedded
private Contents contents = new Contents();
Expand All @@ -14,15 +23,51 @@ public class Issue extends AbstractEntity {
@JoinColumn(foreignKey = @ForeignKey(name = "fk_issue_writer"))
private User writer;

private Boolean deleted = false;

public Issue() {
}

public Issue(String subject, String comment, User writer) {
contents.setComment(comment);
contents.setSubject(subject);
public Issue(Contents contents) {
this.contents = contents;
}

public Issue(long id, Contents contents, User writer) {
super(id);
this.contents = contents;
this.writer = writer;
}

public boolean isOwner(User loginUser) {
return writer.equals(loginUser);
}

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

public Issue update(User loginUser, Contents updateIssueContents) {
if (!isOwner(loginUser)) {
throw new UnAuthorizedException();
}

this.contents = updateIssueContents;
return this;
}

public List<DeleteHistory> delete(User loginUser) {
if (!isOwner(loginUser)) {
throw new UnAuthorizedException("로그인 유저가 이슈 작성자와 달라 삭제할 수 없습니다");
}

List<DeleteHistory> histories = new ArrayList<>();

this.deleted = true;

histories.add(new DeleteHistory(ContentType.ISSUE, getId(), writer, LocalDateTime.now()));
return histories;
}

public Contents getContents() {
return contents;
}
Expand All @@ -38,4 +83,16 @@ public User getWriter() {
public void setWriter(User writer) {
this.writer = writer;
}

public Boolean getDeleted() {
return deleted;
}

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

public boolean isSameComment(Issue issue) {
return this.contents == issue.getContents();
}
}
3 changes: 2 additions & 1 deletion src/main/java/codesquad/domain/IssueRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.springframework.data.jpa.repository.JpaRepository;


public interface IssueRepository extends JpaRepository<Issue, Long> {

public interface IssueRepository extends JpaRepository<Issue, Long> {
Iterable<Issue> findByDeleted(boolean deleted);
}
5 changes: 4 additions & 1 deletion src/main/java/codesquad/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,11 @@ public void update(User loginUser, User target) {
throw new UnAuthorizedException();
}

if (!matchPassword(target.password)) {
return;
}

this.name = target.name;
this.password = target.password;
}

public boolean matchPassword(String password) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/codesquad/dto/IssueDto.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package codesquad.dto;

import codesquad.domain.Contents;
import codesquad.domain.Issue;
import codesquad.domain.User;

Expand Down Expand Up @@ -29,7 +30,7 @@ public IssueDto(String subject, String comment, User writer) {
}

public Issue _toIssue() {
return new Issue(this.subject, this.comment, this.writer);
return new Issue(0L, new Contents(subject, comment), this.writer);
}

public String getSubject() {
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/codesquad/service/DeleteHistoryService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package codesquad.service;

import codesquad.domain.DeleteHistory;
import codesquad.domain.DeleteHistoryRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

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

@Service("deleteHistoryService")
public class DeleteHistoryService {

@Resource(name = "deleteHistoryRepository")
private DeleteHistoryRepository deleteHistoryRepository;

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveAll(List<DeleteHistory> deleteHistories) {
for (DeleteHistory deleteHistory : deleteHistories) {
deleteHistoryRepository.save(deleteHistory);
}
}

@Transactional
public void save(DeleteHistory deleteHistory) {
deleteHistoryRepository.save(deleteHistory);
}
}
38 changes: 36 additions & 2 deletions src/main/java/codesquad/service/IssueService.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,59 @@
package codesquad.service;

import codesquad.UnAuthorizedException;
import codesquad.domain.Contents;
import codesquad.domain.Issue;
import codesquad.domain.IssueRepository;
import codesquad.domain.User;
import codesquad.dto.IssueDto;
import org.slf4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.persistence.EntityNotFoundException;

import static org.slf4j.LoggerFactory.getLogger;

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

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

@Resource(name = "deleteHistoryService")
private DeleteHistoryService deleteHistoryService;

public Issue findById(long id) {
return issueRepository.findById(id).orElseThrow(EntityNotFoundException::new);
return issueRepository.findById(id).filter(issue -> !issue.getDeleted()).orElseThrow(EntityNotFoundException::new);
}

public Issue add(IssueDto issueDto) {
public Issue add(IssueDto issueDto, User loginUser) {
issueDto.setWriter(loginUser);
return issueRepository.save(issueDto._toIssue());
}

public Issue oneself(User loginUser, long id) {
return issueRepository.findById(id)
.filter(issue -> issue.isOwner(loginUser))
.orElseThrow(UnAuthorizedException::new);
}

@Transactional
public Issue update(User loginUser, long id, Contents updateIssueContents) {
Issue issue = findById(id);
return issue.update(loginUser, updateIssueContents);
}

@Transactional
public void delete(User loginUser, long id) {
log.debug("삭제");
Issue issue = oneself(loginUser, id);
deleteHistoryService.saveAll(issue.delete(loginUser));
}

public Iterable<Issue> findAll() {
return issueRepository.findByDeleted(false);
}
}
23 changes: 23 additions & 0 deletions src/main/java/codesquad/web/ApiIssueController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package codesquad.web;

import codesquad.domain.Issue;
import codesquad.domain.User;
import codesquad.security.LoginUser;
import codesquad.service.IssueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

//@RestController
//@RequestMapping("/api/issue")
//public class ApiIssueController {
//
// @Autowired
// private IssueService issueService;
//
// @GetMapping("/{id}")
// public String updateForm(@LoginUser User loginUser, @PathVariable long id) {
// Issue updateIssue = issueService.findById(id);
//
// return "";
// }
//}
19 changes: 17 additions & 2 deletions src/main/java/codesquad/web/ApiUserController.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package codesquad.web;

import codesquad.UnAuthenticationException;
import codesquad.domain.User;
import codesquad.dto.UserDto;
import codesquad.security.HttpSessionUtils;
import codesquad.security.LoginUser;
import codesquad.service.UserService;
import org.springframework.http.HttpHeaders;
Expand All @@ -10,9 +12,12 @@
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.net.URI;

import static codesquad.security.HttpSessionUtils.USER_SESSION_KEY;

@RestController
@RequestMapping("/api/users")
public class ApiUserController {
Expand All @@ -28,13 +33,23 @@ public ResponseEntity<Void> create(@Valid @RequestBody UserDto user) {
return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
}

@GetMapping("{id}")
@PostMapping("/login")
public ResponseEntity<User> login(String userId, String password, HttpSession httpSession) throws UnAuthenticationException {
User loginUser = userService.login(userId, password);
httpSession.setAttribute(USER_SESSION_KEY, loginUser);

HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create("/"));
return new ResponseEntity<User>(loginUser, headers, HttpStatus.ACCEPTED);
}

@GetMapping("/{id}")
public UserDto show(@LoginUser User loginUser, @PathVariable long id) {
User user = userService.findById(loginUser, id);
return user._toUserDto();
}

@PutMapping("{id}")
@PutMapping("/{id}")
public void update(@LoginUser User loginUser, @PathVariable long id, @Valid @RequestBody UserDto updatedUser) {
userService.update(loginUser, id, updatedUser);
}
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/codesquad/web/HomeController.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package codesquad.web;

import codesquad.domain.IssueRepository;
import codesquad.service.IssueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
// @Autowired
// IssueService issueService;

@Autowired
IssueRepository issueRepository;

@GetMapping("")
public String home(Model model) {
model.addAttribute("issue", issueRepository.findAll());
model.addAttribute("issue", issueRepository.findByDeleted(false));
return "index";
}
}
Loading