From 65d788512beb022a765933e13b140b1587839f72 Mon Sep 17 00:00:00 2001 From: Elena Date: Fri, 9 Nov 2018 13:42:28 +0400 Subject: [PATCH 01/10] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20?= =?UTF-8?q?=E2=84=9610?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/public/js/papers.js | 8 ++++++-- src/main/resources/templates/papers/paper.html | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/resources/public/js/papers.js b/src/main/resources/public/js/papers.js index bab27a7..9035221 100644 --- a/src/main/resources/public/js/papers.js +++ b/src/main/resources/public/js/papers.js @@ -17,12 +17,16 @@ function showPapers(papersElement) { }); } -function addPaper(title, status, comment, locked) { +function addPaper(title, status, comment, locked, deadline, file, dateCreate, dateUpdate) { var paperData = JSON.stringify({ "title": title, "status": status, "comment": comment, - "locked": locked + "deadline":deadline, + "locked": locked, + "file":file, + "dateCreate":dateUpdate, + "dateUpdate":dateUpdate }); postToRest(urlPapers, paperData, function (data) { alert(data); diff --git a/src/main/resources/templates/papers/paper.html b/src/main/resources/templates/papers/paper.html index 8cc9161..eee175d 100644 --- a/src/main/resources/templates/papers/paper.html +++ b/src/main/resources/templates/papers/paper.html @@ -149,7 +149,7 @@
+
+

Фильтровать по:

+ + + +
- + 1 From 51e84e22a60a5f6516ea5b4e9322969267358d08 Mon Sep 17 00:00:00 2001 From: Elena Date: Fri, 23 Nov 2018 13:53:20 +0400 Subject: [PATCH 04/10] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=2010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.jar | Bin 54706 -> 54333 bytes gradle/wrapper/gradle-wrapper.properties | 1 - gradlew | 23 ++++++++------ src/main/resources/public/js/papers.js | 19 +++++------- .../resources/templates/papers/paper.html | 29 ++++++++++++------ 5 files changed, 40 insertions(+), 32 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 59c3905659d674fb3021e1465ad97d87f2b7221a..c44b679acd3f794ddbb3aa5e919244914911014a 100644 GIT binary patch delta 16261 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 R58?uImXM)F`~TJO{{T0{EVlpv delta 16615 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 J9Qq&W{{w|CIo|*P diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 98bcec3..568c50b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,3 @@ -#Tue Feb 06 11:48:53 SAMT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 9aa616c..cccdd3d 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -154,16 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then cd "$(dirname "$0")" fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/src/main/resources/public/js/papers.js b/src/main/resources/public/js/papers.js index e45ea55..07fa21c 100644 --- a/src/main/resources/public/js/papers.js +++ b/src/main/resources/public/js/papers.js @@ -49,21 +49,16 @@ function deletePaper(id, papersElement, paperRowClass) { }); } -function addPaper(title, status,dateCreate, dateUpdate,deadline, comment, locked, tmpFileName, authors) { - var paperData = JSON.stringify({ +function addPaper(title, status, datePublish, dateUpdate, deadline, comment, locked, tmpFileName, authors) { + var paperData = JSON.stringify({ "title": title, "status": status, - "date-publish":date-publish, - "date-update":date-update, - "deadline":deadline, - "comment": comment, - "locked": locked, - "tmpFileName":tmpFileName, - "authors":authors - }); - postToRest(urlPapers, paperData, function (data) { + "deadlineDate":deadline, + "comment": comment + }); + postToRest(urlPapers, paperData, function (data) { alert(data); - }); + }); } function getPaperStatusClass(status) { diff --git a/src/main/resources/templates/papers/paper.html b/src/main/resources/templates/papers/paper.html index 507a90f..fe81537 100644 --- a/src/main/resources/templates/papers/paper.html +++ b/src/main/resources/templates/papers/paper.html @@ -49,7 +49,7 @@

- +
@@ -57,18 +57,18 @@
- -
+ +
- +
- +

Редактировать авторов статьи

@@ -149,8 +149,7 @@
From 8fc6d3b569bf7b857c99ab6ed44b8652fbe44d7d Mon Sep 17 00:00:00 2001 From: Elena Date: Fri, 23 Nov 2018 14:05:23 +0400 Subject: [PATCH 05/10] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=2010?= =?UTF-8?q?(new)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/ulstu/paper/controller/PaperController.java | 5 +++++ src/main/java/ru/ulstu/paper/service/PaperService.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/ru/ulstu/paper/controller/PaperController.java b/src/main/java/ru/ulstu/paper/controller/PaperController.java index c5cbf4f..b004b18 100644 --- a/src/main/java/ru/ulstu/paper/controller/PaperController.java +++ b/src/main/java/ru/ulstu/paper/controller/PaperController.java @@ -37,6 +37,11 @@ public class PaperController { return new Response<>(paperService.findAllDto()); } + @GetMapping("/{paper-id}") + public Response getPaper(@PathVariable("paper-id") Integer paperId){ + return new Response(paperService.findPaper(paperId)); + } + @PostMapping public Response createPaper(@RequestBody @Valid PaperDto paperDto) throws IOException { return new Response<>(paperService.create(paperDto)); diff --git a/src/main/java/ru/ulstu/paper/service/PaperService.java b/src/main/java/ru/ulstu/paper/service/PaperService.java index 0e1abbc..83b975b 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperService.java @@ -130,6 +130,10 @@ public class PaperService { return convert(paperRepository.filter(userService.findById(filterDto.getAuthorId()), filterDto.getYear()), PaperDto::new); } + public PaperDto findPaper(int id){ + return new PaperDto(paperRepository.getOne(id)); + } + public void closeFailedPapers() { List papers = paperRepository.findAll() .stream() From 5eff1bac819190e6f2caf8ce67c179f785bbabdb Mon Sep 17 00:00:00 2001 From: Alyona Date: Fri, 23 Nov 2018 14:10:36 +0400 Subject: [PATCH 06/10] =?UTF-8?q?Merge=20branch=20'master'=20of=20C:\Users?= =?UTF-8?q?\=D0=BA=D0=B0=D1=82=D1=8F\IdeaProjects\ng-tracker=20with=20conf?= =?UTF-8?q?licts.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/public/js/papers.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/resources/public/js/papers.js b/src/main/resources/public/js/papers.js index 3b78d8a..a06198e 100644 --- a/src/main/resources/public/js/papers.js +++ b/src/main/resources/public/js/papers.js @@ -62,6 +62,16 @@ function addPaper(title, status, comment, locked) { }); } +function filterPaper(authorId, year) { + var paperData = JSON.stringify({ + "authors": title, + "": status + }); + postToRest(urlPapers, paperData, function (data) { + alert(data); + }); +} + function getPaperStatusClass(status) { switch (status) { case 'DRAFT': From f5068f8be94caa6d791ffd0b93f0970d30ae9bb7 Mon Sep 17 00:00:00 2001 From: Alyona Date: Fri, 23 Nov 2018 14:17:16 +0400 Subject: [PATCH 07/10] filter --- src/main/resources/public/js/papers.js | 86 ++++++++++--------- .../resources/templates/papers/papers.html | 58 +++++++------ 2 files changed, 79 insertions(+), 65 deletions(-) diff --git a/src/main/resources/public/js/papers.js b/src/main/resources/public/js/papers.js index 88eaed1..e2be107 100644 --- a/src/main/resources/public/js/papers.js +++ b/src/main/resources/public/js/papers.js @@ -1,21 +1,23 @@ var urlPapers = "/api/1.0/papers"; var urlPaperStatuses = "/api/1.0/papers/statuses"; var urlDeletePaper = "/api/1.0/papers/"; +var urlFilterPaper = "/api/1.0/papers/filter" function showPapers(papersElement, paperRowClass) { getFromRest(urlPapers, function (paperList) { paperList.forEach(function (paper, index) { $(papersElement).parent().append("
" + - "
" + + "
" + " \n" + " " + " " + " " + " " + (index + 1) + ". " + paper.title + "" + - "" + + "'>" + paper.title + "
" + + "
" + + "" + "" + - "
"); + "
"); }); $(paperRowClass).mouseenter(function (event) { @@ -32,6 +34,47 @@ function showPapers(papersElement, paperRowClass) { }); } +function filterPapers(papersElement, paperRowClass, authorId, year) { + var paperData = JSON.stringify({ + "authorId": authorId, + "year": year + }); + postToRest(urlFilterPaper, paperData, function (data) { + $(paperRowClass).remove(); + if(data.length > 0){ + data.forEach(function (paper, index) { + $(papersElement).parent().append("
" + + "
" + + " \n" + + " " + + " " + + " " + + " " + paper.title + "
" + + "
" + + "" + + "" + + "
"); + }); + + + $(paperRowClass).mouseenter(function (event) { + var paperRow = $(event.target).closest(paperRowClass); + $(paperRow).css("background-color", "#f8f9fa"); + $(paperRow).find(".remove-paper").removeClass("d-none"); + + }); + $(paperRowClass).mouseleave(function (event) { + var paperRow = $(event.target).closest(paperRowClass); + $(paperRow).css("background-color", "white"); + $(paperRow).closest(paperRowClass).find(".remove-paper").addClass("d-none"); + }); + } + }); + + +} + function deletePaper(id, papersElement, paperRowClass) { $("#remove-paper-modal").modal('show'); @@ -61,52 +104,17 @@ function addPaper(title, status, comment, locked) { }); } -function filterPaper(authorId, year) { - var paperData = JSON.stringify({ - "authors": title, - "": status - }); - postToRest(urlPapers, paperData, function (data) { - alert(data); - }); -} - function getPaperStatusClass(status) { switch (status) { case 'DRAFT': return "text-draft" case 'ON_PREPARATION': return "text-primary"; - case 'ON_REVIEW': - return "text-primary"; case 'COMPLETED': return "text-success"; case 'ATTENTION': return "text-warning"; - case 'FAILED': - return "text-failed"; default: return ""; } -} - -function showPaperDashboard(dashboardElement) { - getFromRest(urlPapers, function (paperList) { - paperList.forEach(function (paper, index) { - $(dashboardElement).append("
" + - "
" + - "
" + - "" + - "" + - "" + - "" + - "
" + - "
" + - "" + paper.title + "" + - "

" + paper.authorsString + "

" + - "
" + - "
" + - "
"); - }); - }); } \ No newline at end of file diff --git a/src/main/resources/templates/papers/papers.html b/src/main/resources/templates/papers/papers.html index b381204..c41988a 100644 --- a/src/main/resources/templates/papers/papers.html +++ b/src/main/resources/templates/papers/papers.html @@ -14,39 +14,36 @@

Статьи

-
Панель управления + aria-hidden="true"> Панель управления
- -
-

Фильтровать по:

- - - -
+ +
+
+
Фильтровать по:
+ + +
-
1 + @@ -65,12 +62,21 @@ - + + + + + + From 13f9081aee467645bef58644fdee1aa38dffc73f Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Fri, 23 Nov 2018 20:37:24 +0400 Subject: [PATCH 08/10] fix failed commit --- src/main/resources/public/js/papers.js | 34 ++++++++++++++++--- .../resources/templates/papers/papers.html | 22 ++++++------ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/main/resources/public/js/papers.js b/src/main/resources/public/js/papers.js index e2be107..8322440 100644 --- a/src/main/resources/public/js/papers.js +++ b/src/main/resources/public/js/papers.js @@ -7,17 +7,16 @@ function showPapers(papersElement, paperRowClass) { getFromRest(urlPapers, function (paperList) { paperList.forEach(function (paper, index) { $(papersElement).parent().append("
" + - "
" + + "
" + " \n" + " " + " " + " " + " " + paper.title + "
" + - "
" + - "" + + "'>" + (index + 1) + ". " + paper.title + "" + + "" + "" + - "
"); + "
"); }); $(paperRowClass).mouseenter(function (event) { @@ -110,11 +109,36 @@ function getPaperStatusClass(status) { return "text-draft" case 'ON_PREPARATION': return "text-primary"; + case 'ON_REVIEW': + return "text-primary"; case 'COMPLETED': return "text-success"; case 'ATTENTION': return "text-warning"; + case 'FAILED': + return "text-failed"; default: return ""; } +} + +function showPaperDashboard(dashboardElement) { + getFromRest(urlPapers, function (paperList) { + paperList.forEach(function (paper, index) { + $(dashboardElement).append("
" + + "
" + + "
" + + "" + + "" + + "" + + "" + + "
" + + "
" + + "" + paper.title + "" + + "

" + paper.authorsString + "

" + + "
" + + "
" + + "
"); + }); + }); } \ No newline at end of file diff --git a/src/main/resources/templates/papers/papers.html b/src/main/resources/templates/papers/papers.html index c41988a..cb492db 100644 --- a/src/main/resources/templates/papers/papers.html +++ b/src/main/resources/templates/papers/papers.html @@ -14,10 +14,15 @@

Статьи

+
Панель управления + aria-hidden="true"> Панель управления
+
Добавить статью @@ -62,21 +67,16 @@
- - - - - + - From 590cd16abefe3da02eff923e506fbbbcfb64c2e0 Mon Sep 17 00:00:00 2001 From: T-Midnight Date: Sat, 8 Dec 2018 23:53:38 +0400 Subject: [PATCH 09/10] Create model for grant, deadline and project --- .../java/ru/ulstu/grant/model/Deadline.java | 21 ++++ .../ru/ulstu/grant/model/DeadlineDto.java | 33 +++++++ src/main/java/ru/ulstu/grant/model/Grant.java | 98 +++++++++++++++++++ .../java/ru/ulstu/grant/model/GrantDto.java | 80 +++++++++++++++ .../ru/ulstu/grant/model/GrantStatusDto.java | 19 ++++ .../java/ru/ulstu/grant/model/Project.java | 22 +++++ .../java/ru/ulstu/grant/model/ProjectDto.java | 34 +++++++ .../db/changelog-20181208_000000-schema.xml | 45 +++++++++ 8 files changed, 352 insertions(+) create mode 100644 src/main/java/ru/ulstu/grant/model/Deadline.java create mode 100644 src/main/java/ru/ulstu/grant/model/DeadlineDto.java create mode 100644 src/main/java/ru/ulstu/grant/model/Grant.java create mode 100644 src/main/java/ru/ulstu/grant/model/GrantDto.java create mode 100644 src/main/java/ru/ulstu/grant/model/GrantStatusDto.java create mode 100644 src/main/java/ru/ulstu/grant/model/Project.java create mode 100644 src/main/java/ru/ulstu/grant/model/ProjectDto.java create mode 100644 src/main/resources/db/changelog-20181208_000000-schema.xml diff --git a/src/main/java/ru/ulstu/grant/model/Deadline.java b/src/main/java/ru/ulstu/grant/model/Deadline.java new file mode 100644 index 0000000..07ee7c5 --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/Deadline.java @@ -0,0 +1,21 @@ +package ru.ulstu.grant.model; + +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.file.model.FileData; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Entity +public class Deadline extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "grant_id") + private Integer grantId; + + public Integer getGrantId() { return grantId;} + public void setGrantId(Integer grantId) { this.grantId = grantId; } + +} diff --git a/src/main/java/ru/ulstu/grant/model/DeadlineDto.java b/src/main/java/ru/ulstu/grant/model/DeadlineDto.java new file mode 100644 index 0000000..f2ad56c --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/DeadlineDto.java @@ -0,0 +1,33 @@ +package ru.ulstu.grant.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.hibernate.validator.constraints.NotEmpty; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +public class DeadlineDto { + private final Integer id; + + @NotNull + private final Integer grantId; + + @JsonCreator + public DeadlineDto(@JsonProperty("id") Integer id, + @JsonProperty("grantId") Integer grantId){ + this.id = id; + this.grantId = grantId; + } + + public DeadlineDto(Deadline deadline) { + this.id = deadline.getId(); + this.grantId = deadline.getGrantId(); + } + + public Integer getId() { + return id; + } + + public Integer getGrantId() { return grantId; } +} diff --git a/src/main/java/ru/ulstu/grant/model/Grant.java b/src/main/java/ru/ulstu/grant/model/Grant.java new file mode 100644 index 0000000..4d4361e --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/Grant.java @@ -0,0 +1,98 @@ +package ru.ulstu.grant.model; + +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.core.model.UserContainer; +import ru.ulstu.file.model.FileData; +import ru.ulstu.user.model.User; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Grant extends BaseEntity { + public enum GrantStatus { + APPLICATION("Заявка"), + ON_COMPETITION("Отправлен на конкурс"), + SUCCESSFUL_PASSAGE("Успешное прохождение"), + IN_WORK("В работе"), + COMPLETED("Завершен"), + FAILED("Провалены сроки"); + + private String name; + + GrantStatus(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + @NotBlank + private String title; + + @Enumerated(value = EnumType.STRING) + private GrantStatus status = GrantStatus.APPLICATION; + + @Column(name = "deadline_date") + @NotNull + private Date deadlineDate; + + //Описание гранта + @NotNull + private String comment; + + //Заявка на грант + @NotNull + private FileData application; + + @OneToOne + @JoinColumn(name = "project_id") + private Integer projectId; + + public GrantStatus getStatus() { + return status; + } + + public void setStatus(GrantStatus status) { + this.status = status; + } + + public Date getDeadlineDate() { + return deadlineDate; + } + + public void setDeadlineDate(Date deadlineDate) { + this.deadlineDate = deadlineDate; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public FileData getApplication() { + return application; + } + + public void setApplication(FileData application) { this.application = application; } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { this.title = title; } + + public Integer getProjectId() { return projectId;} + + public void setProjectId(Integer project_id) { this.projectId = projectId; } + +} diff --git a/src/main/java/ru/ulstu/grant/model/GrantDto.java b/src/main/java/ru/ulstu/grant/model/GrantDto.java new file mode 100644 index 0000000..25a7875 --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/GrantDto.java @@ -0,0 +1,80 @@ +package ru.ulstu.grant.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.hibernate.validator.constraints.NotEmpty; +import ru.ulstu.file.model.FileData; +import ru.ulstu.user.model.UserDto; + +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Set; +import java.util.stream.Collectors; + +import static ru.ulstu.core.util.StreamApiUtils.convert; + +public class GrantDto { + private final Integer id; + @NotEmpty + private final String title; + private final Grant.GrantStatus status; + @NotNull + private final Date deadlineDate; + private final String comment; + private final String applicationFileName; + private final Integer projectId; + + @JsonCreator + public GrantDto(@JsonProperty("id") Integer id, + @JsonProperty("title") String title, + @JsonProperty("status") Grant.GrantStatus status, + @JsonProperty("deadlineDate") Date deadlineDate, + @JsonProperty("comment") String comment, + @JsonProperty("projectId") Integer projectId){ + this.id = id; + this.title = title; + this.status = status; + this.deadlineDate = deadlineDate; + this.comment = comment; + this.applicationFileName = null; + this.projectId = projectId; + } + + public GrantDto(Grant grant) { + this.id = grant.getId(); + this.title = grant.getTitle(); + this.status = grant.getStatus(); + this.deadlineDate = grant.getDeadlineDate(); + this.comment = grant.getComment(); + this.projectId = grant.getProjectId(); + this.applicationFileName = grant.getApplication() == null ? null : grant.getApplication().getName(); + } + + public Integer getId() { + return id; + } + + public String getTitle() { + return title; + } + + public Grant.GrantStatus getStatus() { + return status; + } + + public Date getDeadlineDate() { + return deadlineDate; + } + + public String getComment() { + return comment; + } + + public Integer getProjectId() { + return projectId; + } + + public String getApplicationFileName() { + return applicationFileName; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/GrantStatusDto.java b/src/main/java/ru/ulstu/grant/model/GrantStatusDto.java new file mode 100644 index 0000000..dae40e2 --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/GrantStatusDto.java @@ -0,0 +1,19 @@ +package ru.ulstu.grant.model; + +public class GrantStatusDto { + private final String id; + private final String name; + + public GrantStatusDto(Grant.GrantStatus status) { + this.id = status.name(); + this.name = status.getName(); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/Project.java b/src/main/java/ru/ulstu/grant/model/Project.java new file mode 100644 index 0000000..6c31839 --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/Project.java @@ -0,0 +1,22 @@ +package ru.ulstu.grant.model; + +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.file.model.FileData; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Entity +public class Project extends BaseEntity { + + @NotBlank + private String title; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { this.title = title; } +} diff --git a/src/main/java/ru/ulstu/grant/model/ProjectDto.java b/src/main/java/ru/ulstu/grant/model/ProjectDto.java new file mode 100644 index 0000000..2a22d8a --- /dev/null +++ b/src/main/java/ru/ulstu/grant/model/ProjectDto.java @@ -0,0 +1,34 @@ +package ru.ulstu.grant.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.hibernate.validator.constraints.NotEmpty; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +public class ProjectDto { + private final Integer id; + @NotEmpty + private final String title; + + @JsonCreator + public ProjectDto(@JsonProperty("id") Integer id, + @JsonProperty("title") String title){ + this.id = id; + this.title = title; + } + + public ProjectDto(Project project) { + this.id = project.getId(); + this.title = project.getTitle(); + } + + public Integer getId() { + return id; + } + + public String getTitle() { + return title; + } +} diff --git a/src/main/resources/db/changelog-20181208_000000-schema.xml b/src/main/resources/db/changelog-20181208_000000-schema.xml new file mode 100644 index 0000000..e88b73e --- /dev/null +++ b/src/main/resources/db/changelog-20181208_000000-schema.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d71a8d2c8379860120c69fd91885f9e5e1a9dfff Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Tue, 11 Dec 2018 15:08:35 +0400 Subject: [PATCH 10/10] move classes, add deadline to entities, fix db changelogs --- .../ru/ulstu/deadline/model/Deadline.java | 41 +++++++++++++++++ .../ru/ulstu/deadline/model/DeadlineDto.java | 41 +++++++++++++++++ .../repository/DeadlineRepository.java | 9 ++++ .../deadline/service/DeadlineService.java | 45 +++++++++++++++++++ .../java/ru/ulstu/grant/model/Deadline.java | 21 --------- .../ru/ulstu/grant/model/DeadlineDto.java | 33 -------------- src/main/java/ru/ulstu/grant/model/Grant.java | 34 ++++++++------ .../java/ru/ulstu/grant/model/GrantDto.java | 34 +++++++------- .../java/ru/ulstu/grant/model/Project.java | 22 --------- src/main/java/ru/ulstu/paper/model/Paper.java | 28 +++++++++--- .../java/ru/ulstu/paper/model/PaperDto.java | 15 ++++--- .../service/PaperNotificationService.java | 10 ++--- .../ru/ulstu/paper/service/PaperService.java | 16 ++++--- .../java/ru/ulstu/project/model/Project.java | 39 ++++++++++++++++ .../{grant => project}/model/ProjectDto.java | 16 +++++-- .../db/changelog-20181208_000000-schema.xml | 44 +++++++++++++----- src/main/resources/db/changelog-master.xml | 1 + .../paperCreateNotification.html | 2 +- .../paperDeadlineNotification.html | 2 +- 19 files changed, 302 insertions(+), 151 deletions(-) create mode 100644 src/main/java/ru/ulstu/deadline/model/Deadline.java create mode 100644 src/main/java/ru/ulstu/deadline/model/DeadlineDto.java create mode 100644 src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java create mode 100644 src/main/java/ru/ulstu/deadline/service/DeadlineService.java delete mode 100644 src/main/java/ru/ulstu/grant/model/Deadline.java delete mode 100644 src/main/java/ru/ulstu/grant/model/DeadlineDto.java delete mode 100644 src/main/java/ru/ulstu/grant/model/Project.java create mode 100644 src/main/java/ru/ulstu/project/model/Project.java rename src/main/java/ru/ulstu/{grant => project}/model/ProjectDto.java (58%) diff --git a/src/main/java/ru/ulstu/deadline/model/Deadline.java b/src/main/java/ru/ulstu/deadline/model/Deadline.java new file mode 100644 index 0000000..1a73e59 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/model/Deadline.java @@ -0,0 +1,41 @@ +package ru.ulstu.deadline.model; + +import ru.ulstu.core.model.BaseEntity; + +import javax.persistence.Entity; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.util.Date; + +@Entity +public class Deadline extends BaseEntity { + + private String description; + + @Temporal(value = TemporalType.TIMESTAMP) + private Date date; + + public Deadline() { + } + + public Deadline(Date deadlineDate, String description) { + this.date = deadlineDate; + this.description = description; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } +} diff --git a/src/main/java/ru/ulstu/deadline/model/DeadlineDto.java b/src/main/java/ru/ulstu/deadline/model/DeadlineDto.java new file mode 100644 index 0000000..fbfb598 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/model/DeadlineDto.java @@ -0,0 +1,41 @@ +package ru.ulstu.deadline.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Date; + +public class DeadlineDto { + private final Integer id; + + private final String description; + + private final Date date; + + @JsonCreator + public DeadlineDto(@JsonProperty("id") Integer id, + @JsonProperty("description") String description, + @JsonProperty("date") Date date) { + this.id = id; + this.description = description; + this.date = date; + } + + public DeadlineDto(Deadline deadline) { + this.id = deadline.getId(); + this.description = deadline.getDescription(); + this.date = deadline.getDate(); + } + + public Integer getId() { + return id; + } + + public String getDescription() { + return description; + } + + public Date getDate() { + return date; + } +} diff --git a/src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java b/src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java new file mode 100644 index 0000000..f26c572 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/repository/DeadlineRepository.java @@ -0,0 +1,9 @@ +package ru.ulstu.deadline.repository; + + +import org.springframework.data.jpa.repository.JpaRepository; +import ru.ulstu.deadline.model.Deadline; + +public interface DeadlineRepository extends JpaRepository { + +} diff --git a/src/main/java/ru/ulstu/deadline/service/DeadlineService.java b/src/main/java/ru/ulstu/deadline/service/DeadlineService.java new file mode 100644 index 0000000..c371d87 --- /dev/null +++ b/src/main/java/ru/ulstu/deadline/service/DeadlineService.java @@ -0,0 +1,45 @@ +package ru.ulstu.deadline.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.ulstu.deadline.model.Deadline; +import ru.ulstu.deadline.model.DeadlineDto; +import ru.ulstu.deadline.repository.DeadlineRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class DeadlineService { + private final DeadlineRepository deadlineRepository; + + public DeadlineService(DeadlineRepository deadlineRepository) { + this.deadlineRepository = deadlineRepository; + } + + public List saveOrCreate(List deadlines) { + return deadlines.stream().map(deadlineDto -> { + return deadlineDto.getId() != null ? update(deadlineDto) : create(deadlineDto); + }).collect(Collectors.toList()); + } + + @Transactional + public Deadline update(DeadlineDto deadlineDto) { + Deadline deadline = deadlineRepository.findOne(deadlineDto.getId()); + deadlineRepository.save(copyFromDto(deadline, deadlineDto)); + return deadline; + } + + @Transactional + public Deadline create(DeadlineDto deadlineDto) { + Deadline newDeadline = copyFromDto(new Deadline(), deadlineDto); + newDeadline = deadlineRepository.save(newDeadline); + return newDeadline; + } + + private Deadline copyFromDto(Deadline deadline, DeadlineDto deadlineDto) { + deadline.setDate(deadlineDto.getDate()); + deadline.setDescription(deadlineDto.getDescription()); + return deadline; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/Deadline.java b/src/main/java/ru/ulstu/grant/model/Deadline.java deleted file mode 100644 index 07ee7c5..0000000 --- a/src/main/java/ru/ulstu/grant/model/Deadline.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.ulstu.grant.model; - -import org.hibernate.validator.constraints.NotBlank; -import ru.ulstu.core.model.BaseEntity; -import ru.ulstu.file.model.FileData; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.util.Date; - -@Entity -public class Deadline extends BaseEntity { - - @ManyToOne - @JoinColumn(name = "grant_id") - private Integer grantId; - - public Integer getGrantId() { return grantId;} - public void setGrantId(Integer grantId) { this.grantId = grantId; } - -} diff --git a/src/main/java/ru/ulstu/grant/model/DeadlineDto.java b/src/main/java/ru/ulstu/grant/model/DeadlineDto.java deleted file mode 100644 index f2ad56c..0000000 --- a/src/main/java/ru/ulstu/grant/model/DeadlineDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.ulstu.grant.model; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.hibernate.validator.constraints.NotEmpty; - -import javax.validation.constraints.NotNull; -import java.util.Date; - -public class DeadlineDto { - private final Integer id; - - @NotNull - private final Integer grantId; - - @JsonCreator - public DeadlineDto(@JsonProperty("id") Integer id, - @JsonProperty("grantId") Integer grantId){ - this.id = id; - this.grantId = grantId; - } - - public DeadlineDto(Deadline deadline) { - this.id = deadline.getId(); - this.grantId = deadline.getGrantId(); - } - - public Integer getId() { - return id; - } - - public Integer getGrantId() { return grantId; } -} diff --git a/src/main/java/ru/ulstu/grant/model/Grant.java b/src/main/java/ru/ulstu/grant/model/Grant.java index 4d4361e..092317b 100644 --- a/src/main/java/ru/ulstu/grant/model/Grant.java +++ b/src/main/java/ru/ulstu/grant/model/Grant.java @@ -3,13 +3,17 @@ package ru.ulstu.grant.model; import org.hibernate.validator.constraints.NotBlank; import ru.ulstu.core.model.BaseEntity; import ru.ulstu.core.model.UserContainer; +import ru.ulstu.deadline.model.Deadline; import ru.ulstu.file.model.FileData; +import ru.ulstu.project.model.Project; import ru.ulstu.user.model.User; import javax.persistence.*; import javax.validation.constraints.NotNull; +import java.util.ArrayList; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Set; @Entity @@ -39,21 +43,22 @@ public class Grant extends BaseEntity { @Enumerated(value = EnumType.STRING) private GrantStatus status = GrantStatus.APPLICATION; - @Column(name = "deadline_date") - @NotNull - private Date deadlineDate; + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "grant_id") + private List deadlines = new ArrayList<>(); //Описание гранта @NotNull private String comment; //Заявка на грант - @NotNull + @ManyToOne + @JoinColumn(name = "file_id") private FileData application; - @OneToOne + @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "project_id") - private Integer projectId; + private Project project; public GrantStatus getStatus() { return status; @@ -63,12 +68,12 @@ public class Grant extends BaseEntity { this.status = status; } - public Date getDeadlineDate() { - return deadlineDate; + public List getDeadlines() { + return deadlines; } - public void setDeadlineDate(Date deadlineDate) { - this.deadlineDate = deadlineDate; + public void setDeadlines(List deadlines) { + this.deadlines = deadlines; } public String getComment() { @@ -91,8 +96,11 @@ public class Grant extends BaseEntity { public void setTitle(String title) { this.title = title; } - public Integer getProjectId() { return projectId;} - - public void setProjectId(Integer project_id) { this.projectId = projectId; } + public Project getProject() { + return project; + } + public void setProject(Project project) { + this.project = project; + } } diff --git a/src/main/java/ru/ulstu/grant/model/GrantDto.java b/src/main/java/ru/ulstu/grant/model/GrantDto.java index 25a7875..922df89 100644 --- a/src/main/java/ru/ulstu/grant/model/GrantDto.java +++ b/src/main/java/ru/ulstu/grant/model/GrantDto.java @@ -3,13 +3,10 @@ package ru.ulstu.grant.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.hibernate.validator.constraints.NotEmpty; -import ru.ulstu.file.model.FileData; -import ru.ulstu.user.model.UserDto; +import ru.ulstu.deadline.model.DeadlineDto; +import ru.ulstu.project.model.ProjectDto; -import javax.validation.constraints.NotNull; -import java.util.Date; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.List; import static ru.ulstu.core.util.StreamApiUtils.convert; @@ -18,35 +15,34 @@ public class GrantDto { @NotEmpty private final String title; private final Grant.GrantStatus status; - @NotNull - private final Date deadlineDate; + private final List deadlines; private final String comment; private final String applicationFileName; - private final Integer projectId; + private final ProjectDto project; @JsonCreator public GrantDto(@JsonProperty("id") Integer id, @JsonProperty("title") String title, @JsonProperty("status") Grant.GrantStatus status, - @JsonProperty("deadlineDate") Date deadlineDate, + @JsonProperty("deadlines") List deadlines, @JsonProperty("comment") String comment, - @JsonProperty("projectId") Integer projectId){ + @JsonProperty("project") ProjectDto project) { this.id = id; this.title = title; this.status = status; - this.deadlineDate = deadlineDate; + this.deadlines = deadlines; this.comment = comment; this.applicationFileName = null; - this.projectId = projectId; + this.project = project; } public GrantDto(Grant grant) { this.id = grant.getId(); this.title = grant.getTitle(); this.status = grant.getStatus(); - this.deadlineDate = grant.getDeadlineDate(); + this.deadlines = convert(grant.getDeadlines(), DeadlineDto::new); this.comment = grant.getComment(); - this.projectId = grant.getProjectId(); + this.project = grant.getProject() == null ? null : new ProjectDto(grant.getProject()); this.applicationFileName = grant.getApplication() == null ? null : grant.getApplication().getName(); } @@ -62,16 +58,16 @@ public class GrantDto { return status; } - public Date getDeadlineDate() { - return deadlineDate; + public List getDeadlines() { + return deadlines; } public String getComment() { return comment; } - public Integer getProjectId() { - return projectId; + public ProjectDto getProject() { + return project; } public String getApplicationFileName() { diff --git a/src/main/java/ru/ulstu/grant/model/Project.java b/src/main/java/ru/ulstu/grant/model/Project.java deleted file mode 100644 index 6c31839..0000000 --- a/src/main/java/ru/ulstu/grant/model/Project.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.ulstu.grant.model; - -import org.hibernate.validator.constraints.NotBlank; -import ru.ulstu.core.model.BaseEntity; -import ru.ulstu.file.model.FileData; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.util.Date; - -@Entity -public class Project extends BaseEntity { - - @NotBlank - private String title; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { this.title = title; } -} diff --git a/src/main/java/ru/ulstu/paper/model/Paper.java b/src/main/java/ru/ulstu/paper/model/Paper.java index b7511d6..06b4c7e 100644 --- a/src/main/java/ru/ulstu/paper/model/Paper.java +++ b/src/main/java/ru/ulstu/paper/model/Paper.java @@ -3,9 +3,11 @@ package ru.ulstu.paper.model; import org.hibernate.validator.constraints.NotBlank; import ru.ulstu.core.model.BaseEntity; import ru.ulstu.core.model.UserContainer; +import ru.ulstu.deadline.model.Deadline; import ru.ulstu.file.model.FileData; import ru.ulstu.user.model.User; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -14,10 +16,14 @@ import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; @Entity @@ -52,9 +58,9 @@ public class Paper extends BaseEntity implements UserContainer { @Column(name = "update_date") private Date updateDate = new Date(); - @Column(name = "deadline_date") - @NotNull - private Date deadlineDate; + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "paper_id") + private List deadlines = new ArrayList<>(); private String comment; @@ -91,12 +97,12 @@ public class Paper extends BaseEntity implements UserContainer { this.updateDate = updateDate; } - public Date getDeadlineDate() { - return deadlineDate; + public List getDeadlines() { + return deadlines; } - public void setDeadlineDate(Date deadlineDate) { - this.deadlineDate = deadlineDate; + public void setDeadlines(List deadlines) { + this.deadlines = deadlines; } public String getComment() { @@ -143,4 +149,12 @@ public class Paper extends BaseEntity implements UserContainer { public Set getUsers() { return getAuthors(); } + + public Optional getNextDeadline() { + return deadlines + .stream() + .sorted(Comparator.comparing(Deadline::getDate)) + .filter(d -> d.getDate().after(new Date())) + .findFirst(); + } } diff --git a/src/main/java/ru/ulstu/paper/model/PaperDto.java b/src/main/java/ru/ulstu/paper/model/PaperDto.java index d9a1229..208fe4d 100644 --- a/src/main/java/ru/ulstu/paper/model/PaperDto.java +++ b/src/main/java/ru/ulstu/paper/model/PaperDto.java @@ -3,10 +3,12 @@ package ru.ulstu.paper.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.hibernate.validator.constraints.NotEmpty; +import ru.ulstu.deadline.model.DeadlineDto; import ru.ulstu.user.model.UserDto; import javax.validation.constraints.NotNull; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -19,8 +21,7 @@ public class PaperDto { private final Paper.PaperStatus status; private final Date createDate; private final Date updateDate; - @NotNull - private final Date deadlineDate; + private final List deadlines; private final String comment; private final Boolean locked; private final String tmpFileName; @@ -35,7 +36,7 @@ public class PaperDto { @JsonProperty("status") Paper.PaperStatus status, @JsonProperty("createDate") Date createDate, @JsonProperty("updateDate") Date updateDate, - @JsonProperty("deadlineDate") Date deadlineDate, + @JsonProperty("deadlines") List deadlines, @JsonProperty("comment") String comment, @JsonProperty("locked") Boolean locked, @JsonProperty("tmpFileName") String tmpFileName, @@ -45,7 +46,7 @@ public class PaperDto { this.status = status; this.createDate = createDate; this.updateDate = updateDate; - this.deadlineDate = deadlineDate; + this.deadlines = deadlines; this.comment = comment; this.locked = locked; this.tmpFileName = tmpFileName; @@ -61,7 +62,7 @@ public class PaperDto { this.status = paper.getStatus(); this.createDate = paper.getCreateDate(); this.updateDate = paper.getUpdateDate(); - this.deadlineDate = paper.getDeadlineDate(); + this.deadlines = convert(paper.getDeadlines(), DeadlineDto::new); this.comment = paper.getComment(); this.locked = paper.getLocked(); this.tmpFileName = null; @@ -91,8 +92,8 @@ public class PaperDto { return updateDate; } - public Date getDeadlineDate() { - return deadlineDate; + public List getDeadlines() { + return deadlines; } public String getComment() { diff --git a/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java b/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java index 99e0c86..697958b 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java @@ -29,16 +29,16 @@ public class PaperNotificationService { } private boolean needToSendDeadlineNotification(Paper paper, Date compareDate, boolean isDeadlineBeforeWeek) { - return (paper.getDeadlineDate() != null) - && (compareDate.after(paper.getDeadlineDate()) && isDeadlineBeforeWeek - || compareDate.before(paper.getDeadlineDate()) && !isDeadlineBeforeWeek) - && paper.getDeadlineDate().after(new Date()); + return (paper.getNextDeadline().isPresent()) + && (compareDate.after(paper.getNextDeadline().get().getDate()) && isDeadlineBeforeWeek + || compareDate.before(paper.getNextDeadline().get().getDate()) && !isDeadlineBeforeWeek) + && paper.getNextDeadline().get().getDate().after(new Date()); } private void sendMessageDeadline(Paper paper) { paper.getAuthors().forEach(user -> { mailService.sendEmail(user.getEmail(), "Приближается срок сдачи статьи", - "Срок сдачи статьи " + paper.getTitle() + " " + paper.getDeadlineDate().toString()); + "Срок сдачи статьи " + paper.getTitle() + " " + paper.getNextDeadline().get().getDate().toString()); }); } diff --git a/src/main/java/ru/ulstu/paper/service/PaperService.java b/src/main/java/ru/ulstu/paper/service/PaperService.java index 0e1abbc..6455115 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperService.java @@ -2,6 +2,8 @@ package ru.ulstu.paper.service; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import ru.ulstu.deadline.model.Deadline; +import ru.ulstu.deadline.service.DeadlineService; import ru.ulstu.file.service.FileService; import ru.ulstu.paper.model.Paper; import ru.ulstu.paper.model.PaperDto; @@ -27,17 +29,19 @@ public class PaperService { private final PaperNotificationService paperNotificationService; private final PaperRepository paperRepository; private final UserService userService; + private final DeadlineService deadlineService; private final FileService fileService; - public PaperService(PaperRepository paperRepository, FileService fileService, PaperNotificationService paperNotificationService, - UserService userService) { + UserService userService, + DeadlineService deadlineService) { this.paperRepository = paperRepository; this.fileService = fileService; this.paperNotificationService = paperNotificationService; this.userService = userService; + this.deadlineService = deadlineService; } public List findAll() { @@ -71,7 +75,7 @@ public class PaperService { paper.setStatus(paperDto.getStatus() == null ? DRAFT : paperDto.getStatus()); paper.setTitle(paperDto.getTitle()); paper.setUpdateDate(new Date()); - paper.setDeadlineDate(paperDto.getDeadlineDate()); + paper.setDeadlines(deadlineService.saveOrCreate(paperDto.getDeadlines())); if (paperDto.getTmpFileName() != null) { paper.setFileData(fileService.createFileFromTmp(paperDto.getTmpFileName())); } @@ -115,7 +119,7 @@ public class PaperService { Paper paper = new Paper(); paper.setTitle(title); paper.getAuthors().add(user); - paper.setDeadlineDate(deadlineDate); + paper.getDeadlines().add(new Deadline(deadlineDate, "первый дедлайн")); paper.setCreateDate(new Date()); paper.setUpdateDate(new Date()); paper.setStatus(DRAFT); @@ -133,11 +137,11 @@ public class PaperService { public void closeFailedPapers() { List papers = paperRepository.findAll() .stream() - .filter(paper -> paper.getDeadlineDate() != null + .filter(paper -> paper.getNextDeadline().isPresent() && (paper.getStatus() == ON_PREPARATION || paper.getStatus() == DRAFT || paper.getStatus() == ATTENTION) - && paper.getDeadlineDate().before(new Date())) + && paper.getNextDeadline().get().getDate().before(new Date())) .collect(Collectors.toList()); papers.forEach(paper -> { Paper.PaperStatus oldStatus = paper.getStatus(); diff --git a/src/main/java/ru/ulstu/project/model/Project.java b/src/main/java/ru/ulstu/project/model/Project.java new file mode 100644 index 0000000..06722a1 --- /dev/null +++ b/src/main/java/ru/ulstu/project/model/Project.java @@ -0,0 +1,39 @@ +package ru.ulstu.project.model; + +import org.hibernate.validator.constraints.NotBlank; +import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.deadline.model.Deadline; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class Project extends BaseEntity { + + @NotBlank + private String title; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "project_id") + private List deadlines = new ArrayList<>(); + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getDeadlines() { + return deadlines; + } + + public void setDeadlines(List deadlines) { + this.deadlines = deadlines; + } +} diff --git a/src/main/java/ru/ulstu/grant/model/ProjectDto.java b/src/main/java/ru/ulstu/project/model/ProjectDto.java similarity index 58% rename from src/main/java/ru/ulstu/grant/model/ProjectDto.java rename to src/main/java/ru/ulstu/project/model/ProjectDto.java index 2a22d8a..69e9b1b 100644 --- a/src/main/java/ru/ulstu/grant/model/ProjectDto.java +++ b/src/main/java/ru/ulstu/project/model/ProjectDto.java @@ -1,27 +1,35 @@ -package ru.ulstu.grant.model; +package ru.ulstu.project.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.hibernate.validator.constraints.NotEmpty; +import ru.ulstu.deadline.model.DeadlineDto; -import javax.validation.constraints.NotNull; -import java.util.Date; +import java.util.List; + +import static ru.ulstu.core.util.StreamApiUtils.convert; public class ProjectDto { private final Integer id; + @NotEmpty private final String title; + private final List deadlines; + @JsonCreator public ProjectDto(@JsonProperty("id") Integer id, - @JsonProperty("title") String title){ + @JsonProperty("title") String title, + @JsonProperty("deadlines") List deadlines) { this.id = id; this.title = title; + this.deadlines = deadlines; } public ProjectDto(Project project) { this.id = project.getId(); this.title = project.getTitle(); + this.deadlines = convert(project.getDeadlines(), DeadlineDto::new); } public Integer getId() { diff --git a/src/main/resources/db/changelog-20181208_000000-schema.xml b/src/main/resources/db/changelog-20181208_000000-schema.xml index e88b73e..1943b26 100644 --- a/src/main/resources/db/changelog-20181208_000000-schema.xml +++ b/src/main/resources/db/changelog-20181208_000000-schema.xml @@ -3,6 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> + + + + + + + + + + + + @@ -12,34 +24,42 @@ + + + - - - - - - - - - - + + + + + + + + + diff --git a/src/main/resources/db/changelog-master.xml b/src/main/resources/db/changelog-master.xml index d0199a1..6c7147b 100644 --- a/src/main/resources/db/changelog-master.xml +++ b/src/main/resources/db/changelog-master.xml @@ -16,4 +16,5 @@ + \ No newline at end of file diff --git a/src/main/resources/mail_templates/paperCreateNotification.html b/src/main/resources/mail_templates/paperCreateNotification.html index afbbe20..2758143 100644 --- a/src/main/resources/mail_templates/paperCreateNotification.html +++ b/src/main/resources/mail_templates/paperCreateNotification.html @@ -13,7 +13,7 @@ Вам нужно поработать над статьей "Title".

- Срок исполнения: . + Срок исполнения: .

Regards, diff --git a/src/main/resources/mail_templates/paperDeadlineNotification.html b/src/main/resources/mail_templates/paperDeadlineNotification.html index ee63f3b..a239421 100644 --- a/src/main/resources/mail_templates/paperDeadlineNotification.html +++ b/src/main/resources/mail_templates/paperDeadlineNotification.html @@ -13,7 +13,7 @@ Приближается срок сдачи статьи "Title".

- Срок исполнения: . + Срок исполнения: .

Regards,