From d1168c34b9652627f23e3011003312828875568a Mon Sep 17 00:00:00 2001
From: Martin Staehr <software@mstaehr.net>
Date: Mon, 10 Jun 2019 12:48:42 +0200
Subject: [PATCH] #77 adds functionality to save portfolio entry

---
 .../controller/SubmissionController.java      | 45 ++++++++++++-------
 .../submission/model/FullSubmission.java      | 27 ++++++++++-
 .../model/FullSubmissionPostRequest.java      | 37 +++++++++++++--
 .../modules/submission/model/Visibility.java  |  9 ++++
 .../submission/view/SubmissionService.java    | 36 ++++++++++-----
 .../annotation/js/unstructuredUpload.js       | 43 +++++++++---------
 .../src/test/resources/database/fltrail.sql   | 16 ++++---
 7 files changed, 154 insertions(+), 59 deletions(-)
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java

diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
index 6161d2b9..3e202bad 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
@@ -16,9 +16,9 @@ import unipotsdam.gf.modules.submission.model.SubmissionPart;
 import unipotsdam.gf.modules.submission.model.SubmissionPartBodyElement;
 import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest;
 import unipotsdam.gf.modules.submission.model.SubmissionProjectRepresentation;
+import unipotsdam.gf.modules.submission.model.Visibility;
 import unipotsdam.gf.modules.submission.view.SubmissionRenderData;
 import unipotsdam.gf.modules.user.User;
-import unipotsdam.gf.modules.user.UserDAO;
 import unipotsdam.gf.mysql.MysqlConnect;
 import unipotsdam.gf.mysql.VereinfachtesResultSet;
 import unipotsdam.gf.process.progress.HasProgress;
@@ -41,12 +41,13 @@ import java.util.UUID;
 public class SubmissionController implements ISubmission, HasProgress {
 
     private static final org.slf4j.Logger log = LoggerFactory.getLogger(SubmissionController.class);
+
     @Inject
     private MysqlConnect connection;
-    @Inject
-    private UserDAO userDAO;
+
     @Inject
     private GroupDAO groupDAO;
+
     @Inject
     private ProjectDAO projectDAO;
 
@@ -59,11 +60,24 @@ public class SubmissionController implements ISubmission, HasProgress {
         while (existsFullSubmissionId(uuid)) {
             uuid = UUID.randomUUID().toString();
         }
+        String requestCommand = "INSERT INTO";
+        if (!(fullSubmissionPostRequest.getContributionCategory() == ContributionCategory.PORTFOLIO)) {
+            Project project = new Project(fullSubmissionPostRequest.getProjectName());
+            FullSubmission fullSubmission = getFullSubmissionBy(fullSubmissionPostRequest.getGroupId(), project,
+                    fullSubmissionPostRequest.getContributionCategory());
+            if (fullSubmission != null) {
+                uuid = fullSubmission.getId();
+            }
+            requestCommand = "REPLACE INTO";
+        }
+
+        String request = String.join(" ", requestCommand.trim(),
+                "fullsubmissions (`id`, `groupId`, `text`, `projectName`, `contributionCategory`, `userEmail`, `visibility`) VALUES (?,?,?,?,?,?,?);");
 
         // build and execute request
-        String request = "REPLACE INTO fullsubmissions (`id`, `groupId`, `text`, `projectName`, `contributionCategory`) VALUES (?,?,?,?,?);";
         connection.issueInsertOrDeleteStatement(request, uuid, fullSubmissionPostRequest.getGroupId(),
-                fullSubmissionPostRequest.getText(), fullSubmissionPostRequest.getProjectName(), fullSubmissionPostRequest.getContributionCategory());
+                fullSubmissionPostRequest.getText(), fullSubmissionPostRequest.getProjectName(),
+                fullSubmissionPostRequest.getContributionCategory(), fullSubmissionPostRequest.getUserEMail(), fullSubmissionPostRequest.getVisibility());
 
         // close connection
         connection.close();
@@ -96,7 +110,7 @@ public class SubmissionController implements ISubmission, HasProgress {
         return fullSubmission;
     }
 
-    public FullSubmission getFullSubmissionByGroupIdAndProjectNameAndContributionCategory(int groupId, Project project, ContributionCategory contributionCategory) {
+    public FullSubmission getFullSubmissionBy(int groupId, Project project, ContributionCategory contributionCategory) {
 
         FullSubmission fullSubmission = null;
         connection.connect();
@@ -112,7 +126,7 @@ public class SubmissionController implements ISubmission, HasProgress {
     }
 
     public String getFullSubmissionId(Integer groupId, Project project, ContributionCategory contributionCategory) {
-        FullSubmission fullSubmission = getFullSubmissionByGroupIdAndProjectNameAndContributionCategory(groupId, project, contributionCategory);
+        FullSubmission fullSubmission = getFullSubmissionBy(groupId, project, contributionCategory);
         String fullSubmissionId = null;
         if (!Objects.isNull(fullSubmission)) {
             fullSubmissionId = fullSubmission.getId();
@@ -229,10 +243,9 @@ public class SubmissionController implements ISubmission, HasProgress {
         connection.close();
 
         // get the new submission from database
-        SubmissionPart submissionPart = getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(),
-                submissionPartPostRequest.getCategory());
 
-        return submissionPart;
+        return getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(),
+                submissionPartPostRequest.getCategory());
 
     }
 
@@ -357,13 +370,9 @@ public class SubmissionController implements ISubmission, HasProgress {
             int count = rs.getInt("exists");
 
             // return true if we found the id
-            if (count < 1) {
-                return false;
-            } else {
-                return true;
-            }
+            return count >= 1;
         }
-        return null;
+        return false;
     }
 
     /**
@@ -377,11 +386,13 @@ public class SubmissionController implements ISubmission, HasProgress {
         String id = rs.getString("id");
         long timestamp = rs.getTimestamp("timestamp").getTime();
         Integer groupId = rs.getInt("groupId");
+        String userEmail = rs.getString("userEmail");
         String text = rs.getString("text");
         String projectName = rs.getString("projectName");
         ContributionCategory contributionCategory = ContributionCategory.valueOf(rs.getString("contributionCategory"));
+        Visibility visibility = Visibility.valueOf(rs.getString("visibility"));
 
-        return new FullSubmission(id, timestamp, groupId, text, contributionCategory, projectName);
+        return new FullSubmission(id, timestamp, groupId, userEmail, text, contributionCategory, projectName, visibility);
 
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
index 6ebfb2f2..033416f6 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
@@ -12,17 +12,25 @@ public class FullSubmission {
     private String id;
     private long timestamp;
     private Integer groupId;
+    private String userEmail;
     private String text;
     private ContributionCategory contributionCategory;
     private String projectName;
+    private Visibility visibility;
 
-    public FullSubmission(String id, long timestamp, Integer groupId, String text, ContributionCategory contributionCategory, String projectName) {
+    public FullSubmission(String id, long timestamp, Integer groupId, String text, ContributionCategory contributionCategory, String projectName, Visibility visibility) {
+        this(id, timestamp, groupId, null, text, contributionCategory, projectName, visibility);
+    }
+
+    public FullSubmission(String id, long timestamp, Integer groupId, String userEmail, String text, ContributionCategory contributionCategory, String projectName, Visibility visibility) {
         this.id = id;
         this.timestamp = timestamp;
         this.groupId = groupId;
+        this.userEmail = userEmail;
         this.text = text;
         this.contributionCategory = contributionCategory;
         this.projectName = projectName;
+        this.visibility = visibility;
     }
 
     public FullSubmission(String submissionId) {
@@ -78,6 +86,21 @@ public class FullSubmission {
         this.projectName = projectName;
     }
 
+    public String getUserEmail() {
+        return userEmail;
+    }
+
+    public void setUserEmail(String userEmail) {
+        this.userEmail = userEmail;
+    }
+
+    public Visibility getVisibility() {
+        return visibility;
+    }
+
+    public void setVisibility(Visibility visibility) {
+        this.visibility = visibility;
+    }
 
     @Override
     public String toString() {
@@ -85,9 +108,11 @@ public class FullSubmission {
                 "id='" + id + '\'' +
                 ", timestamp=" + timestamp +
                 ", groupId=" + groupId +
+                ", userEmail='" + userEmail + '\'' +
                 ", text='" + text + '\'' +
                 ", contributionCategory=" + contributionCategory +
                 ", projectName='" + projectName + '\'' +
+                ", visibility=" + visibility +
                 '}';
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
index d3a6d3cd..ee7df00c 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
@@ -1,20 +1,27 @@
 package unipotsdam.gf.modules.submission.model;
 
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory;
 
 /**
  * @author Sven Kästle
  * skaestle@uni-potsdam.de
  */
+@JsonIgnoreProperties(ignoreUnknown = true)
 public class FullSubmissionPostRequest {
 
     // variables
     private Integer groupId;
+    private boolean personal;
     private String text;
     private String html;
     private String projectName;
     private ContributionCategory contributionCategory;
 
+    // have to be set in backend
+    private String userEMail;
+    private Visibility visibility;
+
     public FullSubmissionPostRequest() {
     }
 
@@ -23,7 +30,7 @@ public class FullSubmissionPostRequest {
         return groupId;
     }
 
-    public void setUser(Integer groupId) {
+    public void setGroupId(Integer groupId) {
         this.groupId = groupId;
     }
 
@@ -59,15 +66,39 @@ public class FullSubmissionPostRequest {
         this.contributionCategory = contributionCategory;
     }
 
+    public boolean isPersonal() {
+        return personal;
+    }
+
+    public void setPersonal(boolean personal) {
+        this.personal = personal;
+    }
+
+    public String getUserEMail() {
+        return userEMail;
+    }
+
+    public void setUserEMail(String userEMail) {
+        this.userEMail = userEMail;
+    }
+
+    public Visibility getVisibility() {
+        return visibility;
+    }
+
+    public void setVisibility(Visibility visibility) {
+        this.visibility = visibility;
+    }
+
     @Override
     public String toString() {
         return "FullSubmissionPostRequest{" +
                 "groupId=" + groupId +
+                ", personal=" + personal +
                 ", text='" + text + '\'' +
                 ", html='" + html + '\'' +
                 ", projectName='" + projectName + '\'' +
-                ", contributionCategory='" + contributionCategory + '\'' +
+                ", contributionCategory=" + contributionCategory +
                 '}';
     }
-
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java
new file mode 100644
index 00000000..56a9e955
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java
@@ -0,0 +1,9 @@
+package unipotsdam.gf.modules.submission.model;
+
+public enum Visibility {
+
+    PUBLIC,
+    DOCENT,
+    GROUP,
+    PERSONAL
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
index 210fd00a..62045333 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
@@ -13,6 +13,7 @@ import unipotsdam.gf.modules.submission.model.SubmissionPart;
 import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest;
 import unipotsdam.gf.modules.submission.model.SubmissionProjectRepresentation;
 import unipotsdam.gf.modules.submission.model.SubmissionResponse;
+import unipotsdam.gf.modules.submission.model.Visibility;
 import unipotsdam.gf.modules.user.User;
 import unipotsdam.gf.modules.user.UserDAO;
 import unipotsdam.gf.process.DossierCreationProcess;
@@ -65,29 +66,34 @@ public class SubmissionService {
     public Response addFullSubmission(@Context HttpServletRequest req,
                                       FullSubmissionPostRequest fullSubmissionPostRequest) {
         // save full submission request in database and return the new full submission
-        final FullSubmission fullSubmission;
+
         String userEmail = (String) req.getSession().getAttribute(GFContexts.USEREMAIL);
         User user = userDAO.getUserByEmail(userEmail);
         Project project = new Project(fullSubmissionPostRequest.getProjectName());
-        try {
 
-            fileManagementService.saveStringAsPDF(user, project, fullSubmissionPostRequest);
-        } catch (DocumentException | IOException e) {
-            e.printStackTrace();
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Error while converting to pdf").build();
+
+        if (fullSubmissionPostRequest.isPersonal()) {
+            fullSubmissionPostRequest.setUserEMail(userEmail);
+            fullSubmissionPostRequest.setVisibility(Visibility.PERSONAL);
+        } else {
+            fullSubmissionPostRequest.setVisibility(Visibility.GROUP);
         }
 
-        fullSubmission = submissionController.addFullSubmission(fullSubmissionPostRequest);
+        final FullSubmission fullSubmission = submissionController.addFullSubmission(fullSubmissionPostRequest);
 
         switch (fullSubmission.getContributionCategory()) {
             case DOSSIER:
+                try {
+                    fileManagementService.saveStringAsPDF(user, project, fullSubmissionPostRequest);
+                } catch (DocumentException | IOException e) {
+                    e.printStackTrace();
+                    return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Error while converting to pdf").build();
+                }
                 dossierCreationProcess.notifyAboutSubmission(user, project);
                 break;
             case PORTFOLIO:
                 break;
         }
-
-
         return Response.ok(fullSubmission).build();
     }
 
@@ -117,7 +123,7 @@ public class SubmissionService {
                                       @PathParam("groupId") Integer groupId,
                                       @PathParam("contributionCategory") ContributionCategory contributionCategory) {
         Project project = new Project(projectName);
-        FullSubmission fullSubmission = submissionController.getFullSubmissionByGroupIdAndProjectNameAndContributionCategory(groupId, project, contributionCategory);
+        FullSubmission fullSubmission = submissionController.getFullSubmissionBy(groupId, project, contributionCategory);
 
         if (Objects.isNull(fullSubmission)) {
             return Response.status(Response.Status.NOT_FOUND).build();
@@ -190,8 +196,14 @@ public class SubmissionService {
     public void finalize(@PathParam("submissionId") String submissionId, @PathParam("projectId") String projectId,
                          @Context HttpServletRequest req) {
         String userEmail = (String) req.getSession().getAttribute(GFContexts.USEREMAIL);
-        dossierCreationProcess.finalizeDossier(new FullSubmission(submissionId), new User(userEmail),
-                new Project(projectId));
+        FullSubmission fullSubmission = submissionController.getFullSubmission(submissionId);
+        switch (fullSubmission.getContributionCategory()) {
+            case DOSSIER:
+                dossierCreationProcess.finalizeDossier(fullSubmission, new User(userEmail), new Project(projectId));
+                break;
+            case PORTFOLIO:
+                break;
+        }
     }
 
     @GET
diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js
index c1cc07d4..5a555a2f 100644
--- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js
+++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js
@@ -17,30 +17,31 @@ $(document).ready(function () {
 
     $('#btnSave').click(function () {
 
-        if (quill.getText().length > 1) {
-            let content = quill.getContents();
-            let html = quill.root.innerHTML;
+        getMyGroupId(function (groupId) {
+            if (quill.getText().length > 1) {
+                let content = quill.getContents();
+                let html = quill.root.innerHTML;
 
-            // build request
-            let fullSubmissionPostRequest = {
-                groupId: groupId,
-                text: JSON.stringify(content),
-                html: html,
-                projectName: $('#projectName').text().trim(),
-                contributionCategory: contributionCategory.toUpperCase()
-            };
+                // build request
+                let fullSubmissionPostRequest = {
+                    groupId: groupId,
+                    text: JSON.stringify(content),
+                    html: html,
+                    projectName: $('#projectName').text().trim(),
+                    personal: personal,
+                    contributionCategory: contributionCategory.toUpperCase()
+                };
 
-            // save request in database
-            createFullSubmission(fullSubmissionPostRequest, function () {
-
-                // back to main page
-                location.href = hierarchyLevel + "project/tasks-student.jsp?projectName=" + $('#projectName').text().trim();
-            });
-        } else {
-            alert("Ein Text wird benötigt");
-        }
-        // fetch user and text
+                // save request in database
+                createFullSubmission(fullSubmissionPostRequest, function () {
 
+                    // back to main page
+                    location.href = hierarchyLevel + "project/tasks-student.jsp?projectName=" + $('#projectName').text().trim();
+                });
+            } else {
+                alert("Ein Text wird benötigt");
+            }
+        });
     });
 
     $('#backToTasks').click(function () {
diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql
index 9f6a414a..fa16c8f7 100644
--- a/gemeinsamforschen/src/test/resources/database/fltrail.sql
+++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql
@@ -3,7 +3,7 @@
 -- https://www.phpmyadmin.net/
 --
 -- Host: 127.0.0.1
--- Erstellungszeit: 24. Mai 2019 um 11:08
+-- Erstellungszeit: 10. Jun 2019 um 10:43
 -- Server-Version: 10.1.32-MariaDB
 -- PHP-Version: 7.2.5
 
@@ -131,7 +131,9 @@ CREATE TABLE `fullsubmissions`
     `projectName`          varchar(200) NOT NULL,
     `feedbackGroup`        int(11)               DEFAULT NULL,
     `finalized`            tinyint(1)            DEFAULT NULL,
-    `contributionCategory` varchar(200) NOT NULL
+    `contributionCategory` varchar(200) NOT NULL,
+    `userEmail`            varchar(255)          DEFAULT NULL,
+    `visibility`           varchar(200) NOT NULL
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8 COMMENT ='This holds the aggregated text of the dossier students should upload';
 
@@ -580,8 +582,10 @@ ALTER TABLE `contributionrating`
 --
 ALTER TABLE `fullsubmissions`
     ADD PRIMARY KEY (`id`),
-    ADD UNIQUE KEY `fullsubmissions_user_projectName_uindex` (`groupId`, `projectName`),
-    ADD KEY `fullsubmissions_projects_name_fk` (`projectName`);
+    ADD UNIQUE KEY `fullsubmissions_id_uindex` (`id`),
+    ADD KEY `fullsubmissions_projects_name_fk` (`projectName`),
+    ADD KEY `fullsubmissions_users_email_fk` (`userEmail`),
+    ADD KEY `fullsubmissions_groups_id_fk` (`groupId`);
 
 --
 -- Indizes für die Tabelle `grades`
@@ -812,7 +816,9 @@ ALTER TABLE `contributionrating`
 -- Constraints der Tabelle `fullsubmissions`
 --
 ALTER TABLE `fullsubmissions`
-    ADD CONSTRAINT `fullsubmissions_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE;
+    ADD CONSTRAINT `fullsubmissions_groups_id_fk` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+    ADD CONSTRAINT `fullsubmissions_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE,
+    ADD CONSTRAINT `fullsubmissions_users_email_fk` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE ON UPDATE CASCADE;
 
 --
 -- Constraints der Tabelle `grades`
-- 
GitLab