From bd6ae067c3ef082579dec174f8358336fadb1080 Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Fri, 17 Feb 2017 20:08:38 +0100 Subject: [PATCH] Add project GET, improved project-sync, add autoReconnect to database --- .../tobias/playpad/server/PlayPadServer.scala | 13 +++-- .../playpad/server/server/SqlHelper.scala | 47 ++++++++++++++++ .../server/server/project/ProjectGet.scala | 39 ++++++++++++++ .../server/project/ProjectHandler.scala | 54 ++++++++++++------- 4 files changed, 131 insertions(+), 22 deletions(-) create mode 100644 src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala create mode 100644 src/main/scala/de/tobias/playpad/server/server/project/ProjectGet.scala diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala index 723fcd7..7f5c302 100644 --- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala +++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala @@ -1,16 +1,18 @@ package de.tobias.playpad.server import java.nio.file.{Files, Paths} -import java.sql.{Driver, DriverManager} +import java.sql.DriverManager +import java.util.UUID import com.j256.ormlite.dao.{Dao, DaoManager} import com.j256.ormlite.jdbc.JdbcConnectionSource import com.j256.ormlite.table.TableUtils import de.tobias.playpad.server.account.{Account, Session} 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.ProjectHandler +import de.tobias.playpad.server.server.project.{ProjectGet, ProjectHandler} import de.tobias.playpad.server.settings.SettingsHandler import de.tobias.playpad.server.transformer.JsonTransformer import spark.Spark._ @@ -31,7 +33,7 @@ object PlayPadServer extends App { private val settings = settingsLoader.load(settingsPath) - private val databaseUrl = "jdbc:mysql://" + settings.db_host + ":" + settings.db_port + "/" + settings.db_database + "?autoReconnect=true" + private val databaseUrl = "jdbc:mysql://" + settings.db_host + ":" + settings.db_port + "/" + settings.db_database + "?autoReconnect=true&wait_timeout=24" var connectionSource = new JdbcConnectionSource(databaseUrl) connectionSource.setUsername(settings.db_username) connectionSource.setPassword(settings.db_password) @@ -42,11 +44,11 @@ object PlayPadServer extends App { val accountDao: Dao[Account, Int] = DaoManager.createDao(connectionSource, classOf[Account]) val sessionDao: Dao[Session, Int] = DaoManager.createDao(connectionSource, classOf[Session]) + // Management Tables TableUtils.createTableIfNotExists(connectionSource, classOf[Plugin]) TableUtils.createTableIfNotExists(connectionSource, classOf[Account]) TableUtils.createTableIfNotExists(connectionSource, classOf[Session]) - // Setup Http Server port(8090) @@ -58,6 +60,9 @@ object PlayPadServer extends App { // PlayWall Cloud webSocket("/project", new ProjectHandler(sessionDao, databaseConnection)) + // Project + get("/projects", new ProjectGet(databaseConnection, sessionDao), new JsonTransformer) + // Plugins get("/plugins/:id", new PluginGet(pluginDao), new JsonTransformer) get("/plugins", new PluginList(pluginDao), new JsonTransformer) diff --git a/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala b/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala new file mode 100644 index 0000000..1825d0a --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala @@ -0,0 +1,47 @@ +package de.tobias.playpad.server.server + +import java.sql.{Connection, PreparedStatement} +import java.util.UUID + +/** + * Created by tobias on 17.02.17. + */ +object SqlHelper { + + def insertOrUpdate[T](connection: Connection, table: String, idValue: Int, field: String, value: T): Unit = { + val preparedStatement = createQuery(connection, table, field, value) + preparedStatement.setInt(1, idValue) + preparedStatement.execute() + preparedStatement.close() + } + + def insertOrUpdate[T](connection: Connection, table: String, idValue: UUID, field: String, value: T): Unit = { + val preparedStatement = createQuery(connection, table, field, value) + preparedStatement.setString(1, idValue.toString) + preparedStatement.execute() + preparedStatement.close() + } + + private def createQuery[T](connection: Connection, table: String, field: String, value: T): PreparedStatement = { + val sql = "INSERT INTO " + table + " (id, " + field + ") VALUES(?, ?) " + + "ON DUPLICATE KEY UPDATE " + field + "=?" + val preparedStatement = connection.prepareStatement(sql) + + value match { + case value: String => + preparedStatement.setString(2, value) + preparedStatement.setString(3, value) + case value: Boolean => + preparedStatement.setBoolean(2, value) + preparedStatement.setBoolean(3, value) + case value: Int => + preparedStatement.setInt(2, value) + preparedStatement.setInt(3, value) + case value: Double => + preparedStatement.setDouble(2, value) + preparedStatement.setDouble(3, value) + } + + preparedStatement + } +} diff --git a/src/main/scala/de/tobias/playpad/server/server/project/ProjectGet.scala b/src/main/scala/de/tobias/playpad/server/server/project/ProjectGet.scala new file mode 100644 index 0000000..abf3dcf --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/project/ProjectGet.scala @@ -0,0 +1,39 @@ +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.ProjectLoader +import de.tobias.playpad.server.project.server.json.ProjectSaver +import de.tobias.playpad.server.server.{Result, Status} +import spark.{Request, Response, Route} + +/** + * Created by tobias on 17.02.17. + */ +class ProjectGet(connection: Connection, sessionDao: Dao[Session, Int]) extends Route { + + override def handle(request: Request, response: Response): AnyRef = { + val sessionKey = request.queryParams("session") + val projectId = request.queryParams("project") + + val sessions = sessionDao.queryForEq("key", sessionKey) + if (sessions.size() == 1) { + val projectLoader = new ProjectLoader() + val projects = projectLoader.load(connection, UUID.fromString(projectId)) + val session = sessions.get(0) + + if (projects.size == 1) { + val project = projects.head + if (project.accountId == session.getAccount.id) { + val projectSaver = new ProjectSaver() + return projectSaver.save(project) + } + } + } + new Result(Status.ERROR, "Session invalid") + } + +} diff --git a/src/main/scala/de/tobias/playpad/server/server/project/ProjectHandler.scala b/src/main/scala/de/tobias/playpad/server/server/project/ProjectHandler.scala index 8e61f0e..cb1b837 100644 --- a/src/main/scala/de/tobias/playpad/server/server/project/ProjectHandler.scala +++ b/src/main/scala/de/tobias/playpad/server/server/project/ProjectHandler.scala @@ -1,12 +1,13 @@ package de.tobias.playpad.server.server.project import java.sql.Connection +import java.util.UUID import com.google.gson.{JsonObject, JsonParser} import com.j256.ormlite.dao.Dao -import com.sun.xml.internal.bind.v2.model.core.ID import de.tobias.playpad.server.account import de.tobias.playpad.server.account.Account +import de.tobias.playpad.server.server.SqlHelper import org.eclipse.jetty.websocket.api.Session import org.eclipse.jetty.websocket.api.annotations.{OnWebSocketClose, OnWebSocketConnect, OnWebSocketMessage, WebSocket} @@ -61,33 +62,50 @@ import scala.collection.{Map, mutable} val field = jsonObject.get("field").getAsString val id = jsonObject.get("id").getAsString - val sql = "INSERT INTO " + className + " (id, " + field + ") VALUES(?, ?) " + - "ON DUPLICATE KEY UPDATE " + field + "=?" - val preparedStatement = connection.prepareStatement(sql) - - preparedStatement.setString(1, id) - val valueType = Class.forName(jsonObject.get("type").getAsString) + if (valueType == classOf[String]) { val value = jsonObject.get("value").getAsString - preparedStatement.setString(2, value) - preparedStatement.setString(3, value) + + if (id.matches("[0-9]*")) { + val idInt = id.toInt + SqlHelper.insertOrUpdate(connection, className, idInt, field, value) + } else { + val uuid = UUID.fromString(id) + SqlHelper.insertOrUpdate(connection, className, uuid, field, value) + } } else if (valueType == classOf[Boolean]) { val value = jsonObject.get("value").getAsBoolean - preparedStatement.setBoolean(2, value) - preparedStatement.setBoolean(3, value) + + if (id.matches("[0-9]*")) { + val idInt = id.toInt + SqlHelper.insertOrUpdate(connection, className, idInt, field, value) + } else { + val uuid = UUID.fromString(id) + SqlHelper.insertOrUpdate(connection, className, uuid, field, value) + } } else if (valueType == classOf[Integer]){ val value = jsonObject.get("value").getAsInt - preparedStatement.setInt(2, value) - preparedStatement.setInt(3, value) - } else if (valueType == classOf[Double]){ + + if (id.matches("[0-9]*")) { + val idInt = id.toInt + SqlHelper.insertOrUpdate(connection, className, idInt, field, value) + } else { + val uuid = UUID.fromString(id) + SqlHelper.insertOrUpdate(connection, className, uuid, field, value) + } + } else if (valueType == classOf[Double]) { val value = jsonObject.get("value").getAsDouble - preparedStatement.setDouble(2, value) - preparedStatement.setDouble(3, value) + + if (id.matches("[0-9]*")) { + val idInt = id.toInt + SqlHelper.insertOrUpdate(connection, className, idInt, field, value) + } else { + val uuid = UUID.fromString(id) + SqlHelper.insertOrUpdate(connection, className, uuid, field, value) + } } - preparedStatement.execute() - preparedStatement.close() case _ => } -- GitLab