diff --git a/WebsiteBackend/src/de/steamwar/Application.kt b/WebsiteBackend/src/de/steamwar/Application.kt index e49b9a9d..9853d4ab 100644 --- a/WebsiteBackend/src/de/steamwar/Application.kt +++ b/WebsiteBackend/src/de/steamwar/Application.kt @@ -20,12 +20,9 @@ package de.steamwar import de.steamwar.plugins.configurePlugins -import de.steamwar.routes.ResponseUser -import de.steamwar.routes.SchematicCode import io.ktor.server.application.* import io.ktor.server.engine.* import de.steamwar.routes.configureRoutes -import de.steamwar.sql.SchematicType import de.steamwar.sql.SteamwarUser import io.ktor.server.netty.* import kotlinx.serialization.ExperimentalSerializationApi @@ -47,7 +44,6 @@ fun main() { Thread { while (true) { Thread.sleep(1000 * 10) - ResponseUser.clearCache() SteamwarUser.clear() } }.start() diff --git a/WebsiteBackend/src/de/steamwar/routes/AuditLog.kt b/WebsiteBackend/src/de/steamwar/routes/AuditLog.kt index 27a59c72..cafd8d48 100644 --- a/WebsiteBackend/src/de/steamwar/routes/AuditLog.kt +++ b/WebsiteBackend/src/de/steamwar/routes/AuditLog.kt @@ -48,6 +48,7 @@ import java.time.Instant fun Route.configureAuditLog() { route("/auditlog") { install(SWPermissionCheck) { + mustAuth = true permission = UserPerm.MODERATION } @@ -55,13 +56,13 @@ fun Route.configureAuditLog() { val text = call.request.queryParameters["fullText"] val actionText = call.request.queryParameters["actionText"] val serverText = call.request.queryParameters["server"] - val actor = call.request.queryParameters.getAll("actor")?.toSet() + val actor = call.request.queryParameters.getAll("actor")?.map { it.toInt() }?.toSet() val actionType = call.request.queryParameters.getAll("actionType")?.map { AuditLog.Type.valueOf(it) }?.toSet() val timeGreater = call.request.queryParameters["timeGreater"]?.let { Instant.ofEpochMilli(it.toLong()) } val timeLess = call.request.queryParameters["timeLess"]?.let { Instant.ofEpochMilli(it.toLong()) } - val serverOwner = call.request.queryParameters.getAll("serverOwner")?.toSet() + val serverOwner = call.request.queryParameters.getAll("serverOwner")?.map { it.toInt() }?.toSet() val velocity = call.request.queryParameters["velocity"]?.toBoolean() val page = call.request.queryParameters["page"]?.toIntOrNull() ?: 0 @@ -96,11 +97,11 @@ data class PagedAuditLog(val rows: Long, val entries: List) { actionText: String? = null, serverText: String? = null, fullText: String? = null, - actor: Set? = null, + actor: Set? = null, actionType: Set? = null, timeGreater: Instant? = null, timeLess: Instant? = null, - serverOwner: Set? = null, + serverOwner: Set? = null, velocity: Boolean? = null, page: Int = 0, limit: Int = 100, @@ -139,7 +140,7 @@ data class PagedAuditLog(val rows: Long, val entries: List) { query.andWhere { (AuditLogTable.actionText like "%$it%") or (AuditLogTable.server like "%$it%") } } - actor?.let { query.andWhere { actorTable[SteamwarUserTable.uuid] inList actor } } + actor?.let { query.andWhere { AuditLogTable.actor inList actor } } actionType?.let { query.andWhere { AuditLogTable.action inList actionType } } @@ -147,7 +148,7 @@ data class PagedAuditLog(val rows: Long, val entries: List) { timeLess?.let { query.andWhere { AuditLogTable.time less timeLess } } - serverOwner?.let { query.andWhere { serverOwnerTable[SteamwarUserTable.uuid] inList serverOwner } } + serverOwner?.let { query.andWhere { AuditLogTable.serverOwner inList serverOwner } } if (velocity == true) query.andWhere { AuditLogTable.serverOwner.isNull() } diff --git a/WebsiteBackend/src/de/steamwar/routes/Auth.kt b/WebsiteBackend/src/de/steamwar/routes/Auth.kt index 19f300f0..4710bd5b 100644 --- a/WebsiteBackend/src/de/steamwar/routes/Auth.kt +++ b/WebsiteBackend/src/de/steamwar/routes/Auth.kt @@ -66,7 +66,7 @@ fun Route.configureAuth() { } call.sessions.set(SWUserSession(user.getId())) - call.respond(ResponseUser.get(user)) + call.respond(ResponseUser(user)) } delete { @@ -100,7 +100,7 @@ fun Route.configureAuth() { } call.sessions.set(SWUserSession(user.getId())) - call.respond(ResponseUser.get(user)) + call.respond(ResponseUser(user)) } } } diff --git a/WebsiteBackend/src/de/steamwar/routes/Data.kt b/WebsiteBackend/src/de/steamwar/routes/Data.kt index 9cc7be0c..4c86d32f 100644 --- a/WebsiteBackend/src/de/steamwar/routes/Data.kt +++ b/WebsiteBackend/src/de/steamwar/routes/Data.kt @@ -44,28 +44,8 @@ import java.util.* data class ResponseSchematicType(val name: String, val db: String) @Serializable -data class ResponseUser(val name: String, val uuid: String, val prefix: String, val perms: List) { - private constructor(user: SteamwarUser) : this(user.userName, user.uuid.toString(), user.prefix().chatPrefix, user.perms().filter { !it.name.startsWith("PREFIX_") }.map { it.name }) - - companion object { - private val cache = mutableMapOf() - - fun get(id: Int): ResponseUser { - synchronized(cache) { - return cache[id] ?: ResponseUser(SteamwarUser.byId(id)!!).also { cache[id] = it } - } - } - - fun get(user: SteamwarUser): ResponseUser = synchronized(cache) { - return cache[user.getId()] ?: ResponseUser(user).also { cache[user.getId()] = it } - } - - fun clearCache() { - synchronized(cache) { - cache.clear() - } - } - } +data class ResponseUser(val name: String, val uuid: String) { + constructor(user: SteamwarUser) : this(user.userName, user.uuid.toString()) } fun Route.configureDataRoutes() { @@ -76,7 +56,13 @@ fun Route.configureDataRoutes() { permission = UserPerm.MODERATION } get("/users") { - call.respond(useDb { SteamwarUser.all().map { ResponseUser.get(it) } }) + val name = call.request.queryParameters["name"] + + val limit = call.request.queryParameters["limit"]?.toIntOrNull() ?: 100 + val page = call.request.queryParameters["page"]?.toIntOrNull() ?: 0 + + val includePerms = call.request.queryParameters["includePerms"]?.toBoolean() ?: false + val includeId = call.request.queryParameters["includeId"]?.toBoolean() ?: false } get("/teams") { call.respond(Team.getAll().map { ResponseTeam(it) }) @@ -119,7 +105,7 @@ fun Route.configureDataRoutes() { listOf(UserPerm.PREFIX_ADMIN, UserPerm.PREFIX_DEVELOPER, UserPerm.PREFIX_MODERATOR, UserPerm.PREFIX_SUPPORTER, UserPerm.PREFIX_BUILDER) .associateWith { SteamwarUser.getUsersWithPerm(it) } .mapKeys { UserPerm.prefixes[it.key]!!.chatPrefix } - .mapValues { it.value.map { ResponseUser.get(it) } } + .mapValues { it.value.map { ResponseUser(it) } } ) } get("/skin/{uuid}") { @@ -138,7 +124,7 @@ fun Route.configureDataRoutes() { route("/me") { install(SWPermissionCheck) get { - call.respond(ResponseUser.get(call.principal()!!.user)) + call.respond(ResponseUser(call.principal()!!.user)) } } } diff --git a/WebsiteBackend/src/de/steamwar/routes/EventReferees.kt b/WebsiteBackend/src/de/steamwar/routes/EventReferees.kt index 4997b1fa..0c8bbf3b 100644 --- a/WebsiteBackend/src/de/steamwar/routes/EventReferees.kt +++ b/WebsiteBackend/src/de/steamwar/routes/EventReferees.kt @@ -31,7 +31,7 @@ fun Route.configureEventRefereesRouting() { route("/referees") { get { val event = call.receiveEvent() ?: return@get - call.respond(Referee.get(event.eventID).map { ResponseUser.get(SteamwarUser.byId(it)!!) }) + call.respond(Referee.get(event.eventID).map { ResponseUser(SteamwarUser.byId(it)!!) }) } put { val event = call.receiveEvent() ?: return@put @@ -39,7 +39,7 @@ fun Route.configureEventRefereesRouting() { referees.forEach { Referee.add(event.eventID, SteamwarUser.get(UUID.fromString(it))!!.getId()) } - call.respond(Referee.get(event.eventID).map { ResponseUser.get(SteamwarUser.byId(it)!!) }) + call.respond(Referee.get(event.eventID).map { ResponseUser(SteamwarUser.byId(it)!!) }) } delete { val event = call.receiveEvent() ?: return@delete @@ -47,7 +47,7 @@ fun Route.configureEventRefereesRouting() { referees.forEach { Referee.remove(event.eventID, SteamwarUser.get(UUID.fromString(it))!!.getId()) } - call.respond(Referee.get(event.eventID).map { ResponseUser.get(SteamwarUser.byId(it)!!) }) + call.respond(Referee.get(event.eventID).map { ResponseUser(SteamwarUser.byId(it)!!) }) } } } \ No newline at end of file diff --git a/WebsiteBackend/src/de/steamwar/routes/Events.kt b/WebsiteBackend/src/de/steamwar/routes/Events.kt index e82fc495..2c76498b 100644 --- a/WebsiteBackend/src/de/steamwar/routes/Events.kt +++ b/WebsiteBackend/src/de/steamwar/routes/Events.kt @@ -118,7 +118,7 @@ data class ExtendedResponseEvent( TeamTeilnahme.getTeams(event.eventID).map { ResponseTeam(it) }, EventGroup.get(event).map { ResponseGroups(it) }, EventFight.getEvent(event.eventID).map { ResponseEventFight(it) }, - Referee.get(event.eventID).map { ResponseUser.get(SteamwarUser.byId(it)!!) }, + Referee.get(event.eventID).map { ResponseUser(SteamwarUser.byId(it)!!) }, EventRelation.get(event).map { ResponseRelation(it) } ) } diff --git a/WebsiteBackend/src/de/steamwar/routes/Schematic.kt b/WebsiteBackend/src/de/steamwar/routes/Schematic.kt index d1ada3fa..0e8ef701 100644 --- a/WebsiteBackend/src/de/steamwar/routes/Schematic.kt +++ b/WebsiteBackend/src/de/steamwar/routes/Schematic.kt @@ -34,9 +34,7 @@ import io.ktor.server.response.* import io.ktor.server.routing.* import kotlinx.serialization.Serializable import java.io.BufferedInputStream -import java.io.ByteArrayInputStream import java.io.DataInputStream -import java.io.InputStream import java.security.MessageDigest import java.time.Duration import java.time.Instant @@ -49,16 +47,6 @@ data class ResponseSchematic(val name: String, val id: Int, val type: String?, v constructor(node: SchematicNode) : this(node.name, node.getId(), node.schemtype?.name(), node.owner, node.item, node.lastUpdate.time, node.rank, node.replaceColor(), node.allowReplay()) } -@Serializable -data class ResponseSchematicLong(val members: List, val path: String, val schem: ResponseSchematic) { - constructor(node: SchematicNode, path: String): this(NodeMember.getNodeMembers(node.getId()).map { ResponseUser.get(it.member) }, path, ResponseSchematic(node)) -} - -@Serializable -data class ResponseSchematicList(val breadcrumbs: List, val schematics: List, val players: Map) { - constructor(schematics: List, breadcrumbs: List) : this(breadcrumbs, schematics, schematics.map { it.owner }.distinct().map { ResponseUser.get(it) }.associateBy { it.uuid }) -} - @Serializable data class ResponseBreadcrumb(val name: String, val id: Int) diff --git a/WebsiteBackend/src/de/steamwar/routes/UserPerms.kt b/WebsiteBackend/src/de/steamwar/routes/UserPerms.kt index 6ed092a4..1c3987a7 100644 --- a/WebsiteBackend/src/de/steamwar/routes/UserPerms.kt +++ b/WebsiteBackend/src/de/steamwar/routes/UserPerms.kt @@ -23,11 +23,17 @@ import de.steamwar.plugins.SWPermissionCheck import de.steamwar.plugins.getUser import de.steamwar.sql.SteamwarUser import de.steamwar.sql.UserPerm -import io.ktor.http.* -import io.ktor.server.application.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlinx.serialization.Serializable +import io.ktor.http.HttpStatusCode +import io.ktor.server.application.ApplicationCall +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.response.respond +import io.ktor.server.routing.Route +import io.ktor.server.routing.delete +import io.ktor.server.routing.get +import io.ktor.server.routing.put +import io.ktor.server.routing.route +import kotlinx.serialization.Serializable; @Serializable data class RespondPrefix(val name: String, val colorCode: String, val chatPrefix: String) @@ -76,7 +82,12 @@ fun Route.configureUserPerms() { val prefixs = UserPerm.prefixes[prefix]!! - call.respond(RespondUserPermsPrefix(RespondPrefix(prefix.name, prefixs.colorCode, prefixs.chatPrefix), perms)) + call.respond( + RespondUserPermsPrefix( + RespondPrefix(prefix.name, prefixs.colorCode, prefixs.chatPrefix), + perms + ) + ) } put("/prefix/{prefix}") { val (user, prefix) = call.receivePermission("prefix", isPrefix = true) ?: return@put @@ -112,7 +123,10 @@ fun Route.configureUserPerms() { } } -suspend fun ApplicationCall.receivePermission(fieldName: String = "perm", isPrefix: Boolean = false): Pair? { +suspend fun ApplicationCall.receivePermission( + fieldName: String = "perm", + isPrefix: Boolean = false +): Pair? { val user = request.getUser() if (user == null) { respond(HttpStatusCode.BadRequest)