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