}
interface DocumentTable<T : DataDocument<T>> {
+ fun initialize()
+
suspend fun index(vararg properties: KProperty1<T, *>)
suspend fun unique(vararg properties: KProperty1<T, *>)
logger.error("Caught unhandled exception from initializing $name!", ex)
}
- fun <T : DataDocument<T>> create(kclass: KClass<T>, initFunc: suspend DocumentTable<T>.() -> Unit = {}): DocumentTable<T> = DocumentTableImpl(kclass).also {
- launch { it.initFunc() }
+ fun <T : DataDocument<T>> create(kclass: KClass<T>, initFunc: suspend DocumentTable<T>.() -> Unit = {}): DocumentTable<T> = DocumentTableImpl(kclass) {
+ runBlocking {
+ it.initFunc()
+ }
}
inline fun <reified T : DataDocument<T>> create(noinline initFunc: suspend DocumentTable<T>.() -> Unit = {}) = create(T::class, initFunc)
}
}
-private class DocumentTableImpl<T : DataDocument<T>>(val kclass: KClass<T>) : DocumentTable<T> {
+private class DocumentTableImpl<T : DataDocument<T>>(val kclass: KClass<T>, private val initFunc: (DocumentTable<T>) -> Unit) : DocumentTable<T> {
private var collection: CoroutineCollection<T>? = null
suspend fun collection() =
collection
collection = it
}
+ override fun initialize() {
+ initFunc(this)
+ }
+
override suspend fun index(vararg properties: KProperty1<T, *>) {
collection().ensureIndex(*properties)
}
import kotlinx.coroutines.*
import org.litote.kmongo.lte
+import starshipfights.data.admiralty.Admiral
+import starshipfights.data.admiralty.BattleRecord
+import starshipfights.data.admiralty.ShipInDrydock
+import starshipfights.data.auth.User
import starshipfights.data.auth.UserSession
import starshipfights.sfLogger
import kotlin.coroutines.CoroutineContext
sfLogger.error("Caught unhandled exception in $coroutine", ex)
}
- fun initializeRoutines() = launch {
- launch {
- while (currentCoroutineContext().isActive) {
- launch {
- UserSession.remove(UserSession::expirationMillis lte System.currentTimeMillis())
+ fun initializeRoutines(): Job {
+ // Initialize tables by referring to them
+ Admiral.initialize()
+ BattleRecord.initialize()
+ ShipInDrydock.initialize()
+ User.initialize()
+ UserSession.initialize()
+
+ return launch {
+ launch {
+ while (currentCoroutineContext().isActive) {
+ launch {
+ UserSession.remove(UserSession::expirationMillis lte System.currentTimeMillis())
+ }
+ delay(3600_000)
}
- delay(3600_000)
}
}
}