Refactor DatabaseHandler to use an Entity for some code instead of manual operations

This commit is contained in:
ProtoByter 2022-12-07 08:09:14 +00:00
parent 3c999daebc
commit 3fc97ff6ea

View File

@ -8,6 +8,9 @@ package org.muellerssoftware.openproximitychat.tracker
import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
import org.h2.security.SHA3
import org.jetbrains.exposed.dao.UUIDEntity
import org.jetbrains.exposed.dao.UUIDEntityClass
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.UUIDTable
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
@ -29,6 +32,46 @@ class Client(
var sampledClients: List<UUID>
)
class ClientEntity(id: EntityID<UUID>): UUIDEntity(id) {
companion object : UUIDEntityClass<ClientEntity>(Clients)
var uuid by Clients.id
var name by Clients.name
var timeout by Clients.timeout
var ip by Clients.ip
var port by Clients.port
var passwordHash by Clients.passwordHash
var sampledClient1 by Clients.sampledClient1
var sampledClient2 by Clients.sampledClient2
var sampledClient3 by Clients.sampledClient3
var sampledClient4 by Clients.sampledClient4
var sampledClient5 by Clients.sampledClient5
var sampledClient6 by Clients.sampledClient6
var sampledClient7 by Clients.sampledClient7
var sampledClient8 by Clients.sampledClient8
fun toClient(): Client {
return Client(
uuid.value,
name,
timeout,
ip,
port,
passwordHash,
listOfNotNull(
sampledClient1,
sampledClient2,
sampledClient3,
sampledClient4,
sampledClient5,
sampledClient6,
sampledClient7,
sampledClient8
)
)
}
}
object Clients: UUIDTable() {
var name = varchar("name", 16)
var ip = varchar("ip", 21)
@ -95,9 +138,9 @@ object DatabaseHandler {
return pw
}
private fun checkTimeout(client: Client): Client? {
private fun checkTimeout(client: ClientEntity): ClientEntity? {
if (client.timeout < Instant.now()) {
removeClient(client.uuid)
client.delete()
return null
}
@ -105,29 +148,15 @@ object DatabaseHandler {
}
fun getClient(name: String): Client? {
val client = transaction {
Clients.select { Clients.name eq name }.map {
Client(it[Clients.id].value, it[Clients.name], it[Clients.timeout], it[Clients.ip], it[Clients.port], it[Clients.passwordHash], listOf(
it[Clients.sampledClient1],it[Clients.sampledClient2],it[Clients.sampledClient3],it[Clients.sampledClient4],
it[Clients.sampledClient5],it[Clients.sampledClient6],it[Clients.sampledClient7],it[Clients.sampledClient8]
))
}.firstOrNull()
} ?: return null
return checkTimeout(client)
return transaction {
ClientEntity.find { Clients.name eq name }.firstOrNull()
}?.let { checkTimeout(it) }?.toClient()
}
fun getClient(id: UUID): Client? {
val client = transaction {
Clients.select { Clients.id eq id }.map {
Client(it[Clients.id].value, it[Clients.name], it[Clients.timeout], it[Clients.ip], it[Clients.port], it[Clients.passwordHash], listOf(
it[Clients.sampledClient1],it[Clients.sampledClient2],it[Clients.sampledClient3],it[Clients.sampledClient4],
it[Clients.sampledClient5],it[Clients.sampledClient6],it[Clients.sampledClient7],it[Clients.sampledClient8]
))
}.firstOrNull()
} ?: return null
return checkTimeout(client)
return transaction {
ClientEntity.find { Clients.id eq id }.firstOrNull()
}?.let { checkTimeout(it) }?.toClient()
}
fun doHeartbeat(id: UUID): String {
@ -151,9 +180,11 @@ object DatabaseHandler {
}
fun checkCredentials(id: UUID, passwordHash: String): Boolean {
val client = getClient(id) ?: return false
val client = transaction {
ClientEntity.find { Clients.id eq id }.firstOrNull()
}?.let { checkTimeout(it) }
return if (checkTimeout(client) != null) {
return if (client != null) {
client.passwordHash == passwordHash
} else {
false