From 07ae50c40a0cb6c53dcb8546e8588cdc0360d8f8 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Wed, 17 Mar 2021 17:48:42 +0100 Subject: [PATCH] Test openapi schema of /articles/{article}/comments --- .../database/CommentArticleRepository.kt | 32 ++++++----- .../article/routes/GetArticleComments.kt | 54 +++++++++++++++++-- .../database/CommentConstitutionRepository.kt | 8 +-- .../comment/generic/database/Comment.kt | 7 +-- .../generic/database/CommentRepository.kt | 43 ++++++++------- .../vote/database/VoteRepositoryAbs.kt | 14 ++--- src/main/resources/openapi2.yaml | 35 ++++++++++++ 7 files changed, 142 insertions(+), 51 deletions(-) diff --git a/src/main/kotlin/fr/dcproject/component/comment/article/database/CommentArticleRepository.kt b/src/main/kotlin/fr/dcproject/component/comment/article/database/CommentArticleRepository.kt index 22d5dec..4c7f1a4 100644 --- a/src/main/kotlin/fr/dcproject/component/comment/article/database/CommentArticleRepository.kt +++ b/src/main/kotlin/fr/dcproject/component/comment/article/database/CommentArticleRepository.kt @@ -4,8 +4,9 @@ import fr.dcproject.common.entity.EntityI import fr.dcproject.common.entity.TargetI import fr.dcproject.component.article.database.ArticleForView import fr.dcproject.component.article.database.ArticleRef +import fr.dcproject.component.citizen.database.CitizenCreator +import fr.dcproject.component.citizen.database.CitizenCreatorI import fr.dcproject.component.citizen.database.CitizenI -import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.comment.generic.database.CommentForView import fr.dcproject.component.comment.generic.database.CommentRepositoryAbs import fr.postgresjson.connexion.Paginated @@ -13,25 +14,26 @@ import fr.postgresjson.connexion.Requester import java.util.UUID class CommentArticleRepository(requester: Requester) : CommentRepositoryAbs(requester) { - override fun findById(id: UUID): CommentForView? { + override fun findById(id: UUID): CommentForView? { return requester .getFunction("find_comment_by_id") - .selectOne(mapOf("id" to id)) + .selectOne>(mapOf("id" to id)) + as CommentForView? } override fun findByCitizen( citizen: CitizenI, page: Int, limit: Int - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_citizen") - .select( + .select>( page, limit, "created_by_id" to citizen.id, "reference" to TargetI.getReference(ArticleRef::class) - ) + ) as Paginated> } } @@ -40,14 +42,16 @@ class CommentArticleRepository(requester: Requester) : CommentRepositoryAbs> = requester - .getFunction("find_comments_by_target") - .select( - page, - limit, - "target_id" to target.id, - "sort" to sort.sql - ) + ): Paginated> { + return requester + .getFunction("find_comments_by_target") + .select>( + page, + limit, + "target_id" to target.id, + "sort" to sort.sql + ) as Paginated> + } enum class Sort(val sql: String) { CREATED_AT("created_at"), diff --git a/src/main/kotlin/fr/dcproject/component/comment/article/routes/GetArticleComments.kt b/src/main/kotlin/fr/dcproject/component/comment/article/routes/GetArticleComments.kt index e7415f3..62c394a 100644 --- a/src/main/kotlin/fr/dcproject/component/comment/article/routes/GetArticleComments.kt +++ b/src/main/kotlin/fr/dcproject/component/comment/article/routes/GetArticleComments.kt @@ -1,5 +1,6 @@ package fr.dcproject.component.comment.article.routes +import fr.dcproject.common.dto.toOutput import fr.dcproject.common.security.assert import fr.dcproject.component.article.database.ArticleRef import fr.dcproject.component.auth.citizenOrNull @@ -14,6 +15,7 @@ import io.ktor.locations.Location import io.ktor.locations.get import io.ktor.response.respond import io.ktor.routing.Route +import org.joda.time.DateTime import java.util.UUID @KtorExperimentalLocationsAPI @@ -32,11 +34,55 @@ object GetArticleComments { fun Route.getArticleComments(repo: CommentArticleRepository, ac: CommentAccessControl) { get { - val comment = repo.findByTarget(it.article, it.page, it.limit, it.sort) - if (comment.result.isNotEmpty()) { - ac.assert { canView(comment.result, citizenOrNull) } + val comments = repo.findByTarget(it.article, it.page, it.limit, it.sort) + if (comments.result.isNotEmpty()) { + ac.assert { canView(comments.result, citizenOrNull) } } - call.respond(HttpStatusCode.OK, comment) + call.respond( + HttpStatusCode.OK, + comments.toOutput { comment -> + object { + val id: UUID = comment.id + val content: String = comment.content + val createdAt: DateTime = comment.createdAt + val parent: Any? = comment.parent?.let { p -> + object { + val id: UUID = p.id + val reference: String = p.reference + } + } + val target: Any = comment.target.let { t -> + object { + val id: UUID = t.id + val reference: String = t.reference + } + } + val createdBy: Any = comment.createdBy.let { c -> + object { + val id: UUID = c.id + val name: Any = c.name.let { n -> + object { + val firstName: String = n.firstName + val lastName: String = n.lastName + } + } + val user: Any = c.user.let { u -> + object { + val username: String = u.username + } + } + } + } + val votes: Any = object { + val up: Int = 0 + val neutral: Int = 0 + val down: Int = 0 + val total: Int = 0 + val score: Int = 0 + } + } + } + ) } } } diff --git a/src/main/kotlin/fr/dcproject/component/comment/constitution/database/CommentConstitutionRepository.kt b/src/main/kotlin/fr/dcproject/component/comment/constitution/database/CommentConstitutionRepository.kt index 64cd70b..7a96d52 100644 --- a/src/main/kotlin/fr/dcproject/component/comment/constitution/database/CommentConstitutionRepository.kt +++ b/src/main/kotlin/fr/dcproject/component/comment/constitution/database/CommentConstitutionRepository.kt @@ -2,8 +2,8 @@ package fr.dcproject.component.comment.constitution.database import fr.dcproject.common.entity.EntityI import fr.dcproject.common.entity.TargetI +import fr.dcproject.component.citizen.database.CitizenCreatorI import fr.dcproject.component.citizen.database.CitizenI -import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.comment.article.database.CommentArticleRepository import fr.dcproject.component.comment.generic.database.CommentForView import fr.dcproject.component.comment.generic.database.CommentRepositoryAbs @@ -13,7 +13,7 @@ import fr.postgresjson.connexion.Requester import java.util.UUID class CommentConstitutionRepository(requester: Requester) : CommentRepositoryAbs(requester) { - override fun findById(id: UUID): CommentForView? { + override fun findById(id: UUID): CommentForView? { return requester .getFunction("find_comment_by_id") .selectOne(mapOf("id" to id)) @@ -23,7 +23,7 @@ class CommentConstitutionRepository(requester: Requester) : CommentRepositoryAbs citizen: CitizenI, page: Int, limit: Int - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_citizen") .select( @@ -40,7 +40,7 @@ class CommentConstitutionRepository(requester: Requester) : CommentRepositoryAbs page: Int, limit: Int, sort: CommentArticleRepository.Sort - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_target") .select( diff --git a/src/main/kotlin/fr/dcproject/component/comment/generic/database/Comment.kt b/src/main/kotlin/fr/dcproject/component/comment/generic/database/Comment.kt index 3b2586c..e18cdf6 100644 --- a/src/main/kotlin/fr/dcproject/component/comment/generic/database/Comment.kt +++ b/src/main/kotlin/fr/dcproject/component/comment/generic/database/Comment.kt @@ -9,13 +9,14 @@ import fr.dcproject.common.entity.HasTarget import fr.dcproject.common.entity.TargetI import fr.dcproject.common.entity.TargetRef import fr.dcproject.common.entity.UpdatedAt -import fr.dcproject.component.citizen.database.CitizenRef +import fr.dcproject.component.citizen.database.CitizenCreatorI +import fr.dcproject.component.citizen.database.CitizenI import fr.dcproject.component.vote.entity.Votable import fr.dcproject.component.vote.entity.VotableImp import org.joda.time.DateTime import java.util.UUID -class CommentForView( +class CommentForView( id: UUID = UUID.randomUUID(), override val createdBy: C, override val target: T, @@ -44,7 +45,7 @@ class CommentForView( ) } -open class CommentForUpdate( +open class CommentForUpdate( override val id: UUID = UUID.randomUUID(), override val createdBy: C, override val target: T, diff --git a/src/main/kotlin/fr/dcproject/component/comment/generic/database/CommentRepository.kt b/src/main/kotlin/fr/dcproject/component/comment/generic/database/CommentRepository.kt index 13d0384..8cf12c7 100644 --- a/src/main/kotlin/fr/dcproject/component/comment/generic/database/CommentRepository.kt +++ b/src/main/kotlin/fr/dcproject/component/comment/generic/database/CommentRepository.kt @@ -3,8 +3,9 @@ package fr.dcproject.component.comment.generic.database import fr.dcproject.common.entity.EntityI import fr.dcproject.common.entity.TargetI import fr.dcproject.common.entity.TargetRef +import fr.dcproject.component.citizen.database.CitizenCreator +import fr.dcproject.component.citizen.database.CitizenCreatorI import fr.dcproject.component.citizen.database.CitizenI -import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.comment.article.database.CommentArticleRepository import fr.postgresjson.connexion.Paginated import fr.postgresjson.connexion.Requester @@ -12,19 +13,19 @@ import fr.postgresjson.repository.RepositoryI import java.util.UUID abstract class CommentRepositoryAbs(override var requester: Requester) : RepositoryI { - abstract fun findById(id: UUID): CommentForView? + abstract fun findById(id: UUID): CommentForView? abstract fun findByCitizen( citizen: CitizenI, page: Int = 1, limit: Int = 50 - ): Paginated> + ): Paginated> open fun findByParent( - parent: CommentForView, + parent: CommentForView, page: Int = 1, limit: Int = 50 - ): Paginated> { + ): Paginated> { return findByParent(parent.id, page, limit) } @@ -32,14 +33,15 @@ abstract class CommentRepositoryAbs(override var requester: Request parentId: UUID, page: Int = 1, limit: Int = 50 - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_parent") - .select( + .select>( page, limit, "parent_id" to parentId ) + as Paginated> } } @@ -48,7 +50,7 @@ abstract class CommentRepositoryAbs(override var requester: Request page: Int = 1, limit: Int = 50, sort: CommentArticleRepository.Sort = CommentArticleRepository.Sort.CREATED_AT - ): Paginated> { + ): Paginated> { return findByTarget(target.id, page, limit, sort) } @@ -57,19 +59,20 @@ abstract class CommentRepositoryAbs(override var requester: Request page: Int = 1, limit: Int = 50, sort: CommentArticleRepository.Sort = CommentArticleRepository.Sort.CREATED_AT - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_target") - .select( + .select>( page, limit, "target_id" to targetId, "sort" to sort.sql ) + as Paginated> } } - fun comment(comment: CommentForUpdate) { + fun comment(comment: CommentForUpdate) { requester .getFunction("comment") .sendQuery( @@ -78,7 +81,7 @@ abstract class CommentRepositoryAbs(override var requester: Request ) } - fun edit(comment: CommentForUpdate) { + fun edit(comment: CommentForUpdate) { requester .getFunction("edit_comment") .sendQuery( @@ -89,24 +92,25 @@ abstract class CommentRepositoryAbs(override var requester: Request } class CommentRepository(requester: Requester) : CommentRepositoryAbs(requester) { - override fun findById(id: UUID): CommentForView? { + override fun findById(id: UUID): CommentForView? { return requester .getFunction("find_comment_by_id") - .selectOne(mapOf("id" to id)) + .selectOne>(mapOf("id" to id)) + as CommentForView? } override fun findByCitizen( citizen: CitizenI, page: Int, limit: Int - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_citizen") - .select( + .select>( page, limit, "created_by_id" to citizen.id - ) + ) as Paginated> } } @@ -114,14 +118,15 @@ class CommentRepository(requester: Requester) : CommentRepositoryAbs( parentId: UUID, page: Int, limit: Int - ): Paginated> { + ): Paginated> { return requester.run { getFunction("find_comments_by_parent") - .select( + .select>( page, limit, "parent_id" to parentId ) + as Paginated> } } } diff --git a/src/main/kotlin/fr/dcproject/component/vote/database/VoteRepositoryAbs.kt b/src/main/kotlin/fr/dcproject/component/vote/database/VoteRepositoryAbs.kt index df31d9c..9dc6e31 100644 --- a/src/main/kotlin/fr/dcproject/component/vote/database/VoteRepositoryAbs.kt +++ b/src/main/kotlin/fr/dcproject/component/vote/database/VoteRepositoryAbs.kt @@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.type.TypeReference import fr.dcproject.common.entity.TargetI import fr.dcproject.common.entity.TargetRef import fr.dcproject.component.article.database.ArticleForView +import fr.dcproject.component.citizen.database.CitizenCreatorI import fr.dcproject.component.citizen.database.CitizenI -import fr.dcproject.component.citizen.database.CitizenRef import fr.dcproject.component.comment.generic.database.CommentForView import fr.dcproject.component.constitution.database.Constitution import fr.dcproject.component.vote.entity.VoteAggregation @@ -86,31 +86,31 @@ class VoteArticleRepository(requester: Requester) : VoteRepositoryAbs>(requester) { +class VoteArticleCommentRepository(requester: Requester) : VoteRepositoryAbs>(requester) { fun findByCitizen( citizen: CitizenEntity, page: Int = 1, limit: Int = 50 - ): Paginated>> = + ): Paginated>> = findByCitizen( citizen.id, "article", - object : TypeReference>>>() {}, + object : TypeReference>>>() {}, page, limit ) } -class VoteCommentRepository(requester: Requester) : VoteRepositoryAbs>(requester) { +class VoteCommentRepository(requester: Requester) : VoteRepositoryAbs>(requester) { fun findByCitizen( citizen: CitizenEntity, page: Int = 1, limit: Int = 50 - ): Paginated>> = + ): Paginated>> = findByCitizen( citizen.id, "article", - object : TypeReference>>>() {}, + object : TypeReference>>>() {}, page, limit ) diff --git a/src/main/resources/openapi2.yaml b/src/main/resources/openapi2.yaml index 6a660b1..40c2f77 100644 --- a/src/main/resources/openapi2.yaml +++ b/src/main/resources/openapi2.yaml @@ -470,6 +470,41 @@ paths: /articles/{article}/comments: parameters: - $ref: '#/components/parameters/article' + get: + summary: Get comments of one article + tags: + - comment + - article + parameters: + - $ref: '#/components/parameters/page' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/search' + - name: sort + in: query + required: false + example: + - created_at + - votes + schema: + type: string + default: created_at + enum: + - created_at + - votes + responses: + 200: + description: Return Comment and children + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/Paginated' + - type: object + properties: + result: + type: array + items: + $ref: '#/components/schemas/CommentResponse' post: security: - JWTAuth: [ ]