object DatabaseConnection {
private val Connection = ...
private object PasswordDevice {
def check(pw1: String, pw2: String) = ...
def encrypt(password: String) = ...
}
object LoginDevice {
private val GetUserStatement = Connection.prepareStatement("SELECT Name, Password, ... FROM Users WHERE UPPER(Name) = UPPER(?)")
def login(username: String, password: String) = {
GetUserStatement.setString(1, username)
val userResult = GetUserStatement.executeQuery
if ( !userResult.next )
throw User.NotFoundException
if ( !PasswordDevice.check(password, userResult.getString("Password")) )
throw User.WrongPasswordException
new User(userResult.getString("Name"), ...)
}
}
object RegisterDevice {
private val RegisterStatement = Connection.prepareStatement("SELECT Name, Password, ... FROM Users WHERE UPPER(Name) = UPPER(?)")
private val GetKeyStatement = Connection.prepareStatement("SELECT Key FROM Keys WHERE Key = ?")
private val InsertStatement = Connection.prepareStatement(s"INSERT INTO Users VALUES(?, ?, ...)")
private val DeleteKeyStatement = Connection.prepareStatement("DELETE FROM Keys WHERE Key = ?")
def register(name: String, password: String, key: String) = {
RegisterStatement.setString(1, name)
GetKeyStatement.setString(1, key)
val userExistsResult = RegisterStatement.executeQuery
val keyValidResult = GetKeyStatement.executeQuery
if ( userExistsResult.next ) throw User.AlreadyExistsException
if ( !keyValidResult.next ) throw User.InvalidKeyException
InsertStatement.setString(1, name)
InsertStatement.setString(2, PasswordDevice.encrypt(password))
InsertStatement.executeUpdate()
DeleteKeyStatement.setString(1, key)
DeleteKeyStatement.executeUpdate()
new User(name, ...)
}
}
object RequestDevice {
private val RequestStatement = Connection.prepareStatement("SELECT Request.* FROM Request WHERE ID = ?")
def request(id: String) = {
RequestStatement.setString(1, id)
val result = RequestStatement.executeQuery
if(!result.next)
throw Request.InvalidIDException
new DataElement(result.getString("ID"), ...)
}
}
...
}