Skip to content
Snippets Groups Projects
Commit 364bec01 authored by Tobias Ullerich's avatar Tobias Ullerich
Browse files

Continiue on sync conflicts, add timezone to database connection

parent 843f25c2
No related branches found
No related tags found
No related merge requests found
Showing
with 95 additions and 26 deletions
......@@ -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)
......
......@@ -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] = _
......
......@@ -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 = _
}
......@@ -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)
......
......@@ -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()
......
......@@ -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()
......
......@@ -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
......
......@@ -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)
......
......@@ -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)
......
......@@ -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"
......
......@@ -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)
......
......@@ -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)
}
......
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")
}
}
}
......@@ -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)
......
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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment