From d8fa6011031a2b4382c4283eecddd4221619beb3 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Sat, 5 May 2018 00:24:48 +0400 Subject: [PATCH] add file uploading --- .../java/ru/ulstu/file/FileController.java | 48 ++++++++++ src/main/java/ru/ulstu/file/model/File.java | 51 +++++++++++ .../ulstu/file/repostory/FileRepository.java | 7 ++ .../ru/ulstu/file/service/FileService.java | 75 +++++++++++++++ .../paper/controller/PaperController.java | 13 ++- src/main/java/ru/ulstu/paper/model/Paper.java | 91 +++++++++++++++++-- .../java/ru/ulstu/paper/model/PaperDto.java | 71 +++++++++++++++ .../paper/repository/PaperRepository.java | 7 ++ .../ru/ulstu/paper/service/PaperService.java | 35 ++++++- .../db/changelog-20180505_000000-schema.xml | 37 ++++++++ src/main/resources/db/changelog-master.xml | 1 + 11 files changed, 422 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/ulstu/file/FileController.java create mode 100644 src/main/java/ru/ulstu/file/model/File.java create mode 100644 src/main/java/ru/ulstu/file/repostory/FileRepository.java create mode 100644 src/main/java/ru/ulstu/file/service/FileService.java create mode 100644 src/main/java/ru/ulstu/paper/model/PaperDto.java create mode 100644 src/main/java/ru/ulstu/paper/repository/PaperRepository.java create mode 100644 src/main/resources/db/changelog-20180505_000000-schema.xml diff --git a/src/main/java/ru/ulstu/file/FileController.java b/src/main/java/ru/ulstu/file/FileController.java new file mode 100644 index 0000000..45bcb4c --- /dev/null +++ b/src/main/java/ru/ulstu/file/FileController.java @@ -0,0 +1,48 @@ +package ru.ulstu.file; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import ru.ulstu.configuration.Constants; +import ru.ulstu.core.model.response.Response; +import ru.ulstu.file.model.File; +import ru.ulstu.file.service.FileService; + +import java.io.IOException; + +import static ru.ulstu.paper.controller.PaperController.URL; + +@RestController +@RequestMapping(URL) +public class FileController { + public static final String URL = Constants.API_1_0 + "files"; + + private final FileService fileService; + + public FileController(FileService fileService) { + this.fileService = fileService; + } + + @GetMapping("/download-tmp/{tmp-file-name}") + public ResponseEntity getFile(@PathVariable("tmp-file-name") String tmpFileName) throws IOException { + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=" + + fileService.getTmpFileName(tmpFileName)); + return new ResponseEntity<>(fileService.getTmpFile(tmpFileName), headers, HttpStatus.OK); + } + + @GetMapping("/download/{file-id}") + public ResponseEntity getFile(@PathVariable("file-id") Integer fileId) { + HttpHeaders headers = new HttpHeaders(); + File file = fileService.getFile(fileId); + headers.add("Content-Disposition", "attachment; filename=" + file.getName()); + return new ResponseEntity<>(file.getData(), headers, HttpStatus.OK); + } + + @PostMapping("/uploadTmpFile") + public Response upload(@RequestBody MultipartFile multipartFile) throws IOException { + return new Response(fileService.uploadToTmpDir(multipartFile)); + } +} diff --git a/src/main/java/ru/ulstu/file/model/File.java b/src/main/java/ru/ulstu/file/model/File.java new file mode 100644 index 0000000..91a59a2 --- /dev/null +++ b/src/main/java/ru/ulstu/file/model/File.java @@ -0,0 +1,51 @@ +package ru.ulstu.file.model; + +import ru.ulstu.core.model.BaseEntity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import java.util.Date; + +@Entity +public class File extends BaseEntity { + private String name; + + private long size; + + @Column(name = "create_date") + private Date createDate; + + private byte[] data; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + } +} diff --git a/src/main/java/ru/ulstu/file/repostory/FileRepository.java b/src/main/java/ru/ulstu/file/repostory/FileRepository.java new file mode 100644 index 0000000..985ef65 --- /dev/null +++ b/src/main/java/ru/ulstu/file/repostory/FileRepository.java @@ -0,0 +1,7 @@ +package ru.ulstu.file.repostory; + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.ulstu.file.model.File; + +public interface FileRepository extends JpaRepository { +} diff --git a/src/main/java/ru/ulstu/file/service/FileService.java b/src/main/java/ru/ulstu/file/service/FileService.java new file mode 100644 index 0000000..c4673cc --- /dev/null +++ b/src/main/java/ru/ulstu/file/service/FileService.java @@ -0,0 +1,75 @@ +package ru.ulstu.file.service; + +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import ru.ulstu.file.model.File; +import ru.ulstu.file.repostory.FileRepository; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static java.nio.charset.StandardCharsets.UTF_8; + +@Service +public class FileService { + private final static int META_FILE_NAME_INDEX = 0; + private final static int META_FILE_SIZE_INDEX = 1; + + private String tmpDir; + private FileRepository fileRepository; + + public FileService(FileRepository fileRepository) { + tmpDir = System.getProperty("java.io.tmpdir"); + this.fileRepository = fileRepository; + } + + public File createFileFromTmp(String tmpFileName) throws IOException { + File file = new File(); + file.setData(getTmpFile(tmpFileName)); + file.setName(getTmpFileName(tmpFileName)); + return fileRepository.save(file); + } + + public String uploadToTmpDir(MultipartFile multipartFile) throws IOException { + String tmpFileName = String.valueOf(System.currentTimeMillis()); + Files.write(getTmpFilePath(tmpFileName), multipartFile.getBytes()); + String meta = multipartFile.getOriginalFilename() + "\n" + multipartFile.getSize(); + Files.write(getTmpFileMetaPath(tmpFileName), meta.getBytes(UTF_8)); + return tmpFileName; + } + + private String[] getMeta(String tmpFileName) throws IOException { + return new String(Files.readAllBytes(getTmpFileMetaPath(tmpFileName)), UTF_8) + .split("\n"); + } + + public long getTmpFileSize(String tmpFileName) throws IOException { + return Long.valueOf(getMeta(tmpFileName)[META_FILE_SIZE_INDEX]).longValue(); + } + + public String getTmpFileName(String tmpFileName) throws IOException { + return getMeta(tmpFileName)[META_FILE_NAME_INDEX]; + } + + public byte[] getTmpFile(String tmpFileName) throws IOException { + return Files.readAllBytes(getTmpFilePath(tmpFileName)); + } + + public File getFile(Integer fileId) { + return fileRepository.findOne(fileId); + } + + public void deleteTmpFile(String tmpFileName) throws IOException { + Files.delete(getTmpFilePath(tmpFileName)); + } + + private Path getTmpFilePath(String tmpFileName) { + return Paths.get(tmpDir + tmpFileName); + } + + private Path getTmpFileMetaPath(String tmpFileName) { + return Paths.get(getTmpFilePath(tmpFileName) + ".meta"); + } +} diff --git a/src/main/java/ru/ulstu/paper/controller/PaperController.java b/src/main/java/ru/ulstu/paper/controller/PaperController.java index 4f5dbc0..8bce72e 100644 --- a/src/main/java/ru/ulstu/paper/controller/PaperController.java +++ b/src/main/java/ru/ulstu/paper/controller/PaperController.java @@ -1,16 +1,16 @@ package ru.ulstu.paper.controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import ru.ulstu.configuration.Constants; import ru.ulstu.core.model.response.Response; import ru.ulstu.paper.model.Paper; +import ru.ulstu.paper.model.PaperDto; import ru.ulstu.paper.service.PaperService; +import java.io.IOException; import java.util.List; -import static ru.ulstu.user.controller.UserController.URL; +import static ru.ulstu.paper.controller.PaperController.URL; @RestController @RequestMapping(URL) @@ -27,4 +27,9 @@ public class PaperController { public Response> getPapers() { return new Response<>(paperService.findAll()); } + + @PostMapping + public Response createPaper(@RequestBody PaperDto paperDto) throws IOException { + return new Response(paperService.create(paperDto)); + } } diff --git a/src/main/java/ru/ulstu/paper/model/Paper.java b/src/main/java/ru/ulstu/paper/model/Paper.java index ea485be..fd8b700 100644 --- a/src/main/java/ru/ulstu/paper/model/Paper.java +++ b/src/main/java/ru/ulstu/paper/model/Paper.java @@ -1,20 +1,93 @@ package ru.ulstu.paper.model; -public class Paper { - private int id; +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.file.model.File; + +import javax.persistence.*; +import java.util.Date; + +@Entity +public class Paper extends BaseEntity { + public enum PaperStatus { + DRAFT("Черновик"), ON_PREPARATION("На подготовке"), COMPLETED("Завершена"); + + private String name; + + PaperStatus(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + @NotBlank private String title; - public Paper(int id, String title) { - this.id = id; - this.title = title; + @Enumerated(value = EnumType.STRING) + private PaperStatus status; + + @Column(name = "create_date") + private Date createDate; + + @Column(name = "update_date") + private Date updateDate; + + private String comment; + + private Boolean locked; + + @ManyToOne + private File file; + + public PaperStatus getStatus() { + return status; + } + + public void setStatus(PaperStatus status) { + this.status = status; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Date getUpdateDate() { + return updateDate; + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Boolean getLocked() { + return locked; + } + + public void setLocked(Boolean locked) { + this.locked = locked; } - public int getId() { - return id; + public File getFile() { + return file; } - public void setId(int id) { - this.id = id; + public void setFile(File file) { + this.file = file; } public String getTitle() { diff --git a/src/main/java/ru/ulstu/paper/model/PaperDto.java b/src/main/java/ru/ulstu/paper/model/PaperDto.java new file mode 100644 index 0000000..7be973c --- /dev/null +++ b/src/main/java/ru/ulstu/paper/model/PaperDto.java @@ -0,0 +1,71 @@ +package ru.ulstu.paper.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Date; + +public class PaperDto { + private final String title; + private final Paper.PaperStatus status; + private final Date createDate; + private final Date updateDate; + private final String comment; + private final Boolean locked; + private final String tmpFileName; + + @JsonCreator + public PaperDto(@JsonProperty("title") String title, + @JsonProperty("status") Paper.PaperStatus status, + @JsonProperty("createDate") Date createDate, + @JsonProperty("updateDate") Date updateDate, + @JsonProperty("comment") String comment, + @JsonProperty("locked") Boolean locked, + @JsonProperty("tmpFileName") String tmpFileName) { + this.title = title; + this.status = status; + this.createDate = createDate; + this.updateDate = updateDate; + this.comment = comment; + this.locked = locked; + this.tmpFileName = tmpFileName; + } + + public PaperDto(Paper paper) { + this.title = paper.getTitle(); + this.status = paper.getStatus(); + this.createDate = paper.getCreateDate(); + this.updateDate = paper.getUpdateDate(); + this.comment = paper.getComment(); + this.locked = paper.getLocked(); + this.tmpFileName = null; + } + + public String getTitle() { + return title; + } + + public Paper.PaperStatus getStatus() { + return status; + } + + public Date getCreateDate() { + return createDate; + } + + public Date getUpdateDate() { + return updateDate; + } + + public String getComment() { + return comment; + } + + public Boolean getLocked() { + return locked; + } + + public String getTmpFileName() { + return tmpFileName; + } +} diff --git a/src/main/java/ru/ulstu/paper/repository/PaperRepository.java b/src/main/java/ru/ulstu/paper/repository/PaperRepository.java new file mode 100644 index 0000000..fb2f5c4 --- /dev/null +++ b/src/main/java/ru/ulstu/paper/repository/PaperRepository.java @@ -0,0 +1,7 @@ +package ru.ulstu.paper.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.ulstu.paper.model.Paper; + +public interface PaperRepository extends JpaRepository { +} diff --git a/src/main/java/ru/ulstu/paper/service/PaperService.java b/src/main/java/ru/ulstu/paper/service/PaperService.java index 86a1211..b810e15 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperService.java @@ -1,15 +1,48 @@ package ru.ulstu.paper.service; import org.springframework.stereotype.Service; +import ru.ulstu.file.model.File; +import ru.ulstu.file.service.FileService; import ru.ulstu.paper.model.Paper; +import ru.ulstu.paper.model.PaperDto; +import ru.ulstu.paper.repository.PaperRepository; +import javax.transaction.Transactional; +import java.io.IOException; import java.util.Arrays; import java.util.List; @Service public class PaperService { + private final PaperRepository paperRepository; + private final FileService fileService; + + public PaperService(PaperRepository paperRepository, + FileService fileService) { + this.paperRepository = paperRepository; + this.fileService = fileService; + } + public List findAll() { - return Arrays.asList(new Paper(1, "Название стартьи")); + return paperRepository.findAll(); + } + + @Transactional + public int create(PaperDto paperDto) throws IOException { + return paperRepository.save(copyFromDto(new Paper(), paperDto)).getId(); + } + + private Paper copyFromDto(Paper paper, PaperDto paperDto) throws IOException { + paper.setComment(paperDto.getComment()); + paper.setCreateDate(paperDto.getCreateDate()); + paper.setLocked(paperDto.getLocked()); + paper.setStatus(paperDto.getStatus()); + paper.setTitle(paperDto.getTitle()); + paper.setUpdateDate(paperDto.getUpdateDate()); + if (paperDto.getTmpFileName() != null) { + paper.setFile(fileService.createFileFromTmp(paperDto.getTmpFileName())); + } + return paper; } } diff --git a/src/main/resources/db/changelog-20180505_000000-schema.xml b/src/main/resources/db/changelog-20180505_000000-schema.xml new file mode 100644 index 0000000..b66721f --- /dev/null +++ b/src/main/resources/db/changelog-20180505_000000-schema.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog-master.xml b/src/main/resources/db/changelog-master.xml index 713679c..4faae2e 100644 --- a/src/main/resources/db/changelog-master.xml +++ b/src/main/resources/db/changelog-master.xml @@ -10,4 +10,5 @@ + \ No newline at end of file