From 07bea0dacdb55ccce8a546886564e80cd61ca115 Mon Sep 17 00:00:00 2001 From: TheSaminator Date: Sat, 12 Feb 2022 09:52:46 -0500 Subject: [PATCH] Add new-users page --- .../starshipfights/data/auth/user_sessions.kt | 1 + .../starshipfights/data/data_documents.kt | 17 +++++++---- .../starshipfights/info/endpoints_info.kt | 4 +++ .../kotlin/starshipfights/info/view_nav.kt | 1 + .../kotlin/starshipfights/info/views_main.kt | 29 +++++++++++++++++++ 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt b/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt index 467f0d6..7fdeed5 100644 --- a/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt +++ b/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt @@ -35,6 +35,7 @@ data class User( companion object Table : DocumentTable by DocumentTable.create({ unique(User::discordId) + index(User::registeredAt) }) } diff --git a/src/jvmMain/kotlin/starshipfights/data/data_documents.kt b/src/jvmMain/kotlin/starshipfights/data/data_documents.kt index f1631c4..dd5cbc6 100644 --- a/src/jvmMain/kotlin/starshipfights/data/data_documents.kt +++ b/src/jvmMain/kotlin/starshipfights/data/data_documents.kt @@ -45,8 +45,9 @@ interface DocumentTable> { suspend fun del(id: Id) suspend fun all(): Flow - suspend fun select(bson: Bson): Flow - suspend fun locate(bson: Bson): T? + suspend fun select(where: Bson): Flow + suspend fun sorted(order: Bson): Flow + suspend fun locate(where: Bson): T? suspend fun update(where: Bson, set: Bson) suspend fun remove(where: Bson) @@ -105,12 +106,16 @@ private class DocumentTableImpl>(val kclass: KClass, priv return collection().find().toFlow() } - override suspend fun select(bson: Bson): Flow { - return collection().find(bson).toFlow() + override suspend fun select(where: Bson): Flow { + return collection().find(where).toFlow() } - override suspend fun locate(bson: Bson): T? { - return collection().findOne(bson) + override suspend fun sorted(order: Bson): Flow { + return collection().find().sort(order).toFlow() + } + + override suspend fun locate(where: Bson): T? { + return collection().findOne(where) } override suspend fun update(where: Bson, set: Bson) { diff --git a/src/jvmMain/kotlin/starshipfights/info/endpoints_info.kt b/src/jvmMain/kotlin/starshipfights/info/endpoints_info.kt index 55ea72c..46ad094 100644 --- a/src/jvmMain/kotlin/starshipfights/info/endpoints_info.kt +++ b/src/jvmMain/kotlin/starshipfights/info/endpoints_info.kt @@ -28,6 +28,10 @@ fun Routing.installPages() { call.respondHtml(HttpStatusCode.OK, call.aboutPage()) } + get("/users") { + call.respondHtml(HttpStatusCode.OK, call.newUsersPage()) + } + // Random name generation get("/generate-name/{flavor}/{gender}") { val flavor = call.parameters["flavor"]?.let { flavor -> AdmiralNameFlavor.values().singleOrNull { it.toUrlSlug() == flavor.lowercase() } }!! diff --git a/src/jvmMain/kotlin/starshipfights/info/view_nav.kt b/src/jvmMain/kotlin/starshipfights/info/view_nav.kt index 77b9717..7cf3f67 100644 --- a/src/jvmMain/kotlin/starshipfights/info/view_nav.kt +++ b/src/jvmMain/kotlin/starshipfights/info/view_nav.kt @@ -33,6 +33,7 @@ suspend fun ApplicationCall.standardNavBar(): List = listOf( NavLink("/", "Main Page"), NavLink("/info", "Read Manual"), NavLink("/about", "About Starship Fights"), + NavLink("/users", "New Users"), NavHead("Your Account"), ) + when (val user = getUser()) { null -> listOf( diff --git a/src/jvmMain/kotlin/starshipfights/info/views_main.kt b/src/jvmMain/kotlin/starshipfights/info/views_main.kt index e58b0d1..fcb89f5 100644 --- a/src/jvmMain/kotlin/starshipfights/info/views_main.kt +++ b/src/jvmMain/kotlin/starshipfights/info/views_main.kt @@ -1,7 +1,11 @@ package starshipfights.info import io.ktor.application.* +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.flow.toList import kotlinx.html.* +import org.litote.kmongo.descending +import starshipfights.data.auth.User suspend fun ApplicationCall.mainPage(): HTML.() -> Unit { return page(null, standardNavBar(), IndexSidebar) { @@ -35,3 +39,28 @@ suspend fun ApplicationCall.aboutPage(): HTML.() -> Unit = page("About", standar } } } + +suspend fun ApplicationCall.newUsersPage(): HTML.() -> Unit { + val newUsers = User.sorted(descending(User::registeredAt)).take(20).toList() + + return page("New Users", standardNavBar(), IndexSidebar) { + section { + h1 { +"New Users" } + } + div { + style = "text-align:center" + newUsers.forEach { newUser -> + div { + style = "display:inline-block;width:24%" + img(src = newUser.discordAvatarUrl) { style = "width:100%" } + p { + style = "text-align:center" + a(href = "/user/${newUser.id}") { + +newUser.profileName + } + } + } + } + } + } +} -- 2.25.1