From a79e1ec086e5bcecc8f4d24811e66742e4710c09 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Mon, 18 Jan 2021 17:13:24 +0100 Subject: [PATCH] upgrade kotlin, ktor, sendgrid --- build.gradle.kts | 8 +++++--- gradle.properties | 4 ++-- src/main/kotlin/application/Application.kt | 11 +++++++---- src/main/kotlin/application/Converters.kt | 2 +- src/main/kotlin/component/article/Article.kt | 4 ++-- .../component/article/ArticleRepository.kt | 5 +++-- .../component/article/ArticleViewManager.kt | 16 ++++++++++------ .../kotlin/component/article/ArticleVoter.kt | 10 +++++----- .../component/article/routes/GetOneArticle.kt | 2 +- .../kotlin/component/auth/PasswordlessAuth.kt | 2 +- src/main/kotlin/component/auth/User.kt | 3 ++- src/main/kotlin/component/auth/jwt/JWTMaker.kt | 2 +- src/main/kotlin/component/auth/jwt/JwtConfig.kt | 2 +- .../kotlin/component/auth/jwt/JwtInstallation.kt | 2 +- .../component/citizen/CitizenRepository.kt | 3 ++- .../kotlin/component/citizen/CitizenVoter.kt | 2 +- .../component/citizen/routes/ChangeMyPassword.kt | 2 +- .../component/citizen/routes/FindCitizens.kt | 2 +- .../citizen/routes/GetCurrentCitizen.kt | 2 +- .../component/citizen/routes/GetOneCitizen.kt | 2 +- .../comment/article/CommentArticleRepository.kt | 8 +++++--- .../article/routes/CreateCommentArticle.kt | 2 +- .../article/routes/GetCitizenArticleComments.kt | 2 +- .../comment/generic/CommentRepository.kt | 12 ++++++++---- .../comment/generic/routes/EditComment.kt | 2 +- .../generic/routes/GetCommentChildrenRequest.kt | 2 +- .../comment/generic/routes/GetOneComment.kt | 2 +- src/main/kotlin/component/views/ConfigViews.kt | 4 ++-- src/main/kotlin/component/views/ViewManager.kt | 2 +- src/main/kotlin/component/workgroup/Workgroup.kt | 2 +- .../component/workgroup/WorkgroupRepository.kt | 7 ++++--- .../component/workgroup/routes/GetWorkgroups.kt | 7 ++++++- .../routes/members/DeleteMembersOfWorkgroup.kt | 8 ++++---- .../routes/members/UpdateMemberOfWorkgroup.kt | 8 ++++---- src/main/kotlin/dto/Opinionable.kt | 2 +- src/main/kotlin/dto/Votable.kt | 2 +- src/main/kotlin/entity/Constitution.kt | 2 +- src/main/kotlin/entity/CreatedBy.kt | 2 +- src/main/kotlin/entity/EntityI.kt | 2 +- src/main/kotlin/entity/Extra.kt | 2 +- src/main/kotlin/entity/Follow.kt | 2 +- src/main/kotlin/entity/Opinion.kt | 2 +- src/main/kotlin/entity/OpinionChoice.kt | 2 +- src/main/kotlin/entity/Opinionable.kt | 2 +- src/main/kotlin/entity/Versionable.kt | 2 +- src/main/kotlin/entity/Votable.kt | 2 +- src/main/kotlin/event/EventNotification.kt | 2 +- src/main/kotlin/messages/Mailer.kt | 2 +- .../kotlin/messages/NotificationEmailSender.kt | 2 +- .../repository/CommentConstitutionRepository.kt | 6 ++++-- src/main/kotlin/repository/Constitution.kt | 3 ++- src/main/kotlin/repository/Follow.kt | 12 ++++++++---- src/main/kotlin/repository/Opinion.kt | 12 ++++++++---- src/main/kotlin/repository/Vote.kt | 10 +++++++--- src/main/kotlin/routes/CommentConstitution.kt | 2 +- src/main/kotlin/routes/Constitution.kt | 7 +++++-- src/main/kotlin/routes/FollowArticle.kt | 2 +- src/main/kotlin/routes/OpinionChoice.kt | 2 +- src/main/kotlin/routes/PaginatedRequest.kt | 2 +- src/main/kotlin/routes/VoteArticle.kt | 2 +- src/main/kotlin/routes/VoteConstitution.kt | 2 +- src/main/kotlin/utils/DateTime.kt | 2 +- src/main/kotlin/utils/Elastic.kt | 2 +- src/main/kotlin/utils/LoggerDelegate.kt | 2 +- src/main/kotlin/utils/Resources.kt | 2 +- src/main/kotlin/utils/Uuid.kt | 2 +- src/test/kotlin/steps/KtorServerContext.kt | 1 + src/test/kotlin/steps/KtorServerRequestSteps.kt | 2 -- src/test/kotlin/steps/KtorServerRestSteps.kt | 10 ++-------- 69 files changed, 152 insertions(+), 117 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d4b182f..92bab4e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,7 +26,8 @@ plugins { maven id("maven-publish") - id("org.jetbrains.kotlin.jvm") version "1.3.50" + kotlin("jvm") version "1.4.21" + kotlin("plugin.serialization") version "1.4.21" id("com.github.johnrengelman.shadow") version "5.2.0" id("org.jlleitschuh.gradle.ktlint") version "8.2.0" @@ -123,6 +124,7 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:$coroutinesVersion") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1") implementation("io.ktor:ktor-server-jetty:$ktor_version") implementation("io.ktor:ktor-client-jetty:$ktor_version") implementation("ch.qos.logback:logback-classic:$logback_version") @@ -139,8 +141,8 @@ dependencies { implementation("com.auth0:java-jwt:3.12.0") implementation("com.github.jasync-sql:jasync-postgresql:1.1.6") implementation("com.github.flecomte:postgres-json:2.0.0") - implementation("com.sendgrid:sendgrid-java:4.4.1") - implementation("io.lettuce:lettuce-core:5.3.6.RELEASE") //TODO update to 6.0.2 + implementation("com.sendgrid:sendgrid-java:4.7.1") + implementation("io.lettuce:lettuce-core:5.3.6.RELEASE") // TODO update to 6.0.2 implementation("com.rabbitmq:amqp-client:5.10.0") implementation("org.elasticsearch.client:elasticsearch-rest-client:6.7.1") implementation("com.jayway.jsonpath:json-path:2.5.0") diff --git a/gradle.properties b/gradle.properties index f7a3e02..90cb296 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ -ktor_version=1.2.2 +ktor_version=1.5.0 kotlin.code.style=official -kotlin_version=1.3.40 +kotlin_version=1.4.21-2 coroutinesVersion=1.4.2 logback_version=1.2.3 koinVersion=2.0.1 diff --git a/src/main/kotlin/application/Application.kt b/src/main/kotlin/application/Application.kt index d126ce6..363979e 100644 --- a/src/main/kotlin/application/Application.kt +++ b/src/main/kotlin/application/Application.kt @@ -49,6 +49,7 @@ import io.ktor.client.* import io.ktor.client.engine.jetty.Jetty import io.ktor.features.* import io.ktor.http.* +import io.ktor.http.cio.websocket.* import io.ktor.jackson.* import io.ktor.locations.* import io.ktor.response.* @@ -117,10 +118,12 @@ fun Application.module(env: Env = PROD) { disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) configure(SerializationFeature.INDENT_OUTPUT, true) - setDefaultPrettyPrinter(DefaultPrettyPrinter().apply { - indentArraysWith(DefaultPrettyPrinter.FixedSpaceIndenter.instance) - indentObjectsWith(DefaultIndenter(" ", "\n")) - }) + setDefaultPrettyPrinter( + DefaultPrettyPrinter().apply { + indentArraysWith(DefaultPrettyPrinter.FixedSpaceIndenter.instance) + indentObjectsWith(DefaultIndenter(" ", "\n")) + } + ) } } diff --git a/src/main/kotlin/application/Converters.kt b/src/main/kotlin/application/Converters.kt index 57f324a..bb2900d 100644 --- a/src/main/kotlin/application/Converters.kt +++ b/src/main/kotlin/application/Converters.kt @@ -123,4 +123,4 @@ val converters: ConverterDeclaration = { ?: throw NotFoundException("Workgroup $values not found") } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/article/Article.kt b/src/main/kotlin/component/article/Article.kt index 39c56d0..ae5d5a0 100644 --- a/src/main/kotlin/component/article/Article.kt +++ b/src/main/kotlin/component/article/Article.kt @@ -1,10 +1,10 @@ package fr.dcproject.component.article +import fr.dcproject.component.citizen.* import fr.dcproject.component.workgroup.WorkgroupCart import fr.dcproject.component.workgroup.WorkgroupCartI import fr.dcproject.component.workgroup.WorkgroupRef import fr.dcproject.component.workgroup.WorkgroupSimple -import fr.dcproject.component.citizen.* import fr.dcproject.entity.* import fr.postgresjson.entity.* import org.joda.time.DateTime @@ -128,4 +128,4 @@ interface ArticleAuthI : CreatedBy, EntityDeletedAt { val draft: Boolean -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/article/ArticleRepository.kt b/src/main/kotlin/component/article/ArticleRepository.kt index dd5a89f..4d6cb65 100644 --- a/src/main/kotlin/component/article/ArticleRepository.kt +++ b/src/main/kotlin/component/article/ArticleRepository.kt @@ -30,7 +30,8 @@ class ArticleRepository(override var requester: Requester) : RepositoryI { return requester .getFunction("find_articles") .select( - page, limit, + page, + limit, "sort" to sort?.toSnakeCase(), "direction" to direction, "search" to search, @@ -48,4 +49,4 @@ class ArticleRepository(override var requester: Requester) : RepositoryI { val createdById: String? = null, val workgroupId: String? = null ) : Parameter -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/article/ArticleViewManager.kt b/src/main/kotlin/component/article/ArticleViewManager.kt index 023450b..60a4a11 100644 --- a/src/main/kotlin/component/article/ArticleViewManager.kt +++ b/src/main/kotlin/component/article/ArticleViewManager.kt @@ -1,11 +1,11 @@ package fr.dcproject.component.article import fr.dcproject.component.citizen.CitizenI +import fr.dcproject.component.views.ViewManager import fr.dcproject.entity.ViewAggregation import fr.dcproject.utils.contentToString import fr.dcproject.utils.getJsonField import fr.dcproject.utils.toIso -import fr.dcproject.component.views.ViewManager import org.elasticsearch.client.Request import org.elasticsearch.client.Response import org.elasticsearch.client.RestClient @@ -27,7 +27,8 @@ class ArticleViewManager(private val restClient: RestClient) : ViewManager granted("You can create a new Article") @@ -46,4 +46,4 @@ class ArticleVoter(private val articleRepo: ArticleRepository) : Voter() { } return denied("This article must be yours for update it", "article.update.notYours") } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/article/routes/GetOneArticle.kt b/src/main/kotlin/component/article/routes/GetOneArticle.kt index 638a820..a1d677e 100644 --- a/src/main/kotlin/component/article/routes/GetOneArticle.kt +++ b/src/main/kotlin/component/article/routes/GetOneArticle.kt @@ -65,4 +65,4 @@ fun Route.getOneArticle(viewManager: ArticleViewManager, voter: ArticleVoter) { viewManager.addView(call.request.local.remoteHost, it.article, citizenOrNull) } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/auth/PasswordlessAuth.kt b/src/main/kotlin/component/auth/PasswordlessAuth.kt index 6148bff..15d6e4f 100644 --- a/src/main/kotlin/component/auth/PasswordlessAuth.kt +++ b/src/main/kotlin/component/auth/PasswordlessAuth.kt @@ -54,4 +54,4 @@ class PasswordlessAuth( } private fun noEmail(email: String): Nothing = throw EmailNotFound(email) -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/auth/User.kt b/src/main/kotlin/component/auth/User.kt index 3ab44a9..66a0b7d 100644 --- a/src/main/kotlin/component/auth/User.kt +++ b/src/main/kotlin/component/auth/User.kt @@ -12,7 +12,8 @@ class User( blockedAt: DateTime? = null, override var plainPassword: String? = null, override var roles: List = emptyList() -) : UserFull, UserBasic(id, username, blockedAt), +) : UserFull, + UserBasic(id, username, blockedAt), EntityCreatedAt by EntityCreatedAtImp(), EntityUpdatedAt by EntityUpdatedAtImp() diff --git a/src/main/kotlin/component/auth/jwt/JWTMaker.kt b/src/main/kotlin/component/auth/jwt/JWTMaker.kt index 064c4c6..8cf55a4 100644 --- a/src/main/kotlin/component/auth/jwt/JWTMaker.kt +++ b/src/main/kotlin/component/auth/jwt/JWTMaker.kt @@ -12,4 +12,4 @@ fun UserI.makeToken(): String = JWT.create() .withIssuer(JwtConfig.issuer) .withClaim("id", id.toString()) .withExpiresAt(JwtConfig.getExpiration()) - .sign(JwtConfig.algorithm) \ No newline at end of file + .sign(JwtConfig.algorithm) diff --git a/src/main/kotlin/component/auth/jwt/JwtConfig.kt b/src/main/kotlin/component/auth/jwt/JwtConfig.kt index 06e2230..0148e2c 100644 --- a/src/main/kotlin/component/auth/jwt/JwtConfig.kt +++ b/src/main/kotlin/component/auth/jwt/JwtConfig.kt @@ -22,4 +22,4 @@ object JwtConfig { * Calculate the expiration Date based on current time + the given validity */ fun getExpiration() = Date(System.currentTimeMillis() + validityInMs) -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/auth/jwt/JwtInstallation.kt b/src/main/kotlin/component/auth/jwt/JwtInstallation.kt index f322c68..b7a75f0 100644 --- a/src/main/kotlin/component/auth/jwt/JwtInstallation.kt +++ b/src/main/kotlin/component/auth/jwt/JwtInstallation.kt @@ -40,4 +40,4 @@ fun jwtInstallation(userRepo: UserRepository): Authentication.Configuration.() - } } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/citizen/CitizenRepository.kt b/src/main/kotlin/component/citizen/CitizenRepository.kt index 8603ce8..e0a67e7 100644 --- a/src/main/kotlin/component/citizen/CitizenRepository.kt +++ b/src/main/kotlin/component/citizen/CitizenRepository.kt @@ -33,7 +33,8 @@ class CitizenRepository(override var requester: Requester) : RepositoryI { ): Paginated = requester .getFunction("find_citizens") .select( - page, limit, + page, + limit, "sort" to sort?.toSnakeCase(), "direction" to direction, "search" to search diff --git a/src/main/kotlin/component/citizen/CitizenVoter.kt b/src/main/kotlin/component/citizen/CitizenVoter.kt index 82f0927..71db36a 100644 --- a/src/main/kotlin/component/citizen/CitizenVoter.kt +++ b/src/main/kotlin/component/citizen/CitizenVoter.kt @@ -23,4 +23,4 @@ class CitizenVoter : Voter() { if (connectedCitizen == null) return denied("You must be connected to change your password", "citizen.changePassword.notConnected") return if (subject.id == connectedCitizen.id) granted() else denied("You can only change your password", "citizen.password.notYours") } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/citizen/routes/ChangeMyPassword.kt b/src/main/kotlin/component/citizen/routes/ChangeMyPassword.kt index 8a352a7..8f82ef5 100644 --- a/src/main/kotlin/component/citizen/routes/ChangeMyPassword.kt +++ b/src/main/kotlin/component/citizen/routes/ChangeMyPassword.kt @@ -42,4 +42,4 @@ fun Route.changeMyPassword(voter: CitizenVoter, userRepository: UserRepository) call.respond(HttpStatusCode.BadRequest, "Request format is not correct") } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/citizen/routes/FindCitizens.kt b/src/main/kotlin/component/citizen/routes/FindCitizens.kt index 512d9f0..3a5286b 100644 --- a/src/main/kotlin/component/citizen/routes/FindCitizens.kt +++ b/src/main/kotlin/component/citizen/routes/FindCitizens.kt @@ -30,4 +30,4 @@ fun Route.findCitizen(voter: CitizenVoter, repo: CitizenRepository) { voter.assert { canView(citizens.result, citizenOrNull) } call.respond(citizens) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/citizen/routes/GetCurrentCitizen.kt b/src/main/kotlin/component/citizen/routes/GetCurrentCitizen.kt index 3483df5..cb7e5b6 100644 --- a/src/main/kotlin/component/citizen/routes/GetCurrentCitizen.kt +++ b/src/main/kotlin/component/citizen/routes/GetCurrentCitizen.kt @@ -25,4 +25,4 @@ fun Route.getCurrentCitizen(voter: CitizenVoter) { call.respond(citizen) } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/citizen/routes/GetOneCitizen.kt b/src/main/kotlin/component/citizen/routes/GetOneCitizen.kt index 77a7a86..e09de48 100644 --- a/src/main/kotlin/component/citizen/routes/GetOneCitizen.kt +++ b/src/main/kotlin/component/citizen/routes/GetOneCitizen.kt @@ -20,4 +20,4 @@ fun Route.getOneCitizen(voter: CitizenVoter) { call.respond(it.citizen) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/comment/article/CommentArticleRepository.kt b/src/main/kotlin/component/comment/article/CommentArticleRepository.kt index c266081..ecc583e 100644 --- a/src/main/kotlin/component/comment/article/CommentArticleRepository.kt +++ b/src/main/kotlin/component/comment/article/CommentArticleRepository.kt @@ -27,7 +27,8 @@ class CommentArticleRepository(requester: Requester) : CommentRepositoryAbs> = requester .getFunction("find_comments_by_target") .select( - page, limit, + page, + limit, "target_id" to target.id, "sort" to sort.sql ) @@ -57,4 +59,4 @@ class CommentArticleRepository(requester: Requester) : CommentRepositoryAbs(override var requester: Request return requester.run { getFunction("find_comments_by_parent") .select( - page, limit, + page, + limit, "parent_id" to parentId ) } @@ -60,7 +61,8 @@ abstract class CommentRepositoryAbs(override var requester: Request return requester.run { getFunction("find_comments_by_target") .select( - page, limit, + page, + limit, "target_id" to targetId, "sort" to sort.sql ) @@ -101,7 +103,8 @@ class CommentRepository(requester: Requester) : CommentRepositoryAbs( return requester.run { getFunction("find_comments_by_citizen") .select( - page, limit, + page, + limit, "created_by_id" to citizen.id ) } @@ -115,7 +118,8 @@ class CommentRepository(requester: Requester) : CommentRepositoryAbs( return requester.run { getFunction("find_comments_by_parent") .select( - page, limit, + page, + limit, "parent_id" to parentId ) } diff --git a/src/main/kotlin/component/comment/generic/routes/EditComment.kt b/src/main/kotlin/component/comment/generic/routes/EditComment.kt index 28f4558..21c6fcf 100644 --- a/src/main/kotlin/component/comment/generic/routes/EditComment.kt +++ b/src/main/kotlin/component/comment/generic/routes/EditComment.kt @@ -30,4 +30,4 @@ fun Route.editComment(repo: CommentRepository, voter: CommentVoter) { call.respond(HttpStatusCode.OK, comment) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/comment/generic/routes/GetCommentChildrenRequest.kt b/src/main/kotlin/component/comment/generic/routes/GetCommentChildrenRequest.kt index cdeb8c8..4c4e874 100644 --- a/src/main/kotlin/component/comment/generic/routes/GetCommentChildrenRequest.kt +++ b/src/main/kotlin/component/comment/generic/routes/GetCommentChildrenRequest.kt @@ -39,4 +39,4 @@ fun Route.getChildrenComments(repo: CommentRepository, voter: CommentVoter) { call.respond(HttpStatusCode.OK, comments) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/comment/generic/routes/GetOneComment.kt b/src/main/kotlin/component/comment/generic/routes/GetOneComment.kt index 302705e..23585d4 100644 --- a/src/main/kotlin/component/comment/generic/routes/GetOneComment.kt +++ b/src/main/kotlin/component/comment/generic/routes/GetOneComment.kt @@ -26,4 +26,4 @@ fun Route.getOneComment(repo: CommentRepository, voter: CommentVoter) { call.respond(HttpStatusCode.OK, comment) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/views/ConfigViews.kt b/src/main/kotlin/component/views/ConfigViews.kt index 834aa13..c07292f 100644 --- a/src/main/kotlin/component/views/ConfigViews.kt +++ b/src/main/kotlin/component/views/ConfigViews.kt @@ -9,7 +9,7 @@ object ConfigViews { private fun waitElasticsearchIsUp(client: RestClient) { val logger: Logger = LoggerFactory.getLogger("fr.dcproject.elasticsearch") val request = Request("GET", "/_cluster/health") - repeat(5*60 / 2) { // 5 minutes + repeat(5 * 60 / 2) { // 5 minutes runCatching { client.performRequest(request).statusLine.statusCode }.onSuccess { @@ -74,7 +74,7 @@ object ConfigViews { } } } - """.trimIndent() + """.trimIndent() ) }.let { performRequest(it) diff --git a/src/main/kotlin/component/views/ViewManager.kt b/src/main/kotlin/component/views/ViewManager.kt index a7d6b72..6a374dd 100644 --- a/src/main/kotlin/component/views/ViewManager.kt +++ b/src/main/kotlin/component/views/ViewManager.kt @@ -15,4 +15,4 @@ interface ViewManager { * Get Views aggregations */ fun getViewsCount(entity: T): ViewAggregation -} \ No newline at end of file +} diff --git a/src/main/kotlin/component/workgroup/Workgroup.kt b/src/main/kotlin/component/workgroup/Workgroup.kt index affc473..14983e1 100644 --- a/src/main/kotlin/component/workgroup/Workgroup.kt +++ b/src/main/kotlin/component/workgroup/Workgroup.kt @@ -104,4 +104,4 @@ fun List>.getRoles(user: UserI): List = fun List>.getRoles(citizen: CitizenI): List = firstOrNull { it.citizen.id == citizen.id }?.roles ?: emptyList() -interface WorkgroupI : UuidEntityI \ No newline at end of file +interface WorkgroupI : UuidEntityI diff --git a/src/main/kotlin/component/workgroup/WorkgroupRepository.kt b/src/main/kotlin/component/workgroup/WorkgroupRepository.kt index 3847980..5084faa 100644 --- a/src/main/kotlin/component/workgroup/WorkgroupRepository.kt +++ b/src/main/kotlin/component/workgroup/WorkgroupRepository.kt @@ -30,7 +30,8 @@ class WorkgroupRepository(override var requester: Requester) : RepositoryI { return requester .getFunction("find_workgroups") .select( - page, limit, + page, + limit, "sort" to sort?.toSnakeCase(), "direction" to direction, "search" to search, @@ -43,8 +44,8 @@ class WorkgroupRepository(override var requester: Requester) : RepositoryI { .selectOne("resource" to workgroup) ?: error("query 'upsert_workgroup' return null") fun delete(workgroup: W) = requester - .getFunction("delete_workgroup") - .perform("id" to workgroup.id) + .getFunction("delete_workgroup") + .perform("id" to workgroup.id) fun addMember(workgroup: WorkgroupI, member: Member): Member? = addMember(workgroup, member.citizen, member.roles) diff --git a/src/main/kotlin/component/workgroup/routes/GetWorkgroups.kt b/src/main/kotlin/component/workgroup/routes/GetWorkgroups.kt index 5bd7064..4f8e4dd 100644 --- a/src/main/kotlin/component/workgroup/routes/GetWorkgroups.kt +++ b/src/main/kotlin/component/workgroup/routes/GetWorkgroups.kt @@ -32,7 +32,12 @@ object GetWorkgroups { fun Route.getWorkgroups(repo: WorkgroupRepository, voter: WorkgroupVoter) { get { val workgroups = - repo.find(it.page, it.limit, it.sort, it.direction, it.search, + repo.find( + it.page, + it.limit, + it.sort, + it.direction, + it.search, WorkgroupRepository.Filter(createdById = it.createdBy, members = it.members) ) voter.assert { canView(workgroups.result, citizenOrNull) } diff --git a/src/main/kotlin/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt b/src/main/kotlin/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt index 97dd0d7..fa3e315 100644 --- a/src/main/kotlin/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt +++ b/src/main/kotlin/component/workgroup/routes/members/DeleteMembersOfWorkgroup.kt @@ -41,10 +41,10 @@ object DeleteMembersOfWorkgroup { repo.findById(it.workgroupId)?.let { workgroup -> call.getMembersFromRequest().let { members -> voter.assert { canView(workgroup, citizenOrNull) } - repo.removeMembers(workgroup, members) - }.let { members -> - call.respond(HttpStatusCode.OK, members) - } + repo.removeMembers(workgroup, members) + }.let { members -> + call.respond(HttpStatusCode.OK, members) + } } ?: call.respond(HttpStatusCode.NotFound) } } diff --git a/src/main/kotlin/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt b/src/main/kotlin/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt index f3b50ef..607659f 100644 --- a/src/main/kotlin/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt +++ b/src/main/kotlin/component/workgroup/routes/members/UpdateMemberOfWorkgroup.kt @@ -41,10 +41,10 @@ object UpdateMemberOfWorkgroup { repo.findById(it.workgroupId)?.let { workgroup -> call.getMembersFromRequest().let { members -> voter.assert { canUpdateMembers(workgroup, citizenOrNull) } - repo.updateMembers(workgroup, members) - }.let { members -> - call.respond(HttpStatusCode.OK, members) - } + repo.updateMembers(workgroup, members) + }.let { members -> + call.respond(HttpStatusCode.OK, members) + } } ?: call.respond(HttpStatusCode.NotFound) } } diff --git a/src/main/kotlin/dto/Opinionable.kt b/src/main/kotlin/dto/Opinionable.kt index 4170315..52ab9c6 100644 --- a/src/main/kotlin/dto/Opinionable.kt +++ b/src/main/kotlin/dto/Opinionable.kt @@ -8,4 +8,4 @@ interface Opinionable { class Imp(parent: fr.dcproject.entity.Opinionable) : Opinionable { override val opinions: Opinions = parent.opinions } -} \ No newline at end of file +} diff --git a/src/main/kotlin/dto/Votable.kt b/src/main/kotlin/dto/Votable.kt index 7252bc4..4930099 100644 --- a/src/main/kotlin/dto/Votable.kt +++ b/src/main/kotlin/dto/Votable.kt @@ -6,4 +6,4 @@ interface Votable { class Imp(parent: fr.dcproject.entity.Votable) : Votable { override val votes: VoteAggregation = VoteAggregation(parent) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/entity/Constitution.kt b/src/main/kotlin/entity/Constitution.kt index 271babb..8eef621 100644 --- a/src/main/kotlin/entity/Constitution.kt +++ b/src/main/kotlin/entity/Constitution.kt @@ -68,4 +68,4 @@ open class ConstitutionRef(id: UUID = UUID.randomUUID()) : ConstitutionS(id) { ) : UuidEntity(id) } -sealed class ConstitutionS(id: UUID = UUID.randomUUID()) : TargetRef(id), TargetI \ No newline at end of file +sealed class ConstitutionS(id: UUID = UUID.randomUUID()) : TargetRef(id), TargetI diff --git a/src/main/kotlin/entity/CreatedBy.kt b/src/main/kotlin/entity/CreatedBy.kt index af2a122..075b5ef 100644 --- a/src/main/kotlin/entity/CreatedBy.kt +++ b/src/main/kotlin/entity/CreatedBy.kt @@ -11,4 +11,4 @@ interface CreatedBy : EntityCreatedBy { override val createdBy: T } -class CreatedByImp(override val createdBy: T) : CreatedBy \ No newline at end of file +class CreatedByImp(override val createdBy: T) : CreatedBy diff --git a/src/main/kotlin/entity/EntityI.kt b/src/main/kotlin/entity/EntityI.kt index 5cf0804..52e6aa1 100644 --- a/src/main/kotlin/entity/EntityI.kt +++ b/src/main/kotlin/entity/EntityI.kt @@ -5,4 +5,4 @@ import java.util.* interface EntityI : EntityI { val id: UUID -} \ No newline at end of file +} diff --git a/src/main/kotlin/entity/Extra.kt b/src/main/kotlin/entity/Extra.kt index 4261770..eb8af8e 100644 --- a/src/main/kotlin/entity/Extra.kt +++ b/src/main/kotlin/entity/Extra.kt @@ -61,4 +61,4 @@ interface TargetI : UuidEntityI { } val reference: String -} \ No newline at end of file +} diff --git a/src/main/kotlin/entity/Follow.kt b/src/main/kotlin/entity/Follow.kt index 5129ee3..7b3d50f 100644 --- a/src/main/kotlin/entity/Follow.kt +++ b/src/main/kotlin/entity/Follow.kt @@ -36,4 +36,4 @@ open class FollowRef( override val id: UUID ) : FollowI -interface FollowI : UuidEntityI \ No newline at end of file +interface FollowI : UuidEntityI diff --git a/src/main/kotlin/entity/Opinion.kt b/src/main/kotlin/entity/Opinion.kt index d05d99e..2fa7c7d 100644 --- a/src/main/kotlin/entity/Opinion.kt +++ b/src/main/kotlin/entity/Opinion.kt @@ -43,4 +43,4 @@ open class OpinionRef( override val id: UUID ) : OpinionI, TargetRef(id) -interface OpinionI : UuidEntityI \ No newline at end of file +interface OpinionI : UuidEntityI diff --git a/src/main/kotlin/entity/OpinionChoice.kt b/src/main/kotlin/entity/OpinionChoice.kt index 0d7bb7d..a2aeec7 100644 --- a/src/main/kotlin/entity/OpinionChoice.kt +++ b/src/main/kotlin/entity/OpinionChoice.kt @@ -13,4 +13,4 @@ class OpinionChoice( open class OpinionChoiceRef( id: UUID? -) : UuidEntity(id ?: UUID.randomUUID()) \ No newline at end of file +) : UuidEntity(id ?: UUID.randomUUID()) diff --git a/src/main/kotlin/entity/Opinionable.kt b/src/main/kotlin/entity/Opinionable.kt index aa40487..55eb2f2 100644 --- a/src/main/kotlin/entity/Opinionable.kt +++ b/src/main/kotlin/entity/Opinionable.kt @@ -9,4 +9,4 @@ interface Opinionable { class OpinionableImp : Opinionable { override var opinions: OpinionsMutable = mutableMapOf() -} \ No newline at end of file +} diff --git a/src/main/kotlin/entity/Versionable.kt b/src/main/kotlin/entity/Versionable.kt index 8d671fa..c6e4b51 100644 --- a/src/main/kotlin/entity/Versionable.kt +++ b/src/main/kotlin/entity/Versionable.kt @@ -14,4 +14,4 @@ class VersionableRefImp( interface Versionable : VersionableRef, EntityVersioning { override val versionId: UUID override val versionNumber: Int -} \ No newline at end of file +} diff --git a/src/main/kotlin/entity/Votable.kt b/src/main/kotlin/entity/Votable.kt index 2123c89..6fadd00 100644 --- a/src/main/kotlin/entity/Votable.kt +++ b/src/main/kotlin/entity/Votable.kt @@ -6,4 +6,4 @@ interface Votable { class VotableImp : Votable { override val votes: VoteAggregation = VoteAggregation() -} \ No newline at end of file +} diff --git a/src/main/kotlin/event/EventNotification.kt b/src/main/kotlin/event/EventNotification.kt index 7a77b3a..1e29839 100644 --- a/src/main/kotlin/event/EventNotification.kt +++ b/src/main/kotlin/event/EventNotification.kt @@ -13,12 +13,12 @@ import fr.dcproject.repository.Follow import fr.postgresjson.serializer.deserialize import io.ktor.application.* import io.ktor.util.pipeline.* +import io.ktor.utils.io.errors.* import io.lettuce.core.api.async.RedisAsyncCommands import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import kotlinx.io.errors.IOException import org.slf4j.Logger import org.slf4j.LoggerFactory import fr.dcproject.repository.FollowArticle as FollowArticleRepository diff --git a/src/main/kotlin/messages/Mailer.kt b/src/main/kotlin/messages/Mailer.kt index 4ffa10b..9d91af7 100644 --- a/src/main/kotlin/messages/Mailer.kt +++ b/src/main/kotlin/messages/Mailer.kt @@ -24,4 +24,4 @@ class Mailer( throw ex } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/messages/NotificationEmailSender.kt b/src/main/kotlin/messages/NotificationEmailSender.kt index 7f2b4c3..110bf62 100644 --- a/src/main/kotlin/messages/NotificationEmailSender.kt +++ b/src/main/kotlin/messages/NotificationEmailSender.kt @@ -67,4 +67,4 @@ class NotificationEmailSender( private fun noCitizen(id: UUID): Nothing = throw NoCitizen("No Citizen with this id : $id") private fun noTarget(id: UUID): Nothing = throw NoTarget("No Target with this id : $id") -} \ No newline at end of file +} diff --git a/src/main/kotlin/repository/CommentConstitutionRepository.kt b/src/main/kotlin/repository/CommentConstitutionRepository.kt index 5c00639..2015d85 100644 --- a/src/main/kotlin/repository/CommentConstitutionRepository.kt +++ b/src/main/kotlin/repository/CommentConstitutionRepository.kt @@ -27,7 +27,8 @@ class CommentConstitutionRepository(requester: Requester) : CommentRepositoryAbs return requester.run { getFunction("find_comments_by_citizen") .select( - page, limit, + page, + limit, "created_by_id" to citizen.id, "reference" to TargetI.getReference(ConstitutionRef::class) ) @@ -43,7 +44,8 @@ class CommentConstitutionRepository(requester: Requester) : CommentRepositoryAbs return requester.run { getFunction("find_comments_by_target") .select( - page, limit, + page, + limit, "target_id" to target.id, "sort" to sort.sql ) diff --git a/src/main/kotlin/repository/Constitution.kt b/src/main/kotlin/repository/Constitution.kt index 2d6edb8..44e65f1 100644 --- a/src/main/kotlin/repository/Constitution.kt +++ b/src/main/kotlin/repository/Constitution.kt @@ -27,7 +27,8 @@ class Constitution(override var requester: Requester) : RepositoryI { return requester .getFunction("find_constitutions") .select( - page, limit, + page, + limit, "sort" to sort?.toSnakeCase(), "direction" to direction, "search" to search diff --git a/src/main/kotlin/repository/Follow.kt b/src/main/kotlin/repository/Follow.kt index 3616b3c..eaf7000 100644 --- a/src/main/kotlin/repository/Follow.kt +++ b/src/main/kotlin/repository/Follow.kt @@ -34,7 +34,8 @@ sealed class Follow(override var requester: Req return requester .getFunction("find_follows_by_citizen") .select( - page, limit, + page, + limit, "created_by_id" to citizenId ) } @@ -101,7 +102,8 @@ class FollowArticle(requester: Requester) : Follow(r return requester.run { getFunction("find_follows_article_by_citizen") .select( - page, limit, + page, + limit, "created_by_id" to citizenId ) } @@ -115,7 +117,8 @@ class FollowArticle(requester: Requester) : Follow(r return requester .getFunction("find_follows_article_by_target") .select( - page, limit, + page, + limit, "target_id" to target.id ) } @@ -130,7 +133,8 @@ class FollowConstitution(requester: Requester) : Follow(requester: Requester) : OpinionChoice(requ return requester.run { getFunction("find_citizen_opinions_by_target_ids") .select( - typeReference, mapOf( + typeReference, + mapOf( "citizen_id" to citizen.id, "ids" to targets ) @@ -101,7 +102,8 @@ abstract class Opinion(requester: Requester) : OpinionChoice(requ return requester .getFunction("find_citizen_opinions_by_target_id") .select( - typeReference, mapOf( + typeReference, + mapOf( "citizen_id" to citizen.id, "id" to target ) @@ -121,7 +123,9 @@ abstract class Opinion(requester: Requester) : OpinionChoice(requ ): Paginated> { return requester .getFunction("find_citizen_opinions") - .select(page, limit, + .select( + page, + limit, "sort" to sort?.toSnakeCase(), "direction" to direction, "citizen_id" to citizen.id @@ -153,4 +157,4 @@ class OpinionArticle(requester: Requester) : Opinion(requester) { .getFunction("upsert_opinion") .selectOne("resource" to opinion)!! } -} \ No newline at end of file +} diff --git a/src/main/kotlin/repository/Vote.kt b/src/main/kotlin/repository/Vote.kt index d842579..0ab1071 100644 --- a/src/main/kotlin/repository/Vote.kt +++ b/src/main/kotlin/repository/Vote.kt @@ -37,7 +37,10 @@ open class Vote(override var requester: Requester) : RepositoryI { return requester.run { getFunction("find_votes_by_citizen") .select( - page, limit, typeReference, mapOf( + page, + limit, + typeReference, + mapOf( "created_by_id" to citizenId, "reference" to target ) @@ -53,7 +56,8 @@ open class Vote(override var requester: Requester) : RepositoryI { return requester.run { getFunction("find_citizen_votes_by_target_ids") .select( - typeReference, mapOf( + typeReference, + mapOf( "citizen_id" to citizen.id, "ids" to targets ) @@ -120,4 +124,4 @@ class VoteConstitution(requester: Requester) : Vote(requester) { page, limit ) -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/CommentConstitution.kt b/src/main/kotlin/routes/CommentConstitution.kt index 40099a7..208cc31 100644 --- a/src/main/kotlin/routes/CommentConstitution.kt +++ b/src/main/kotlin/routes/CommentConstitution.kt @@ -50,4 +50,4 @@ fun Route.commentConstitution(repo: CommentConstitutionRepository, voter: Commen voter.assert { canView(comments.result, citizenOrNull) } call.respond(comments) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/Constitution.kt b/src/main/kotlin/routes/Constitution.kt index 2055822..66c6e1b 100644 --- a/src/main/kotlin/routes/Constitution.kt +++ b/src/main/kotlin/routes/Constitution.kt @@ -60,7 +60,10 @@ object ConstitutionPaths { ) : UuidEntity(id) { fun create(): TitleSimple = TitleSimple( - id, name, rank, articles + id, + name, + rank, + articles ) } @@ -100,4 +103,4 @@ fun Route.constitution(repo: ConstitutionRepository, voter: ConstitutionVoter) { call.respond(constitution) } } -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/FollowArticle.kt b/src/main/kotlin/routes/FollowArticle.kt index 465bee5..7209383 100644 --- a/src/main/kotlin/routes/FollowArticle.kt +++ b/src/main/kotlin/routes/FollowArticle.kt @@ -53,4 +53,4 @@ fun Route.followArticle(repo: FollowArticleRepository, voter: FollowVoter) { } call.respond(follows) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/OpinionChoice.kt b/src/main/kotlin/routes/OpinionChoice.kt index 8fb622d..bc7e2c7 100644 --- a/src/main/kotlin/routes/OpinionChoice.kt +++ b/src/main/kotlin/routes/OpinionChoice.kt @@ -33,4 +33,4 @@ fun Route.opinionChoice(repo: OpinionChoiceRepository, voter: OpinionChoiceVoter call.respond(opinionChoices) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/PaginatedRequest.kt b/src/main/kotlin/routes/PaginatedRequest.kt index de27da5..063c961 100644 --- a/src/main/kotlin/routes/PaginatedRequest.kt +++ b/src/main/kotlin/routes/PaginatedRequest.kt @@ -11,4 +11,4 @@ open class PaginatedRequest( ) : PaginatedRequestI { override val page: Int = if (page < 1) 1 else page override val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/VoteArticle.kt b/src/main/kotlin/routes/VoteArticle.kt index 4828932..0f854e6 100644 --- a/src/main/kotlin/routes/VoteArticle.kt +++ b/src/main/kotlin/routes/VoteArticle.kt @@ -88,4 +88,4 @@ fun Route.voteArticle(repo: VoteArticleRepository, voteCommentRepo: VoteComment, } call.respond(votes) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/routes/VoteConstitution.kt b/src/main/kotlin/routes/VoteConstitution.kt index fb12df4..85b2a2f 100644 --- a/src/main/kotlin/routes/VoteConstitution.kt +++ b/src/main/kotlin/routes/VoteConstitution.kt @@ -40,4 +40,4 @@ fun Route.voteConstitution(repo: VoteConstitutionRepository, voter: VoteVoter) { repo.vote(vote) call.respond(HttpStatusCode.Created) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/utils/DateTime.kt b/src/main/kotlin/utils/DateTime.kt index 6920b8d..1fec3ba 100644 --- a/src/main/kotlin/utils/DateTime.kt +++ b/src/main/kotlin/utils/DateTime.kt @@ -3,4 +3,4 @@ package fr.dcproject.utils import org.joda.time.DateTime import org.joda.time.format.ISODateTimeFormat -fun DateTime.toIso(): String = ISODateTimeFormat.dateTime().print(this) \ No newline at end of file +fun DateTime.toIso(): String = ISODateTimeFormat.dateTime().print(this) diff --git a/src/main/kotlin/utils/Elastic.kt b/src/main/kotlin/utils/Elastic.kt index 3962a2c..b7955f7 100644 --- a/src/main/kotlin/utils/Elastic.kt +++ b/src/main/kotlin/utils/Elastic.kt @@ -26,4 +26,4 @@ fun String.getJsonField(jsonPath: String): Int? { .warn("No value for Json path ${JsonPath.compile(jsonPath).path}") null } -} \ No newline at end of file +} diff --git a/src/main/kotlin/utils/LoggerDelegate.kt b/src/main/kotlin/utils/LoggerDelegate.kt index 0bd65e5..55322c5 100644 --- a/src/main/kotlin/utils/LoggerDelegate.kt +++ b/src/main/kotlin/utils/LoggerDelegate.kt @@ -7,4 +7,4 @@ import kotlin.reflect.KProperty internal class LoggerDelegate : ReadOnlyProperty { override fun getValue(thisRef: R, property: KProperty<*>): Logger = LoggerFactory.getLogger(thisRef.javaClass.packageName) -} \ No newline at end of file +} diff --git a/src/main/kotlin/utils/Resources.kt b/src/main/kotlin/utils/Resources.kt index 9b605c8..92336d7 100644 --- a/src/main/kotlin/utils/Resources.kt +++ b/src/main/kotlin/utils/Resources.kt @@ -4,4 +4,4 @@ fun String.readResource(callback: (String) -> Unit = {}): String { val content = callback::class.java.getResource(this).readText() callback(content) return content -} \ No newline at end of file +} diff --git a/src/main/kotlin/utils/Uuid.kt b/src/main/kotlin/utils/Uuid.kt index 2824ed1..f65a6ef 100644 --- a/src/main/kotlin/utils/Uuid.kt +++ b/src/main/kotlin/utils/Uuid.kt @@ -8,4 +8,4 @@ fun List.toUUID(): List = this .filterNotNull() .map { it.trim() } .filter { it.isNotBlank() } - .map { UUID.fromString(it) } \ No newline at end of file + .map { UUID.fromString(it) } diff --git a/src/test/kotlin/steps/KtorServerContext.kt b/src/test/kotlin/steps/KtorServerContext.kt index 296ff00..b9585b7 100644 --- a/src/test/kotlin/steps/KtorServerContext.kt +++ b/src/test/kotlin/steps/KtorServerContext.kt @@ -1,6 +1,7 @@ package steps import io.ktor.application.* +import io.ktor.server.engine.* import io.ktor.server.testing.* import java.util.concurrent.TimeUnit import kotlin.test.fail diff --git a/src/test/kotlin/steps/KtorServerRequestSteps.kt b/src/test/kotlin/steps/KtorServerRequestSteps.kt index dedb138..8df6b14 100644 --- a/src/test/kotlin/steps/KtorServerRequestSteps.kt +++ b/src/test/kotlin/steps/KtorServerRequestSteps.kt @@ -6,11 +6,9 @@ import io.cucumber.java8.En import io.ktor.http.* import io.ktor.server.testing.* import io.ktor.util.* -import kotlinx.serialization.ImplicitReflectionSerializer import kotlin.test.assertEquals import kotlin.test.assertNotEquals -@ImplicitReflectionSerializer @KtorExperimentalAPI class KtorServerRequestSteps : En { init { diff --git a/src/test/kotlin/steps/KtorServerRestSteps.kt b/src/test/kotlin/steps/KtorServerRestSteps.kt index a2b2ee6..cc0d568 100644 --- a/src/test/kotlin/steps/KtorServerRestSteps.kt +++ b/src/test/kotlin/steps/KtorServerRestSteps.kt @@ -2,17 +2,11 @@ package steps import io.cucumber.datatable.DataTable import io.cucumber.java8.En -import kotlinx.serialization.ImplicitReflectionSerializer -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.parse +import kotlinx.serialization.json.* import kotlin.test.assertEquals import kotlin.test.assertTrue import kotlin.test.fail -@ImplicitReflectionSerializer class KtorServerRestSteps : En { init { Then("the JSON should contain:") { dataTable: DataTable -> @@ -60,7 +54,7 @@ class KtorServerRestSteps : En { } private val responseJsonElement: JsonElement - get() = Json.parse(KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid JSON")) + get() = Json.parseToJsonElement(KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid JSON")) private val response: String get() = KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid")