From cd13f9a0109599b085ba07ff3891ef7718102c04 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Thu, 27 Feb 2020 20:31:25 +0100 Subject: [PATCH] Improve Follow repository to split IN/OUT type --- src/main/kotlin/fr/dcproject/Application.kt | 8 ++++++++ .../kotlin/fr/dcproject/repository/Follow.kt | 16 ++++++++-------- .../kotlin/fr/dcproject/routes/FollowArticle.kt | 4 ++-- .../fr/dcproject/routes/FollowConstitution.kt | 8 ++++---- .../kotlin/fr/dcproject/routes/OpinionArticle.kt | 3 ++- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/fr/dcproject/Application.kt b/src/main/kotlin/fr/dcproject/Application.kt index c6e9cd7..f9af32a 100644 --- a/src/main/kotlin/fr/dcproject/Application.kt +++ b/src/main/kotlin/fr/dcproject/Application.kt @@ -142,6 +142,14 @@ fun Application.module(env: Env = PROD) { } } + convert { + decode { values, _ -> + values.singleOrNull()?.let { + CitizenRef(UUID.fromString(it)) + } ?: throw NotFoundException("Citizen $values not found") + } + } + convert { decode { values, _ -> val id = values.singleOrNull()?.let { UUID.fromString(it) } diff --git a/src/main/kotlin/fr/dcproject/repository/Follow.kt b/src/main/kotlin/fr/dcproject/repository/Follow.kt index b46671f..0c2e01d 100644 --- a/src/main/kotlin/fr/dcproject/repository/Follow.kt +++ b/src/main/kotlin/fr/dcproject/repository/Follow.kt @@ -12,19 +12,19 @@ import fr.dcproject.entity.Article as ArticleEntity import fr.dcproject.entity.Constitution as ConstitutionEntity import fr.dcproject.entity.Follow as FollowEntity -open class Follow(override var requester: Requester) : RepositoryI { +open class Follow(override var requester: Requester) : RepositoryI { open fun findByCitizen( citizen: CitizenI, page: Int = 1, limit: Int = 50 - ): Paginated> = + ): Paginated> = findByCitizen(citizen.id, page, limit) open fun findByCitizen( citizenId: UUID, page: Int = 1, limit: Int = 50 - ): Paginated> { + ): Paginated> { return requester .getFunction("find_follows_by_citizen") .select( @@ -33,7 +33,7 @@ open class Follow(override var requester: Requester) : Repository ) } - fun follow(follow: FollowEntity) { + fun follow(follow: FollowEntity) { requester .getFunction("follow") .sendQuery( @@ -43,7 +43,7 @@ open class Follow(override var requester: Requester) : Repository ) } - fun unfollow(follow: FollowEntity) { + fun unfollow(follow: FollowEntity) { requester .getFunction("unfollow") .sendQuery( @@ -56,7 +56,7 @@ open class Follow(override var requester: Requester) : Repository open fun findFollow( citizen: CitizenI, target: UuidEntity - ): FollowEntity? = + ): FollowEntity? = requester .getFunction("find_follow") .selectOne( @@ -65,7 +65,7 @@ open class Follow(override var requester: Requester) : Repository ) } -class FollowArticle(requester: Requester) : Follow(requester) { +class FollowArticle(requester: Requester) : Follow(requester) { override fun findByCitizen( citizenId: UUID, page: Int, @@ -107,7 +107,7 @@ class FollowArticle(requester: Requester) : Follow(requester) { } } -class FollowConstitution(requester: Requester) : Follow(requester) { +class FollowConstitution(requester: Requester) : Follow(requester) { override fun findByCitizen( citizenId: UUID, page: Int, diff --git a/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt b/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt index c389ffd..cb0f2c5 100644 --- a/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/FollowArticle.kt @@ -1,6 +1,7 @@ package fr.dcproject.routes import fr.dcproject.citizen +import fr.dcproject.entity.ArticleRef import fr.dcproject.entity.Citizen import fr.dcproject.security.voter.FollowVoter.Action.* import fr.dcproject.security.voter.assertCan @@ -9,14 +10,13 @@ import io.ktor.http.HttpStatusCode import io.ktor.locations.* import io.ktor.response.respond import io.ktor.routing.Route -import fr.dcproject.entity.Article as ArticleEntity import fr.dcproject.entity.Follow as FollowEntity import fr.dcproject.repository.FollowArticle as FollowArticleRepository @KtorExperimentalLocationsAPI object FollowArticlePaths { @Location("/articles/{article}/follows") - class ArticleFollowRequest(val article: ArticleEntity) + class ArticleFollowRequest(val article: ArticleRef) @Location("/citizens/{citizen}/follows/articles") class CitizenFollowArticleRequest(val citizen: Citizen) diff --git a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt index dcde0e8..2615c6c 100644 --- a/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt +++ b/src/main/kotlin/fr/dcproject/routes/FollowConstitution.kt @@ -1,7 +1,8 @@ package fr.dcproject.routes import fr.dcproject.citizen -import fr.dcproject.entity.Citizen +import fr.dcproject.entity.CitizenRef +import fr.dcproject.entity.ConstitutionRef import fr.dcproject.security.voter.FollowVoter.Action.* import fr.dcproject.security.voter.assertCan import io.ktor.application.call @@ -9,17 +10,16 @@ import io.ktor.http.HttpStatusCode import io.ktor.locations.* import io.ktor.response.respond import io.ktor.routing.Route -import fr.dcproject.entity.Constitution as ConstitutionEntity import fr.dcproject.entity.Follow as FollowEntity import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository @KtorExperimentalLocationsAPI object FollowConstitutionPaths { @Location("/constitutions/{constitution}/follow") - class ConstitutionFollowRequest(val constitution: ConstitutionEntity) + class ConstitutionFollowRequest(val constitution: ConstitutionRef) @Location("/citizens/{citizen}/follows/constitutions") - class CitizenFollowConstitutionRequest(val citizen: Citizen) + class CitizenFollowConstitutionRequest(val citizen: CitizenRef) } @KtorExperimentalLocationsAPI diff --git a/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt b/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt index c2f867c..0df1d63 100644 --- a/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt +++ b/src/main/kotlin/fr/dcproject/routes/OpinionArticle.kt @@ -2,6 +2,7 @@ package fr.dcproject.routes import fr.dcproject.citizen import fr.dcproject.entity.Citizen +import fr.dcproject.entity.CitizenRef import fr.dcproject.entity.OpinionArticle import fr.dcproject.entity.OpinionChoiceRef import fr.dcproject.entity.request.RequestBuilder @@ -36,7 +37,7 @@ object OpinionArticlePaths { */ @Location("/citizens/{citizen}/opinions/articles") class CitizenOpinionArticleRequest( - val citizen: CitizenEntity, + val citizen: CitizenRef, page: Int = 1, limit: Int = 50 ) : PaginatedRequestI by PaginatedRequest(page, limit)