From 632609464179aba8de1483cf250a74f9a7261399 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Fri, 17 Feb 2017 22:03:36 +0100
Subject: [PATCH] Extracted account and sesison query from route handler into
 extra methods

---
 .../playpad/server/account/Account.scala      | 15 ++++++++-
 .../playpad/server/account/Session.scala      |  9 +++++
 .../server/server/account/AccountPut.scala    | 20 ++++++-----
 .../server/server/account/SessionDelete.scala | 24 +++++++-------
 .../server/server/account/SessionGet.scala    | 33 +++++++++----------
 .../server/server/account/SessionPost.scala   | 31 ++++++++---------
 .../server/server/project/ProjectGet.scala    | 31 +++++++++--------
 7 files changed, 96 insertions(+), 67 deletions(-)

diff --git a/src/main/scala/de/tobias/playpad/server/account/Account.scala b/src/main/scala/de/tobias/playpad/server/account/Account.scala
index 410d670..0172127 100644
--- a/src/main/scala/de/tobias/playpad/server/account/Account.scala
+++ b/src/main/scala/de/tobias/playpad/server/account/Account.scala
@@ -1,6 +1,6 @@
 package de.tobias.playpad.server.account
 
-import com.j256.ormlite.dao.ForeignCollection
+import com.j256.ormlite.dao.{Dao, ForeignCollection}
 import com.j256.ormlite.field.{DatabaseField, ForeignCollectionField}
 import com.j256.ormlite.table.DatabaseTable
 
@@ -36,4 +36,17 @@ import com.j256.ormlite.table.DatabaseTable
 		val state = Seq(id)
 		state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
 	}
+
+}
+
+object Account {
+	def getAccount(username: String, accountDao: Dao[Account, Int]): Option[Account] = {
+		val accountList = accountDao.queryForEq("username", username)
+		if (accountList.size() == 1) {
+			return Some(accountList.get(0))
+		}
+		None
+	}
 }
+
+
diff --git a/src/main/scala/de/tobias/playpad/server/account/Session.scala b/src/main/scala/de/tobias/playpad/server/account/Session.scala
index e3cbb65..80b46d2 100644
--- a/src/main/scala/de/tobias/playpad/server/account/Session.scala
+++ b/src/main/scala/de/tobias/playpad/server/account/Session.scala
@@ -2,6 +2,7 @@ package de.tobias.playpad.server.account
 
 import java.sql.Date
 
+import com.j256.ormlite.dao.Dao
 import com.j256.ormlite.field.DatabaseField
 import com.j256.ormlite.table.DatabaseTable
 
@@ -49,4 +50,12 @@ object Session {
 
 	val alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 	def generateKey(): String = (1 to length).map(_ => alpha(Random.nextInt.abs % alpha.length())).mkString
+
+	def getSession(sessionKey: String, sessionDao: Dao[Session, Int]): Option[Session] = {
+		val sessionList = sessionDao.queryForEq("key", sessionKey)
+		if (sessionList.size() == 1) {
+			return Some(sessionList.get(0))
+		}
+		None
+	}
 }
diff --git a/src/main/scala/de/tobias/playpad/server/server/account/AccountPut.scala b/src/main/scala/de/tobias/playpad/server/server/account/AccountPut.scala
index d8e7b63..43fa68c 100644
--- a/src/main/scala/de/tobias/playpad/server/server/account/AccountPut.scala
+++ b/src/main/scala/de/tobias/playpad/server/server/account/AccountPut.scala
@@ -19,15 +19,17 @@ class AccountPut(accountDao: Dao[Account, Int]) extends Route {
 			val oldPassword = request.queryMap().get("old_password").value
 			val newPassword = request.queryMap().get("new_password").value
 
-			val accounts = accountDao.queryForEq("username", username)
-
-			if (accounts.size() == 1) {
-				val account = accounts.get(0)
-				if (account.password.equals(oldPassword)) {
-					account.password = newPassword
-					accountDao.update(account)
-					return new Result(Status.OK)
-				}
+			val account = Account.getAccount(username, accountDao)
+			account match {
+				case Some(a) =>
+					if (a.password.equals(oldPassword)) {
+						a.password = newPassword
+						accountDao.update(a)
+						return new Result(Status.OK)
+					}
+					new Result(Status.ERROR, "Password invalid")
+				case None =>
+					new Result(Status.ERROR, "Account invalid")
 			}
 		} catch {
 			case e: SQLException => return new Result(Status.ERROR)
diff --git a/src/main/scala/de/tobias/playpad/server/server/account/SessionDelete.scala b/src/main/scala/de/tobias/playpad/server/server/account/SessionDelete.scala
index 69fd68d..644e668 100644
--- a/src/main/scala/de/tobias/playpad/server/server/account/SessionDelete.scala
+++ b/src/main/scala/de/tobias/playpad/server/server/account/SessionDelete.scala
@@ -15,18 +15,20 @@ class SessionDelete(accountDao: Dao[Account, Int]) extends Route {
 		val password = request.queryParams("password")
 		val key = request.queryParams("key")
 
-		// check account
-		val accounts = accountDao.queryForEq("username", username)
-		if (accounts.size() == 1) {
-			val account = accounts.get(0)
-			if (account.password.equals(password)) {
-				account.sessions.removeIf(s => s.key.equals(key))
-				accountDao.update(account)
-				return new Result(Status.OK, "deleted")
-			}
-		}
+		val account = Account.getAccount(username, accountDao)
+
+		account match {
+			case Some(a) =>
+				if (a.password.equals(password)) {
+					a.sessions.removeIf(s => s.key.equals(key))
+					accountDao.update(a)
+					return new Result(Status.OK, "deleted")
+				}
+				new Result(Status.ERROR, "Password invalid")
+			case None =>
+				new Result(Status.ERROR, "Account invalid")
 
-		new Result(Status.ERROR)
+		}
 	}
 
 }
diff --git a/src/main/scala/de/tobias/playpad/server/server/account/SessionGet.scala b/src/main/scala/de/tobias/playpad/server/server/account/SessionGet.scala
index 9ffe9e4..9382f46 100644
--- a/src/main/scala/de/tobias/playpad/server/server/account/SessionGet.scala
+++ b/src/main/scala/de/tobias/playpad/server/server/account/SessionGet.scala
@@ -15,24 +15,23 @@ class SessionGet(accountDao: Dao[Account, Int]) extends Route {
 		val username = request.queryParams("username")
 		val password = request.queryParams("password")
 
-		// check account
-		val accounts = accountDao.queryForEq("username", username)
-		if (accounts.size() == 1) {
-			val account = accounts.get(0)
-			if (account.password.equals(password)) {
+		val account = Account.getAccount(username, accountDao)
 
-				val array = new JsonArray
-				account.sessions.forEach(session => {
-					val jsonObj = new JsonObject
-					jsonObj.addProperty("key", session.key)
-					jsonObj.addProperty("createDate", session.createDate.getTime)
-					array.add(jsonObj)
-				})
-				return array
-			}
+		account match {
+			case Some(a) =>
+				if (a.password.equals(password)) {
+					val array = new JsonArray
+					a.sessions.forEach(session => {
+						val jsonObj = new JsonObject
+						jsonObj.addProperty("key", session.key)
+						jsonObj.addProperty("createDate", session.createDate.getTime)
+						array.add(jsonObj)
+					})
+					return array
+				}
+				new Result(Status.ERROR, "Password invalid")
+			case None =>
+				new Result(Status.ERROR, "Account invalid")
 		}
-
-		new Result(Status.ERROR)
 	}
-
 }
diff --git a/src/main/scala/de/tobias/playpad/server/server/account/SessionPost.scala b/src/main/scala/de/tobias/playpad/server/server/account/SessionPost.scala
index 1a00aab..7ae39fc 100644
--- a/src/main/scala/de/tobias/playpad/server/server/account/SessionPost.scala
+++ b/src/main/scala/de/tobias/playpad/server/server/account/SessionPost.scala
@@ -14,22 +14,23 @@ class SessionPost(accountDao: Dao[Account, Int]) extends Route {
 		val username = request.queryParams("username")
 		val password = request.queryParams("password")
 
-		// check account
-		val accounts = accountDao.queryForEq("username", username)
-		if (accounts.size() == 1) {
-			val account = accounts.get(0)
-			if (account.password.equals(password)) {
-
-				val randomKey = Session.generateKey()
-				val session = new Session(account, randomKey)
-
-				account.sessions.add(session)
-				accountDao.update(account)
-				return new SessionPostResult(Status.OK, randomKey)
-			}
+		val account = Account.getAccount(username, accountDao)
+
+		account match {
+			case Some(a) =>
+				if (a.password.equals(password)) {
+
+					val randomKey = Session.generateKey()
+					val session = new Session(a, randomKey)
+
+					a.sessions.add(session)
+					accountDao.update(a)
+					return new SessionPostResult(Status.OK, randomKey)
+				}
+				new Result(Status.ERROR, "Password invalid")
+			case None =>
+				new Result(Status.ERROR, "Account invalid")
 		}
-
-		new Result(Status.ERROR)
 	}
 
 	private class SessionPostResult {
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 ffb8684..8cf5aef 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
@@ -5,7 +5,7 @@ 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.loader.sql.ProjectLoader
 import de.tobias.playpad.server.project.saver.json.ProjectSaver
 import de.tobias.playpad.server.server.{Result, Status}
 import spark.{Request, Response, Route}
@@ -19,21 +19,24 @@ class ProjectGet(connection: Connection, sessionDao: Dao[Session, Int]) extends
 		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)
+		val session = Session.getSession(sessionKey, sessionDao)
+
+		session match {
+			case Some(s) =>
+				val projectLoader = new ProjectLoader()
+				val projects = projectLoader.load(connection, UUID.fromString(projectId))
+
+				if (projects.size == 1) {
+					val project = projects.head
+					if (project.accountId == s.getAccount.id) {
+						val projectSaver = new ProjectSaver()
+						return projectSaver.save(project)
+					}
 				}
-			}
+				new Result(Status.ERROR, "Project invalid")
+			case None =>
+				new Result(Status.ERROR, "Session invalid")
 		}
-		new Result(Status.ERROR, "Session invalid")
 	}
 
 }
-- 
GitLab