From 206bc7cb5b655bf7734f950ed1964a8eff4576e6 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Fri, 17 Feb 2017 22:56:18 +0100
Subject: [PATCH] Add project delete

---
 .../tobias/playpad/server/PlayPadServer.scala |  4 +-
 .../project/loader/sql/ProjectLoader.scala    | 22 +++++++++++
 .../project/saver/sql/ProjectSaver.scala      |  4 ++
 .../playpad/server/server/SqlHelper.scala     | 18 ++++++++-
 .../server/server/project/ProjectDelete.scala | 37 +++++++++++++++++++
 5 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 src/main/scala/de/tobias/playpad/server/server/project/ProjectDelete.scala

diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
index 7f5c302..d38f169 100644
--- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
+++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala
@@ -12,7 +12,7 @@ import de.tobias.playpad.server.plugin.Plugin
 import de.tobias.playpad.server.project.{Design, Pad, Page, Project}
 import de.tobias.playpad.server.server.account._
 import de.tobias.playpad.server.server.plugin.{PluginGet, PluginList}
-import de.tobias.playpad.server.server.project.{ProjectGet, ProjectHandler}
+import de.tobias.playpad.server.server.project._
 import de.tobias.playpad.server.settings.SettingsHandler
 import de.tobias.playpad.server.transformer.JsonTransformer
 import spark.Spark._
@@ -62,6 +62,8 @@ object PlayPadServer extends App {
 
 	// Project
 	get("/projects", new ProjectGet(databaseConnection, sessionDao), new JsonTransformer)
+	post("/projects", new ProjectPost(databaseConnection, sessionDao), new JsonTransformer)
+	delete("/projects", new ProjectDelete(databaseConnection, sessionDao), new JsonTransformer)
 
 	// Plugins
 	get("/plugins/:id", new PluginGet(pluginDao), new JsonTransformer)
diff --git a/src/main/scala/de/tobias/playpad/server/project/loader/sql/ProjectLoader.scala b/src/main/scala/de/tobias/playpad/server/project/loader/sql/ProjectLoader.scala
index dffb418..f2bce4a 100644
--- a/src/main/scala/de/tobias/playpad/server/project/loader/sql/ProjectLoader.scala
+++ b/src/main/scala/de/tobias/playpad/server/project/loader/sql/ProjectLoader.scala
@@ -35,4 +35,26 @@ class ProjectLoader {
 
 		projects
 	}
+
+	def getAccountId(connection: Connection, id: UUID): Int = {
+		val sql = s"SELECT account_id FROM $PROJECT WHERE $PROJECT_ID = ?"
+
+		val preparedStatement = connection.prepareStatement(sql)
+		preparedStatement.setString(1, id.toString)
+		val result = preparedStatement.executeQuery()
+
+		while (result.next()) {
+			val account_id = result.getInt(PROJECT_ACCOUNT_ID)
+
+			result.close()
+			preparedStatement.close()
+
+			return account_id
+		}
+
+		result.close()
+		preparedStatement.close()
+
+		-1
+	}
 }
diff --git a/src/main/scala/de/tobias/playpad/server/project/saver/sql/ProjectSaver.scala b/src/main/scala/de/tobias/playpad/server/project/saver/sql/ProjectSaver.scala
index 44ce810..be385e4 100644
--- a/src/main/scala/de/tobias/playpad/server/project/saver/sql/ProjectSaver.scala
+++ b/src/main/scala/de/tobias/playpad/server/project/saver/sql/ProjectSaver.scala
@@ -1,6 +1,7 @@
 package de.tobias.playpad.server.project.saver.sql
 
 import java.sql.Connection
+import java.util.UUID
 
 import de.tobias.playpad.server.project.Project
 import de.tobias.playpad.server.project.utils.SqlDef._
@@ -17,4 +18,7 @@ class ProjectSaver {
 		val pageSaver = new PageSaver
 		project.pages.foreach(pageSaver.save(connection, _))
 	}
+	def delete(connection: Connection, project: UUID): Unit = {
+		SqlHelper.delete(connection, PROJECT, project)
+	}
 }
diff --git a/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala b/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala
index 8f93ec9..cd97aac 100644
--- a/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala
+++ b/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala
@@ -23,7 +23,7 @@ object SqlHelper {
 	}
 
 	private def createQuery[T](connection: Connection, table: String, field: String, value: T): PreparedStatement = {
-		val sql = "INSERT INTO %s (id, %s) VALUES(?, ?) ON DUPLICATE KEY UPDATE %s=?".format(table, field, field)
+		val sql = s"INSERT INTO $table (id, $field) VALUES(?, ?) ON DUPLICATE KEY UPDATE $field=?"
 		val preparedStatement = connection.prepareStatement(sql)
 
 		value match {
@@ -48,6 +48,22 @@ object SqlHelper {
 		preparedStatement
 	}
 
+	def delete(connection: Connection, table: String, id: Int): Unit = {
+		val sql = s"DELETE FROM $table WHERE id = ?"
+		val preparedStatement = connection.prepareStatement(sql)
+		preparedStatement.setInt(1, id)
+		preparedStatement.execute()
+		preparedStatement.close()
+	}
+
+	def delete(connection: Connection, table: String, uuid: UUID): Unit = {
+		val sql = s"DELETE FROM $table WHERE id = ?"
+		val preparedStatement = connection.prepareStatement(sql)
+		preparedStatement.setString(1, uuid.toString)
+		preparedStatement.execute()
+		preparedStatement.close()
+	}
+
 	def createTables(connection: Connection): Unit = {
 		def createTable(sql: String) = {
 			val preparedStatement = connection.prepareStatement(sql)
diff --git a/src/main/scala/de/tobias/playpad/server/server/project/ProjectDelete.scala b/src/main/scala/de/tobias/playpad/server/server/project/ProjectDelete.scala
new file mode 100644
index 0000000..b5a48aa
--- /dev/null
+++ b/src/main/scala/de/tobias/playpad/server/server/project/ProjectDelete.scala
@@ -0,0 +1,37 @@
+package de.tobias.playpad.server.server.project
+
+import java.sql.Connection
+import java.util.UUID
+
+import com.j256.ormlite.dao.Dao
+import de.tobias.playpad.server.account.Session
+import de.tobias.playpad.server.project.loader.sql.ProjectLoader
+import de.tobias.playpad.server.project.saver.sql.ProjectSaver
+import de.tobias.playpad.server.server.{Result, Status}
+import spark.{Request, Response, Route}
+
+/**
+  * Created by tobias on 17.02.17.
+  */
+class ProjectDelete(connection: Connection, sessionDao: Dao[Session, Int]) extends Route {
+	override def handle(request: Request, response: Response): AnyRef = {
+		val sessionKey = request.queryParams("session")
+		val session = Session.getSession(sessionKey, sessionDao)
+		session match {
+			case Some(s) =>
+				val projectId = UUID.fromString(request.queryParams("project"))
+
+				val projectLoader = new ProjectLoader
+				val account_id = projectLoader.getAccountId(connection, projectId)
+				if (account_id == s.getAccount.id) {
+					val projectSaver = new ProjectSaver
+					projectSaver.delete(connection, projectId)
+
+					return new Result(Status.OK, "added project")
+				}
+				new Result(Status.ERROR, "session mismatch")
+			case None =>
+				new Result(Status.ERROR, "session invalid")
+		}
+	}
+}
-- 
GitLab