diff --git a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala index b4ac696fac9b820650db3b3d789386474854f63d..273b690f273f3a31a3b8ebe771e6d69f32ab8ffb 100644 --- a/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala +++ b/src/main/scala/de/tobias/playpad/server/PlayPadServer.scala @@ -33,7 +33,8 @@ object PlayPadServer extends App { private val settings = settingsLoader.load(settingsPath) - private val databaseUrl = s"jdbc:mysql://${settings.db_host}:${settings.db_port}/${settings.db_database}?autoReconnect=true&wait_timeout=86400" + private val databaseUrl = s"jdbc:mysql://${settings.db_host}:${settings.db_port}/${settings.db_database}?" + + s"autoReconnect=true&wait_timeout=86400&serverTimezone=Europe/Berlin" var connectionSource = new JdbcConnectionSource(databaseUrl) connectionSource.setUsername(settings.db_username) connectionSource.setPassword(settings.db_password) diff --git a/src/main/scala/de/tobias/playpad/server/project/Project.scala b/src/main/scala/de/tobias/playpad/server/project/Project.scala index 5a2054389b0a0ccf89e46631ce359ff9d857eb0c..7cd0475bde0230c894b8102ce8e7d09aa35636fd 100644 --- a/src/main/scala/de/tobias/playpad/server/project/Project.scala +++ b/src/main/scala/de/tobias/playpad/server/project/Project.scala @@ -2,15 +2,14 @@ package de.tobias.playpad.server.project import java.util.UUID +import de.tobias.playpad.server.account.Session + /** * Created by tobias on 17.02.17. */ class Project { - var id: UUID = UUID.randomUUID() - var name: String = _ - - var accountId: Int = _ // Account that own this project + val projectReference = new ProjectReference var pages: List[Page] = _ diff --git a/src/main/scala/de/tobias/playpad/server/project/ProjectReference.scala b/src/main/scala/de/tobias/playpad/server/project/ProjectReference.scala index 469faaad85b0e1c1fa5a15214dd1e500f532c3ca..1d15a978ba04c3c608721334d049f987cd02c766 100644 --- a/src/main/scala/de/tobias/playpad/server/project/ProjectReference.scala +++ b/src/main/scala/de/tobias/playpad/server/project/ProjectReference.scala @@ -10,4 +10,8 @@ class ProjectReference { var id: UUID = UUID.randomUUID() var name: String = _ + var accountId: Int = _ // Account that own this project + var lastModified: Long = _ + var session: String = _ + } diff --git a/src/main/scala/de/tobias/playpad/server/project/loader/json/ProjectLoader.scala b/src/main/scala/de/tobias/playpad/server/project/loader/json/ProjectLoader.scala index ce2831d1bd2615da6f5727aba31bd9c393550d75..be1a394e9667bc54c9a9f7fd72ea8ec80a0b8888 100644 --- a/src/main/scala/de/tobias/playpad/server/project/loader/json/ProjectLoader.scala +++ b/src/main/scala/de/tobias/playpad/server/project/loader/json/ProjectLoader.scala @@ -12,8 +12,8 @@ import de.tobias.playpad.server.project.utils.JsonDef._ class ProjectLoader { def load(json: JsonObject): Project = { val project = new Project() - project.id = UUID.fromString(json.get(PROJECT_ID).getAsString) - project.name = json.get(PROJECT_NAME).getAsString + project.projectReference.id = UUID.fromString(json.get(PROJECT_ID).getAsString) + project.projectReference.name = json.get(PROJECT_NAME).getAsString val pageLoader = new PageLoader project.pages = pageLoader.load(json.getAsJsonArray(PROJECT_PAGES), project) diff --git a/src/main/scala/de/tobias/playpad/server/project/loader/sql/PageLoader.scala b/src/main/scala/de/tobias/playpad/server/project/loader/sql/PageLoader.scala index 7ce80fa0e5aee425ae4fff4e4d85da8504940c73..30d44b6cf69c007896900d06c209195e134df98e 100644 --- a/src/main/scala/de/tobias/playpad/server/project/loader/sql/PageLoader.scala +++ b/src/main/scala/de/tobias/playpad/server/project/loader/sql/PageLoader.scala @@ -13,7 +13,7 @@ class PageLoader(val connection: Connection) { def load(project: Project): List[Page] = { val sql = s"SELECT * FROM $PAGE WHERE $PAGE_PROJECT_REF = ?" val preparedStatement = connection.prepareStatement(sql) - preparedStatement.setString(1, project.id.toString) + preparedStatement.setString(1, project.projectReference.id.toString) val result = preparedStatement.executeQuery() var pages: List[Page] = List() 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 44660ccd0d9a3d4dffb5221d98e9493f712a9c47..24ed0a0376438a5c5299f80fd3881c0b3fb0fd00 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 @@ -3,6 +3,7 @@ package de.tobias.playpad.server.project.loader.sql import java.sql.Connection import java.util.UUID +import de.tobias.playpad.server.account.Session import de.tobias.playpad.server.project.utils.SqlDef._ import de.tobias.playpad.server.project.{Project, ProjectReference} @@ -20,9 +21,12 @@ class ProjectLoader(val connection: Connection) { while (result.next()) { val project = new Project() - project.id = UUID.fromString(result.getString(PROJECT_ID)) - project.name = result.getString(PROJECT_NAME) - project.accountId = result.getInt(PROJECT_ACCOUNT_ID) + val projectReference = project.projectReference + projectReference.id = UUID.fromString(result.getString(PROJECT_ID)) + projectReference.name = result.getString(PROJECT_NAME) + projectReference.accountId = result.getInt(PROJECT_ACCOUNT_ID) + projectReference.lastModified = result.getLong(PROJECT_LAST_MODIFIED) + projectReference.session = result.getString(PROJECT_SESSION_KEY) val pageLoader = new PageLoader(connection) project.pages = pageLoader.load(project) @@ -45,11 +49,15 @@ class ProjectLoader(val connection: Connection) { var projects: List[ProjectReference] = List() while (result.next()) { - val project = new ProjectReference() - project.id = UUID.fromString(result.getString(PROJECT_ID)) - project.name = result.getString(PROJECT_NAME) + val projectReference = new ProjectReference() - projects = project :: projects + projectReference.id = UUID.fromString(result.getString(PROJECT_ID)) + projectReference.name = result.getString(PROJECT_NAME) + projectReference.accountId = result.getInt(PROJECT_ACCOUNT_ID) + projectReference.lastModified = result.getLong(PROJECT_LAST_MODIFIED) + projectReference.session = result.getString(PROJECT_SESSION_KEY) + + projects = projectReference :: projects } result.close() diff --git a/src/main/scala/de/tobias/playpad/server/project/saver/json/ProjectSaver.scala b/src/main/scala/de/tobias/playpad/server/project/saver/json/ProjectSaver.scala index 28b2282cde37139f2e3c3097f28c8a1783b0825a..f4b11791ca578dc96bad263f4b93f60c65b75934 100644 --- a/src/main/scala/de/tobias/playpad/server/project/saver/json/ProjectSaver.scala +++ b/src/main/scala/de/tobias/playpad/server/project/saver/json/ProjectSaver.scala @@ -15,8 +15,8 @@ class ProjectSaver { val pageArray = new JsonArray project.pages.foreach(page => pageArray.add(pageSaver.save(page))) - jsonObject.addProperty(PROJECT_ID, project.id.toString) - jsonObject.addProperty(PROJECT_NAME, project.name) + jsonObject.addProperty(PROJECT_ID, project.projectReference.id.toString) + jsonObject.addProperty(PROJECT_NAME, project.projectReference.name) jsonObject.add(PROJECT_PAGES, pageArray) jsonObject diff --git a/src/main/scala/de/tobias/playpad/server/project/saver/sql/PageSaver.scala b/src/main/scala/de/tobias/playpad/server/project/saver/sql/PageSaver.scala index ec28b8501dd38410456332e94a55092b45a4630a..1933fc60b2ca84ed58dd9469de1360bc2580644a 100644 --- a/src/main/scala/de/tobias/playpad/server/project/saver/sql/PageSaver.scala +++ b/src/main/scala/de/tobias/playpad/server/project/saver/sql/PageSaver.scala @@ -13,7 +13,7 @@ class PageSaver(connection: Connection) { def save(page: Page): Unit = { SqlHelper.insertOrUpdate(connection, PAGE, page.id, PAGE_NAME, page.name) SqlHelper.insertOrUpdate(connection, PAGE, page.id, PAGE_POSITION, page.position) - SqlHelper.insertOrUpdate(connection, PAGE, page.id, PAGE_PROJECT_REF, page.project.id) + SqlHelper.insertOrUpdate(connection, PAGE, page.id, PAGE_PROJECT_REF, page.project.projectReference.id) val padSaver = new PadSaver(connection) page.pads.foreach(padSaver.save) 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 8fcd2027e2769b4224bcd43b9aabcec3b552c17e..994c64ce5f17da0bde23ea237471be4b83af50e7 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 @@ -12,8 +12,9 @@ import de.tobias.playpad.server.server.SqlHelper */ class ProjectSaver(val connection: Connection) { def save(project: Project): Unit = { - SqlHelper.insertOrUpdate(connection, PROJECT, project.id, PROJECT_NAME, project.name) - SqlHelper.insertOrUpdate(connection, PROJECT, project.id, PROJECT_ACCOUNT_ID, project.accountId) + val reference = project.projectReference + SqlHelper.insertOrUpdate(connection, PROJECT, reference.id, PROJECT_NAME, reference.name) + SqlHelper.insertOrUpdate(connection, PROJECT, reference.id, PROJECT_ACCOUNT_ID, reference.accountId) val pageSaver = new PageSaver(connection) project.pages.foreach(pageSaver.save) diff --git a/src/main/scala/de/tobias/playpad/server/project/utils/SqlDef.scala b/src/main/scala/de/tobias/playpad/server/project/utils/SqlDef.scala index 38cf38a6a22a8472f5e41cd9b8ebff9a0e290b06..198c8b55e3263e3ee0069109ad9a02a9e2074521 100644 --- a/src/main/scala/de/tobias/playpad/server/project/utils/SqlDef.scala +++ b/src/main/scala/de/tobias/playpad/server/project/utils/SqlDef.scala @@ -9,6 +9,8 @@ object SqlDef { val PROJECT_ID = "id" val PROJECT_NAME = "name" val PROJECT_ACCOUNT_ID = "account_id" + val PROJECT_LAST_MODIFIED = "last_modified" + val PROJECT_SESSION_KEY = "session_key" val PAGE = "Page" val PAGE_ID = "id" 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 33833cb54a0bf3f040befa1e5c36bc2d8af62ffa..a705363c1dd68c0daa874540d8847fa05baecaa5 100644 --- a/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala +++ b/src/main/scala/de/tobias/playpad/server/server/SqlHelper.scala @@ -37,6 +37,9 @@ object SqlHelper { case value: Int => preparedStatement.setInt(2, value) preparedStatement.setInt(3, value) + case value: Long => + preparedStatement.setLong(2, value) + preparedStatement.setLong(3, value) case value: Double => preparedStatement.setDouble(2, value) preparedStatement.setDouble(3, value) 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 index 4cb89155f595a399c8fa0d8a51c8fdba198af679..e4ca4153889acc45b356b88c700cbec686f5f6b9 100644 --- a/src/main/scala/de/tobias/playpad/server/server/project/ProjectGet.scala +++ b/src/main/scala/de/tobias/playpad/server/server/project/ProjectGet.scala @@ -28,7 +28,7 @@ class ProjectGet(connection: Connection, sessionDao: Dao[Session, Int]) extends if (projects.size == 1) { val project = projects.head - if (project.accountId == s.getAccount.id) { + if (project.projectReference.accountId == s.getAccount.id) { val projectSaver = new ProjectSaver() return projectSaver.save(project) } diff --git a/src/main/scala/de/tobias/playpad/server/server/project/ProjectModificationGet.scala b/src/main/scala/de/tobias/playpad/server/server/project/ProjectModificationGet.scala new file mode 100644 index 0000000000000000000000000000000000000000..7991d4a0eec607a5a95e30391524c06843b891c0 --- /dev/null +++ b/src/main/scala/de/tobias/playpad/server/server/project/ProjectModificationGet.scala @@ -0,0 +1,42 @@ +package de.tobias.playpad.server.server.project + +import java.sql.Connection + +import com.google.gson.{JsonArray, JsonObject} +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.server.{Result, Status} +import spark.{Request, Response, Route} + +/** + * Created by tobias on 01.03.17. + */ +class ProjectModificationGet(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 projectLoader = new ProjectLoader(connection) + val projects = projectLoader.list(s.getAccount.id) + + val array = new JsonArray() + projects.foreach(projectReference => { + val json = new JsonObject() + json.addProperty("uuid", projectReference.id.toString) + json.addProperty("name", projectReference.name) + json.addProperty("last_modification", projectReference.lastModified) + json.addProperty("session", projectReference.session) + array.add(json) + }) + + array + case None => + new Result(Status.ERROR, "Session invalid") + } + } +} diff --git a/src/main/scala/de/tobias/playpad/server/server/project/ProjectPost.scala b/src/main/scala/de/tobias/playpad/server/server/project/ProjectPost.scala index 93fa8a7d65936affa8147f16fc681c5a1a5bf2d0..90fee8590e1102cdbecc886935e43dfdefc7922f 100644 --- a/src/main/scala/de/tobias/playpad/server/server/project/ProjectPost.scala +++ b/src/main/scala/de/tobias/playpad/server/server/project/ProjectPost.scala @@ -25,7 +25,7 @@ class ProjectPost(connection: Connection, sessionDao: Dao[Session, Int]) extends val projectLoader = new ProjectLoader val project = projectLoader.load(json) - project.accountId = s.getAccount.id + project.projectReference.accountId = s.getAccount.id val projectSaver = new ProjectSaver(connection) projectSaver.save(project) diff --git a/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala b/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala index a23c7c260f44484dfab953ae958c989f14ddce41..3e54d12751c40fbd654df65c0e7e07be31bd10d7 100644 --- a/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala +++ b/src/main/scala/de/tobias/playpad/server/server/project/sync/ProjectSyncHandler.scala @@ -1,11 +1,14 @@ package de.tobias.playpad.server.server.project.sync import java.sql.Connection +import java.util.UUID import com.google.gson.{JsonObject, JsonParser} import com.j256.ormlite.dao.Dao import de.tobias.playpad.server.account import de.tobias.playpad.server.account.Account +import de.tobias.playpad.server.project.utils.SqlDef +import de.tobias.playpad.server.server.SqlHelper import de.tobias.playpad.server.server.project.sync.listener.design.{DesignAddListener, DesignUpdateListener} import de.tobias.playpad.server.server.project.sync.listener.pad.{PadAddListener, PadClearListener, PadRemoveListener, PadUpdateListener} import de.tobias.playpad.server.server.project.sync.listener.page.{PageAddListener, PageRemoveListener, PageUpdateListener} @@ -81,21 +84,27 @@ import scala.collection.{Map, mutable} println(text) // Store in Database try { - // Push to clients val key = serverSession.getUpgradeRequest.getHeader(SESSION_KEY_HEADER) - if (key != null) { + val session = account.Session.getSession(key, sessionDao) + if (key != null) { val parser = new JsonParser() val json = parser.parse(text) json match { case json: JsonObject => - val session = account.Session.getSession(key, sessionDao) session match { case Some(s) => val cmd = json.get("cmd").getAsString if (listeners.contains(cmd)) { listeners(cmd).onChange(json, connection, s) } + + // Write last modification to project table + val timeStemp = json.get("time").getAsLong + val projectRef = UUID.fromString(json.get("project").getAsString) + SqlHelper.insertOrUpdate(connection, SqlDef.PROJECT, projectRef, SqlDef.PROJECT_LAST_MODIFIED, timeStemp) + SqlHelper.insertOrUpdate(connection, SqlDef.PROJECT, projectRef, SqlDef.PROJECT_SESSION_KEY, s.key) + case None => serverSession.close(500, "Invalid Session") } case _ => serverSession.close(500, "Invalid Data") @@ -104,7 +113,7 @@ import scala.collection.{Map, mutable} serverSession.close(500, "Invalid Key") } - val session = account.Session.getSession(key, sessionDao) + // Push to clients session match { case Some(s) => this.sessions(s.getAccount)