Skip to content
Merged
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
25 changes: 25 additions & 0 deletions src/main/java/codesquad/CannotDeleteException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package codesquad;

public class CannotDeleteException extends RuntimeException {
private static final long serialVersionUID = 1L;

public CannotDeleteException() {
}

public CannotDeleteException(String message) {
super(message);
}

public CannotDeleteException(String message, Throwable cause) {
super(message, cause);
}

public CannotDeleteException(Throwable cause) {
super(cause);
}

public CannotDeleteException(String message, Throwable cause,
boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
7 changes: 6 additions & 1 deletion src/main/java/codesquad/ImsApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ public static void main(String[] args) {
}
}

// TODO : html 자원들 중복 제거하면서 스타일이 제대로 안나오는 부분이 있다, 추후 중복 제거 다시해서 레이아웃이 제대로 나오도록...!

/**
* Todo
* 1. html 자원들 중복 제거하면서 스타일이 제대로 안나오는 부분이 있다, 추후 중복 제거 다시해서 레이아웃이 제대로 나오도록
* 2. 회원가입/가입정보수정 시 유효하지 않은 값 입력하고 submit 시 어떤 경우에 alert, 어떤 경우에 오류페이지 나오는지 확인 후 개선
*/
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, COMMENT;
}
40 changes: 40 additions & 0 deletions src/main/java/codesquad/domain/DeleteHistory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package codesquad.domain;

import org.springframework.data.annotation.CreatedDate;

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_user"))
private User deletedBy;

@CreatedDate
private LocalDateTime createDate = LocalDateTime.now();

public DeleteHistory() {
}

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

@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> {
}
55 changes: 45 additions & 10 deletions src/main/java/codesquad/domain/Issue.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package codesquad.domain;

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

import javax.persistence.*;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Entity
public class Issue extends AbstractEntity {
Expand All @@ -20,13 +25,10 @@ public class Issue extends AbstractEntity {
@JoinColumn(foreignKey = @ForeignKey(name = "fk_issue_writer"))
private User writer;

public Issue() {
private boolean deleted = false;

}
public Issue() {

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

public Issue(String subject, String comment, User writer) {
Expand All @@ -35,11 +37,28 @@ public Issue(String subject, String comment, User writer) {
this.writer = writer;
}

public Issue(long id, String subject, String comment, User writer) {
super(id);
this.subject = subject;
this.comment = comment;
this.writer = writer;
public boolean isMatchWriter(User loginUser) {
return this.writer.equals(loginUser);
}

public void update(User loginUser, Issue target) {
if (!isMatchWriter(loginUser)) {
throw new UnAuthorizedException();
}

this.subject = target.subject;
this.comment = target.comment;
}

public List<DeleteHistory> delete(User loginUser) {
if (!isMatchWriter(loginUser)) {
throw new CannotDeleteException("작성자만 삭제 가능합니다.");
}
this.deleted = true;

List<DeleteHistory> temp = new ArrayList<>();
temp.add(new DeleteHistory(ContentType.ISSUE, getId(), writer));
return temp;
}

public String getSubject() {
Expand Down Expand Up @@ -70,6 +89,22 @@ public IssueDto _toIssueDto() {
return new IssueDto(this.subject, this.comment, this.writer);
}

@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;
Issue issue = (Issue) o;
return Objects.equals(subject, issue.subject) &&
Objects.equals(comment, issue.comment) &&
Objects.equals(writer, issue.writer);
}

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

@Override
public String toString() {
return "Issue{" +
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/codesquad/domain/IssueRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@

public interface IssueRepository extends JpaRepository<Issue, Long> {
Optional<Issue> findBySubject(String title);

Iterable<Issue> findByDeleted(boolean deleted);
}
18 changes: 17 additions & 1 deletion src/main/java/codesquad/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.validation.constraints.Size;
import java.util.Objects;

@Entity
public class User extends AbstractEntity {
Expand All @@ -17,7 +18,7 @@ public class User extends AbstractEntity {
@Column(unique = true, nullable = false, length = 20)
private String userId;

@Size(min = 6, max = 20)
@Size(min = 3, max = 20)
@Column(nullable = false, length = 20)
@JsonIgnore
private String password;
Expand Down Expand Up @@ -96,6 +97,21 @@ public boolean isGuestUser() {
return false;
}

@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;
User user = (User) o;
return Objects.equals(userId, user.userId) &&
Objects.equals(name, user.name);
}

@Override
public int hashCode() {
return Objects.hash(super.hashCode(), userId, name);
}

private static class GuestUser extends User {
@Override
public boolean isGuestUser() {
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/codesquad/service/DeleteHistoryService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
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);
}
}
}
35 changes: 27 additions & 8 deletions src/main/java/codesquad/service/IssueService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package codesquad.service;

import codesquad.CannotDeleteException;
import codesquad.domain.Issue;
import codesquad.domain.IssueRepository;
import codesquad.domain.User;
Expand All @@ -18,6 +19,22 @@ public class IssueService {
@Resource(name = "issueRepository")
private IssueRepository issueRepository;

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

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

public List<Issue> findAll(Pageable pageable) {
return issueRepository.findAll(pageable).getContent();
}

public Issue findById(long id) {
//여기서 작성자일치여부 검증필요?
return issueRepository.findById(id).orElseThrow(EntityNotFoundException::new);
}

public Issue add(IssueDto issueDto) {
return issueRepository.save(issueDto._toIssue());
}
Expand All @@ -29,15 +46,17 @@ public Issue create(User loginUser, IssueDto issueDto) {
return issueDto._toIssue();
}

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

public List<Issue> findAll(Pageable pageable) {
return issueRepository.findAll(pageable).getContent();
@Transactional
public Issue update(User loginUser, long id, IssueDto updatedIssueDto) {
Issue original = findById(id);
original.update(loginUser, updatedIssueDto._toIssue());
return issueRepository.save(original);
}

public Issue findById(long id) {
return issueRepository.findById(id).orElseThrow(EntityNotFoundException::new);
@Transactional
public Issue delete(User loginUser, long id) throws CannotDeleteException {
Issue original = findById(id);
deleteHistoryService.saveAll(original.delete(loginUser));
return issueRepository.save(original);
}
}
2 changes: 1 addition & 1 deletion src/main/java/codesquad/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class UserService {

public User add(UserDto userDto) {
return userRepository.save(userDto._toUser());
}
}

public User update(User loginUser, long id, UserDto updatedUser) {
User original = findById(loginUser, id);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/codesquad/web/HomeController.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class HomeController {

@GetMapping("/")
public String home(Model model, Pageable pageable) {
List<Issue> issues = issueService.findAll(pageable);
Iterable<Issue> issues = issueService.findAll();
model.addAttribute("issues", issues);
return "index";
}
Expand Down
38 changes: 32 additions & 6 deletions src/main/java/codesquad/web/IssueController.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package codesquad.web;

import codesquad.CannotDeleteException;
import codesquad.UnAuthorizedException;
import codesquad.domain.Issue;
import codesquad.domain.User;
import codesquad.dto.IssueDto;
Expand All @@ -9,16 +11,12 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.RequestMapping;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;


@Controller
@RequestMapping("/newIssue")
@RequestMapping("/issues")
public class IssueController {
private static final Logger log = LoggerFactory.getLogger(IssueController.class);

Expand Down Expand Up @@ -47,4 +45,32 @@ public String read(@PathVariable long id, Model model) {
model.addAttribute("issue", issue);
return "/issue/show";
}

@GetMapping("/{id}/form")
public String updateForm(@LoginUser User loginUser, @PathVariable long id, Model model) {
Issue issue = issueService.findById(id);

if(!issue.isMatchWriter(loginUser)) {
throw new UnAuthorizedException();
}

model.addAttribute("issue", issue);
return "/issue/form_update";
}

@PutMapping("/{id}")
public String update(@LoginUser User loginUser, @PathVariable long id, IssueDto target) {
log.debug("***** update issue id : {}", id);

issueService.update(loginUser, id, target);
return "redirect:/issues/{id}";
}

@DeleteMapping("/{id}")
public String delete(@LoginUser User loginUser, @PathVariable long id) {
log.debug("***** delete issue id : {}", id);

issueService.delete(loginUser, id);
return "redirect:/";
}
}
Loading