package ru.ulstu.paper.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang3.StringUtils; import org.hibernate.validator.constraints.NotEmpty; import ru.ulstu.deadline.model.Deadline; import ru.ulstu.file.model.FileDataDto; import ru.ulstu.user.model.UserDto; import javax.validation.constraints.Size; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static ru.ulstu.core.util.StreamApiUtils.convert; public class PaperDto { private final static int MAX_AUTHORS_LENGTH = 60; private Integer id; @NotEmpty @Size(min = 3, max = 254) private String title; private Paper.PaperStatus status; private Date createDate; private Date updateDate; @NotEmpty private List deadlines = new ArrayList<>(); private String comment; private String url; private Boolean locked; private List files = new ArrayList<>(); private Set authorIds; private Set authors; private Integer filterAuthorId; private String latexText; public PaperDto() { deadlines.add(new Deadline()); } @JsonCreator public PaperDto(@JsonProperty("id") Integer id, @JsonProperty("title") String title, @JsonProperty("status") Paper.PaperStatus status, @JsonProperty("createDate") Date createDate, @JsonProperty("updateDate") Date updateDate, @JsonProperty("deadlines") List deadlines, @JsonProperty("comment") String comment, @JsonProperty("latex_text") String latexText, @JsonProperty("url") String url, @JsonProperty("locked") Boolean locked, @JsonProperty("files") List files, @JsonProperty("authorIds") Set authorIds, @JsonProperty("authors") Set authors) { this.id = id; this.title = title; this.status = status; this.createDate = createDate; this.updateDate = updateDate; this.deadlines = deadlines; this.comment = comment; this.url = url; this.latexText = latexText; this.locked = locked; this.files = files; this.authors = authors; } public PaperDto(Paper paper) { this.id = paper.getId(); this.title = paper.getTitle(); this.status = paper.getStatus(); this.createDate = paper.getCreateDate(); this.updateDate = paper.getUpdateDate(); this.deadlines = paper.getDeadlines(); this.comment = paper.getComment(); this.url = paper.getUrl(); this.latexText = paper.getLatexText(); this.locked = paper.getLocked(); this.files = convert(paper.getFiles(), FileDataDto::new); this.authorIds = convert(paper.getAuthors(), user -> user.getId()); this.authors = convert(paper.getAuthors(), UserDto::new); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Paper.PaperStatus getStatus() { return status; } public void setStatus(Paper.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 List getDeadlines() { return deadlines; } public void setDeadlines(List deadlines) { this.deadlines = deadlines; } 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 List getFiles() { return files; } public void setFiles(List files) { this.files = files; } public Set getAuthors() { return authors; } public void setAuthors(Set authors) { this.authors = authors; } public Set getAuthorIds() { return authorIds; } public void setAuthorIds(Set authorIds) { this.authorIds = authorIds; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getLatexText() { return latexText; } public void setLatexText(String latexText) { this.latexText = latexText; } public String getAuthorsString() { return StringUtils.abbreviate(authors .stream() .map(author -> author.getLastName()) .collect(Collectors.joining(", ")), MAX_AUTHORS_LENGTH); } public Integer getFilterAuthorId() { return filterAuthorId; } public void setFilterAuthorId(Integer filterAuthorId) { this.filterAuthorId = filterAuthorId; } }