Don't keep bothering database/NSAPI in case of anonymous user
authorLanius Trolling <lanius@laniustrolling.dev>
Thu, 2 Mar 2023 16:04:10 +0000 (11:04 -0500)
committerLanius Trolling <lanius@laniustrolling.dev>
Thu, 2 Mar 2023 16:04:10 +0000 (11:04 -0500)
src/main/kotlin/info/mechyrdia/data/nations.kt

index c808d9e5afbe2a00204a97ddea37e51e1a5e14d2..417836a5e45dcfd1ae142ad575623085d80d91c9 100644 (file)
@@ -58,12 +58,28 @@ suspend fun MutableMap<Id<NationData>, NationData>.getNation(id: Id<NationData>)
        }
 }
 
-val CallCurrentNationAttribute = AttributeKey<NationData>("CurrentNation")
+private val callCurrentNationAttribute = AttributeKey<NationSession>("CurrentNation")
 
 suspend fun ApplicationCall.currentNation(): NationData? {
-       attributes.getOrNull(CallCurrentNationAttribute)?.let { return it }
+       attributes.getOrNull(callCurrentNationAttribute)?.let { sess ->
+               return when (sess) {
+                       NationSession.Anonymous -> null
+                       is NationSession.LoggedIn -> sess.nation
+               }
+       }
+       
+       val nationId = sessions.get<UserSession>()?.nationId
+       return if (nationId == null) {
+               attributes.put(callCurrentNationAttribute, NationSession.Anonymous)
+               null
+       } else nationCache.getNation(nationId).also { data ->
+               attributes.put(callCurrentNationAttribute, NationSession.LoggedIn(data))
+       }
+}
+
+private sealed interface NationSession {
+       object Anonymous : NationSession
        
-       return sessions.get<UserSession>()?.nationId?.let { id ->
-               nationCache.getNation(id)
-       }?.also { attributes.put(CallCurrentNationAttribute, it) }
+       @JvmInline
+       value class LoggedIn(val nation: NationData) : NationSession
 }