From e0603851da879eb470245151d9700bb635e3e25d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sven=20K=C3=A4stle?= <sven.kaestle@gmx.de>
Date: Wed, 8 Aug 2018 20:37:49 +0200
Subject: [PATCH] feat: New REST gateway to create and receive full submission

---
 .../unipotsdam/gf/interfaces/ISubmission.java |  32 +++++
 .../controller/SubmissionController.java      | 122 ++++++++++++++++++
 .../submission/model/FullSubmission.java      |  66 ++++++++++
 .../model/FullSubmissionPostRequest.java      |  46 +++++++
 .../submission/model/SubmissionResponse.java  |  35 +++++
 .../submission/view/SubmissionService.java    |  54 ++++++++
 .../src/scripts/dbschema/fltrail.sql          |   8 ++
 7 files changed, 363 insertions(+)
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionResponse.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java

diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java
new file mode 100644
index 00000000..02f34a3c
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java
@@ -0,0 +1,32 @@
+package unipotsdam.gf.interfaces;
+
+import unipotsdam.gf.modules.submission.model.FullSubmission;
+import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
+
+public interface ISubmission {
+
+    /**
+     * Store the full submission text in the database
+     *
+     * @param request The full submission post request
+     * @return The new full submission
+     */
+    FullSubmission addFullSubmission(FullSubmissionPostRequest request);
+
+    /**
+     * Get the entire submission from the databse
+     *
+     * @param fullSubmissionId The id of the submission
+     * @return The full submission
+     */
+    FullSubmission getFullSubmission(String fullSubmissionId);
+
+    /**
+     * Checks if an full submission id already exists in the database
+     *
+     * @param id The id of the full submission
+     * @return Returns true if the id exists
+     */
+    boolean existsFullSubmissionId(String id);
+
+}
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
new file mode 100644
index 00000000..37dba284
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
@@ -0,0 +1,122 @@
+package unipotsdam.gf.modules.submission.controller;
+
+import unipotsdam.gf.core.database.mysql.MysqlConnect;
+import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet;
+import unipotsdam.gf.interfaces.ISubmission;
+import unipotsdam.gf.modules.submission.model.FullSubmission;
+import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
+
+import java.util.UUID;
+
+/**
+ * @author Sven Kästle
+ * skaestle@uni-potsdam.de
+ */
+public class SubmissionController implements ISubmission {
+    @Override
+    public FullSubmission addFullSubmission(FullSubmissionPostRequest fullSubmissionPostRequest) {
+
+        // create a new id if we found no id.
+        String uuid = UUID.randomUUID().toString();
+        while (existsFullSubmissionId(uuid)) {
+            uuid = UUID.randomUUID().toString();
+        }
+
+        // establish connection
+        MysqlConnect connection = new MysqlConnect();
+        connection.connect();
+
+        // build and execute request
+        String request = "INSERT INTO fullsubmissions (`id`, `user`, `text`) VALUES (?,?,?);";
+        connection.issueInsertOrDeleteStatement(request, uuid, fullSubmissionPostRequest.getUser(), fullSubmissionPostRequest.getText());
+
+        // get the new submission from database
+        FullSubmission fullSubmission = getFullSubmission(uuid);
+
+        // close connection
+        connection.close();
+
+        return fullSubmission;
+
+    }
+
+    @Override
+    public FullSubmission getFullSubmission(String fullSubmissionId) {
+
+        // establish connection
+        MysqlConnect connection = new MysqlConnect();
+        connection.connect();
+
+        // build and execute request
+        String request = "SELECT * FROM fullsubmissions WHERE id = ?;";
+        VereinfachtesResultSet rs = connection.issueSelectStatement(request, fullSubmissionId);
+
+        if (rs.next()) {
+
+            // save submission
+            FullSubmission fullSubmission = getFullSubmissionFromResultSet(rs);
+
+            // close connection
+            connection.close();
+
+            return fullSubmission;
+        }
+        else {
+
+            // close connection
+            connection.close();
+
+            return null;
+        }
+
+    }
+
+    @Override
+    public boolean existsFullSubmissionId(String id) {
+
+        // establish connection
+        MysqlConnect connection = new MysqlConnect();
+        connection.connect();
+
+        // build and execute request
+        String request = "SELECT COUNT(*) > 0 AS `exists` FROM fullsubmissions WHERE id = ?;";
+        VereinfachtesResultSet rs = connection.issueSelectStatement(request, id);
+
+        if (rs.next()) {
+            // save the response
+            int count = rs.getInt("exists");
+
+            // close connection
+            connection.close();
+
+            // return true if we found the id
+            if (count < 1) {
+                return false;
+            }
+            else {
+                return true;
+            }
+        }
+
+        // something happened
+        return true;
+
+    }
+
+    /**
+     * Build an full submission object from a given result set
+     *
+     * @param rs The result set from a database query
+     * @return A new full submission object
+     */
+    private FullSubmission getFullSubmissionFromResultSet(VereinfachtesResultSet rs) {
+
+        String id = rs.getString("id");
+        long timestamp = rs.getTimestamp(2).getTime();
+        String user = rs.getString("user");
+        String text = rs.getString("text");
+
+        return new FullSubmission(id, timestamp, user, text);
+
+    }
+}
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
new file mode 100644
index 00000000..725db4b2
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java
@@ -0,0 +1,66 @@
+package unipotsdam.gf.modules.submission.model;
+
+/**
+ * @author Sven Kästle
+ * skaestle@uni-potsdam.de
+ */
+public class FullSubmission {
+
+    // variables
+    private String id;
+    private long timestamp;
+    private String user;
+    private String text;
+
+    // constructor
+    public FullSubmission(String id, long timestamp, String user, String text) {
+        this.id = id;
+        this.timestamp = timestamp;
+        this.user = user;
+        this.text = text;
+    }
+
+    // methods
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    @Override
+    public String toString() {
+        return "FullSubmission{" +
+                "id='" + id + '\'' +
+                ", timestamp=" + timestamp +
+                ", user='" + user + '\'' +
+                ", text='" + text + '\'' +
+                '}';
+    }
+
+}
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
new file mode 100644
index 00000000..a807283a
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java
@@ -0,0 +1,46 @@
+package unipotsdam.gf.modules.submission.model;
+
+/**
+ * @author Sven Kästle
+ * skaestle@uni-potsdam.de
+ */
+public class FullSubmissionPostRequest {
+
+    // variables
+    private String user;
+    private String text;
+
+    // constructors
+    public FullSubmissionPostRequest(String user, String text) {
+        this.user = user;
+        this.text = text;
+    }
+
+    public FullSubmissionPostRequest() {}
+
+    // methods
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    @Override
+    public String toString() {
+        return "FullSubmissionPostRequest{" +
+                "user='" + user + '\'' +
+                ", text='" + text + '\'' +
+                '}';
+    }
+
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionResponse.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionResponse.java
new file mode 100644
index 00000000..51990953
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionResponse.java
@@ -0,0 +1,35 @@
+package unipotsdam.gf.modules.submission.model;
+
+/**
+ * @author Sven Kästle
+ * skaestle@uni-potsdam.de
+ */
+public class SubmissionResponse {
+
+    // variables
+    String message;
+
+    // constructors
+    public SubmissionResponse(String message) {
+        this.message = message;
+    }
+
+    public SubmissionResponse(){}
+
+    // methods
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @Override
+    public String toString() {
+        return "SubmissionResponse{" +
+                "message='" + message + '\'' +
+                '}';
+    }
+
+}
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
new file mode 100644
index 00000000..41d96157
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
@@ -0,0 +1,54 @@
+package unipotsdam.gf.modules.submission.view;
+
+import unipotsdam.gf.modules.annotation.model.AnnotationResponse;
+import unipotsdam.gf.modules.submission.controller.SubmissionController;
+import unipotsdam.gf.modules.submission.model.FullSubmission;
+import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
+import unipotsdam.gf.modules.submission.model.SubmissionResponse;
+
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+/**
+ * @author Sven Kästle
+ * skaestle@uni-potsdam.de
+ */
+
+@Path("/submissions")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class SubmissionService {
+
+    @POST
+    @Path("/full")
+    public Response addFullSubmission(FullSubmissionPostRequest fullSubmissionPostRequest) {
+        // save full submission request in database and return the new id
+        SubmissionController controller = new SubmissionController();
+        FullSubmission fullSubmission = controller.addFullSubmission(fullSubmissionPostRequest);
+
+        return Response.ok(fullSubmission).build();
+    }
+
+    @GET
+    @Path("/full/{id}")
+    public Response getFullSubmission(@PathParam("id") String fullSubmissionId) {
+
+        // get full submission from database based by id
+        SubmissionController controller = new SubmissionController();
+        FullSubmission fullSubmission = controller.getFullSubmission(fullSubmissionId);
+
+        if (fullSubmission != null) {
+            return Response.ok(fullSubmission).build();
+        }
+        else {
+            // declare response
+            SubmissionResponse response = new SubmissionResponse();
+            response.setMessage("Submission with the id '" + fullSubmissionId + "' can't be found");
+
+            return Response.status(Response.Status.NOT_FOUND).entity(response).build();
+        }
+
+
+    }
+}
diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
index 9fa4f5d9..f8eac43a 100644
--- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
+++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
@@ -121,6 +121,14 @@ CREATE TABLE if not exists `annotations` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
+CREATE TABLE if not exists `fullsubmissions` (
+  `id` VARCHAR(120) NOT NULL,
+  `timestamp` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  `user` VARCHAR(120) NOT NULL,
+  `text` MEDIUMTEXT NOT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE = InnoDB DEFAULT CHARSET=utf8;
+
 alter table users
 
   add isStudent tinyint(1) default '1' null;
-- 
GitLab