Skip to content
Merged

Step6 #150

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
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ dependencies {
compile('org.springframework.boot:spring-boot-devtools')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
compile('commons-io:commons-io:2.5')
compile('org.apache.commons:commons-lang3:3.4')
compile('com.google.guava:guava:27.0.1-jre')
compile('org.hibernate:hibernate-java8')
compile('pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.1')
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/codesquad/DataFormatException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package codesquad;

public class DataFormatException extends RuntimeException {
public DataFormatException() {
super();
}

public DataFormatException(String error) {
super(error);
}
}
18 changes: 17 additions & 1 deletion src/main/java/codesquad/domain/issue/answer/Answer.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import codesquad.domain.issue.ContentType;
import codesquad.domain.issue.Issue;
import codesquad.domain.user.User;
import com.fasterxml.jackson.annotation.JsonIgnore;
import support.domain.AbstractEntity;

import javax.persistence.*;
Expand All @@ -28,6 +27,10 @@ public class Answer extends AbstractEntity {
@Lob
private String contents;

@OneToOne
@JoinColumn(foreignKey = @ForeignKey(name = "fk_answer_to_attachment"))
private Attachment attachment;

private boolean deleted = false;

public Answer() {
Expand All @@ -46,6 +49,11 @@ public Answer(User writer, Issue issue, String contents) {
this.deleted = false;
}

public Answer(User writer, Issue issue, String contents, Attachment attachment) {
this(writer, issue, contents);
this.attachment = attachment;
}

public boolean isOwner(User loginUser) {
isLogin(loginUser);
return writer.equals(loginUser);
Expand Down Expand Up @@ -99,6 +107,14 @@ public void setDeleted(boolean deleted) {
this.deleted = deleted;
}

public Attachment getAttachment() {
return attachment;
}

public void setAttachment(Attachment attachment) {
this.attachment = attachment;
}

@Override
public String toString() {
return "Answer{" +
Expand Down
46 changes: 46 additions & 0 deletions src/main/java/codesquad/domain/issue/answer/Attachment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package codesquad.domain.issue.answer;


import support.domain.AbstractEntity;

import javax.persistence.Column;
import javax.persistence.Entity;

@Entity
public class Attachment extends AbstractEntity {
@Column
private String originalFileName;

@Column
private String savedFileName;

public Attachment() {
}

public Attachment(String originalFileName, String savedFileName) {
this.originalFileName = originalFileName;
this.savedFileName = savedFileName;
}

public Attachment(long id, String originalFileName, String savedFileName) {
super(id);
this.originalFileName = originalFileName;
this.savedFileName = savedFileName;
}

public String getOriginalFileName() {
return originalFileName;
}

public void setOriginalFileName(String originalFileName) {
this.originalFileName = originalFileName;
}

public String getSavedFileName() {
return savedFileName;
}

public void setSavedFileName(String savedFileName) {
this.savedFileName = savedFileName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package codesquad.domain.issue.answer;

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

public interface FileRepository extends JpaRepository<Attachment, Long> {
}
2 changes: 1 addition & 1 deletion src/main/java/codesquad/domain/label/Label.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class Label extends AbstractEntity {
private String label;

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

public Label() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/codesquad/domain/milestone/Milestone.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class Milestone extends AbstractEntity {
private String endDate;

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

private Boolean deleted = false;
Expand Down
90 changes: 90 additions & 0 deletions src/main/java/codesquad/domain/user/ProfileImage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package codesquad.domain.user;

import codesquad.DataFormatException;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class ProfileImage {
public static final ProfileImage DEFAULT_IMAGE = new DefaultImage();
private static final String EXTENSION_FORMAT = "(jpg|png|gif|jpeg)$";
private static boolean isDefault = false;

@Column
private String originalFileName;

@Column
private String savedFileName;

@Column
private String extension;


public ProfileImage() {
}

public ProfileImage(String originalFileName, String savedFileName, String extension) {
this.originalFileName = originalFileName;
this.savedFileName = savedFileName;
this.extension = extension;
}

public static ProfileImage of(MultipartFile file) {
if (file == null || file.isEmpty()) {
isDefault = true;
return new DefaultImage();
}
String originalFileName = file.getOriginalFilename();
return new ProfileImage(originalFileName, originalFileName, isValidExtension(originalFileName));
}

private static String isValidExtension(String originalFileName) {
String extension = FilenameUtils.getExtension(originalFileName);
if (!extension.matches(EXTENSION_FORMAT)) {
throw new DataFormatException();
}
return extension;
}

public boolean isDefaultImage() {
return isDefault;
}



private static class DefaultImage extends ProfileImage {
public static final String DEFAULT_FILE_NAME = "default";
public static final String DEFAULT_EXTENSION = "jpg";

public DefaultImage() {
super(DEFAULT_FILE_NAME, DEFAULT_FILE_NAME, DEFAULT_EXTENSION);
}
}

public String getOriginalFileName() {
return originalFileName;
}

public void setOriginalFileName(String originalFileName) {
this.originalFileName = originalFileName;
}

public String getSavedFileName() {
return savedFileName;
}

public void setSavedFileName(String savedFileName) {
this.savedFileName = savedFileName;
}

public String getExtension() {
return extension;
}

public void setExtension(String extension) {
this.extension = extension;
}
}
11 changes: 8 additions & 3 deletions src/main/java/codesquad/domain/user/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import support.domain.AbstractEntity;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.validation.constraints.Size;

Expand All @@ -27,18 +28,22 @@ public class User extends AbstractEntity {
@Column(nullable = false, length = 20)
private String name;

@Embedded
private ProfileImage profileImage;

public User() {
}

public User(String userId, String password, String name) {
this(0L, userId, password, name);
public User(String userId, String password, String name, ProfileImage profileImage) {
this(0L, userId, password, name, profileImage);
}

public User(long id, String userId, String password, String name) {
public User(long id, String userId, String password, String name, ProfileImage profileImage) {
super(id);
this.userId = userId;
this.password = password;
this.name = name;
this.profileImage = profileImage;
}

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

import codesquad.domain.user.ProfileImage;
import codesquad.domain.user.User;

import javax.validation.constraints.Size;
Expand Down Expand Up @@ -48,8 +49,8 @@ public void setName(String name) {
this.name = name;
}

public User _toUser() {
return new User(this.userId, this.password, this.name);
public User _toUser(ProfileImage profileImage) {
return new User(this.userId, this.password, this.name, profileImage);
}

@Override
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/codesquad/security/SecurityControllerAdvice.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package codesquad.security;

import codesquad.DataFormatException;
import codesquad.UnAuthenticationException;
import codesquad.UnAuthorizedException;
import org.slf4j.Logger;
Expand Down Expand Up @@ -32,6 +33,13 @@ public void unAuthorized() {
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
public String unAuthentication() {
log.debug("UnAuthenticationException is happened!");
return "user/login";
return "/user/login";
}

@ExceptionHandler(DataFormatException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public String dataFormatError() {
log.debug("DataFormatException is happened!");
return "/user/join";
}
}
11 changes: 11 additions & 0 deletions src/main/java/codesquad/service/AnswerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import codesquad.domain.issue.IssueRepository;
import codesquad.domain.issue.answer.Answer;
import codesquad.domain.issue.answer.AnswerRepository;
import codesquad.domain.issue.answer.Attachment;
import codesquad.domain.issue.answer.FileRepository;
import codesquad.domain.user.User;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -26,6 +28,9 @@ public class AnswerService {
@Autowired
private IssueRepository issueRepository;

@Autowired
private FileRepository fileRepository;

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

Expand Down Expand Up @@ -54,4 +59,10 @@ public Answer update(User loginUser, Answer answer, String comment) {
log.debug("업데이트 댓글 : " + answer.getContents());
return answer;
}

@Transactional
public Answer addAttachment(User loginUser, Issue issue, Attachment uploadFile) {
log.debug("answer addAttachment!");
return answerRepository.save(new Answer(loginUser, issue, uploadFile.getOriginalFileName(), uploadFile));
}
}
34 changes: 34 additions & 0 deletions src/main/java/codesquad/service/FileService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package codesquad.service;

import codesquad.domain.user.ProfileImage;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import static org.slf4j.LoggerFactory.getLogger;

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

@Value("${upload.path}")
private String defaultLocation;

public void upload(ProfileImage profileImage, MultipartFile file) throws IOException {
String savedFileName = uploadFile(profileImage.getOriginalFileName(), file.getBytes());
profileImage.setSavedFileName(savedFileName);
}

private String uploadFile(String originalFileName, byte[] in) throws IOException {
String savedFileName = UUID.randomUUID().toString() + "_" + originalFileName;
File out = new File(defaultLocation, savedFileName);
FileCopyUtils.copy(in, out);
return savedFileName;
}
}
Loading