From 6e9c3d718ff1bdf727c4b49ac2e93149511661f5 Mon Sep 17 00:00:00 2001 From: Michael Markl Date: Fri, 3 Mar 2023 18:06:20 +0100 Subject: [PATCH 1/3] Order regions and admins --- .../schema/ViewAdministratorsQueryService.kt | 20 ++++++++++++------- .../database/repos/RegionsRepository.kt | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/backend/src/main/kotlin/app/ehrenamtskarte/backend/auth/webservice/schema/ViewAdministratorsQueryService.kt b/backend/src/main/kotlin/app/ehrenamtskarte/backend/auth/webservice/schema/ViewAdministratorsQueryService.kt index 871f0aae0..8f465c5d5 100644 --- a/backend/src/main/kotlin/app/ehrenamtskarte/backend/auth/webservice/schema/ViewAdministratorsQueryService.kt +++ b/backend/src/main/kotlin/app/ehrenamtskarte/backend/auth/webservice/schema/ViewAdministratorsQueryService.kt @@ -9,10 +9,13 @@ import app.ehrenamtskarte.backend.common.webservice.UnauthorizedException import app.ehrenamtskarte.backend.projects.database.ProjectEntity import app.ehrenamtskarte.backend.projects.database.Projects import app.ehrenamtskarte.backend.regions.database.RegionEntity +import app.ehrenamtskarte.backend.regions.database.Regions import com.expediagroup.graphql.generator.annotations.GraphQLDescription import graphql.schema.DataFetchingEnvironment +import org.jetbrains.exposed.sql.SortOrder import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.not +import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.transaction @Suppress("unused") @@ -36,7 +39,7 @@ class ViewAdministratorsQueryService { @GraphQLDescription("Returns all administrators in a project. This query requires the role PROJECT_ADMIN.") fun getUsersInProject( project: String, - dfe: DataFetchingEnvironment + dfe: DataFetchingEnvironment, ): List { val context = dfe.getContext() val jwtPayload = context.enforceSignedIn() @@ -47,9 +50,11 @@ class ViewAdministratorsQueryService { if (!Authorizer.mayViewUsersInProject(admin, projectId)) { throw UnauthorizedException() } - val administrators = - AdministratorEntity.find { Administrators.projectId eq projectId and not(Administrators.deleted) } - + val administrators = (Administrators innerJoin Regions) + .slice(Administrators.columns) + .select { Administrators.projectId eq projectId and not(Administrators.deleted) } + .orderBy(Regions.name to SortOrder.ASC, Administrators.email to SortOrder.ASC) + .let { AdministratorEntity.wrapRows(it) } administrators.map { Administrator.fromDbEntity(it) } } } @@ -57,7 +62,7 @@ class ViewAdministratorsQueryService { @GraphQLDescription("Returns all administrators in a region. This query requires the role REGION_ADMIN or PROJECT_ADMIN.") fun getUsersInRegion( regionId: Int, - dfe: DataFetchingEnvironment + dfe: DataFetchingEnvironment, ): List { val context = dfe.getContext() val jwtPayload = context.enforceSignedIn() @@ -68,8 +73,9 @@ class ViewAdministratorsQueryService { if (!Authorizer.mayViewUsersInRegion(admin, region)) { throw UnauthorizedException() } - val administrators = - AdministratorEntity.find { Administrators.regionId eq regionId and not(Administrators.deleted) } + val administrators = AdministratorEntity + .find { Administrators.regionId eq regionId and not(Administrators.deleted) } + .orderBy(Administrators.email to SortOrder.ASC) administrators.map { Administrator.fromDbEntity(it) } } diff --git a/backend/src/main/kotlin/app/ehrenamtskarte/backend/regions/database/repos/RegionsRepository.kt b/backend/src/main/kotlin/app/ehrenamtskarte/backend/regions/database/repos/RegionsRepository.kt index 37de48559..b5e3033dd 100644 --- a/backend/src/main/kotlin/app/ehrenamtskarte/backend/regions/database/repos/RegionsRepository.kt +++ b/backend/src/main/kotlin/app/ehrenamtskarte/backend/regions/database/repos/RegionsRepository.kt @@ -4,6 +4,7 @@ import app.ehrenamtskarte.backend.common.database.sortByKeys import app.ehrenamtskarte.backend.projects.database.Projects import app.ehrenamtskarte.backend.regions.database.RegionEntity import app.ehrenamtskarte.backend.regions.database.Regions +import org.jetbrains.exposed.sql.SortOrder import org.jetbrains.exposed.sql.and import org.jetbrains.exposed.sql.select @@ -13,6 +14,7 @@ object RegionsRepository { val query = (Projects innerJoin Regions) .slice(Regions.columns) .select { Projects.project eq project } + .orderBy(Regions.name to SortOrder.ASC) return RegionEntity.wrapRows(query).toList() } From 1f95a1869ee874925b49953d7fadbdf481faaf85 Mon Sep 17 00:00:00 2001 From: Michael Markl Date: Fri, 3 Mar 2023 18:06:54 +0100 Subject: [PATCH 2/3] Start webservice only once all handlers are configured. --- .../backend/common/webservice/WebService.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/webservice/WebService.kt b/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/webservice/WebService.kt index cb348694e..9e8db6e44 100644 --- a/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/webservice/WebService.kt +++ b/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/webservice/WebService.kt @@ -45,10 +45,7 @@ class WebService { it.hostedPath = "/graphiql" it.location = Location.CLASSPATH } - }.start(host, port) - - println("Server is running at http://$host:$port") - println("Goto http://$host:$port/graphiql/ for a graphical editor") + } val graphQLHandler = GraphQLHandler(config) val mapStyleHandler = MapStyleHandler(config) @@ -73,5 +70,9 @@ class WebService { app.get(applicationHandler.getPath()) { ctx -> applicationHandler.handle(ctx) } + + app.start(host, port) + println("Server is running at http://$host:$port") + println("Goto http://$host:$port/graphiql/ for a graphical editor") } } From a521d92944d1481cb1ccb35fa683a43df539ef8b Mon Sep 17 00:00:00 2001 From: Michael Markl Date: Fri, 3 Mar 2023 18:07:18 +0100 Subject: [PATCH 3/3] Log all SQL queries in dev mode --- .../backend/common/database/Database.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/database/Database.kt b/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/database/Database.kt index ed2b4865c..3278b5de1 100644 --- a/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/database/Database.kt +++ b/backend/src/main/kotlin/app/ehrenamtskarte/backend/common/database/Database.kt @@ -4,8 +4,8 @@ import app.ehrenamtskarte.backend.auth.database.repos.AdministratorsRepository import app.ehrenamtskarte.backend.auth.webservice.schema.types.Role import app.ehrenamtskarte.backend.config.BackendConfiguration import org.jetbrains.exposed.sql.Database.Companion.connect +import org.jetbrains.exposed.sql.DatabaseConfig import org.jetbrains.exposed.sql.StdOutSqlLogger -import org.jetbrains.exposed.sql.addLogger import org.jetbrains.exposed.sql.transactions.TransactionManager import org.jetbrains.exposed.sql.transactions.transaction import java.io.BufferedReader @@ -38,7 +38,7 @@ class Database { email: String, password: String, roleDbValue: String, - projectId: Int? = null + projectId: Int? = null, ) { val role = Role.fromDbValue(roleDbValue) transaction { @@ -51,14 +51,16 @@ class Database { config.postgres.url, driver = "org.postgresql.Driver", user = config.postgres.user, - password = config.postgres.password + password = config.postgres.password, + databaseConfig = if (config.production) { + null + } else { + DatabaseConfig.invoke { + this.sqlLogger = StdOutSqlLogger + } + }, ) - transaction { - if (!config.production) { - addLogger(StdOutSqlLogger) - } - setupDatabaseForProjects(config) setupDatabaseForRegions() setupDatabaseForStores(Companion::executeScript)