From d87b4333989827877dfe9e22d1ff410661c9aa23 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Sun, 17 Jan 2021 00:05:37 +0100 Subject: [PATCH] Move Comment article to a Component --- src/main/kotlin/Application.kt | 8 +- .../article/CommentArticleRepository.kt | 3 +- .../article/routes/CreateCommentArticle.kt | 44 ++++++++++ .../article/routes/GetArticleComments.kt | 37 +++++++++ .../routes/GetCitizenArticleComments.kt | 26 ++++++ src/main/kotlin/routes/CommentArticle.kt | 80 ------------------- 6 files changed, 116 insertions(+), 82 deletions(-) create mode 100644 src/main/kotlin/component/comment/article/routes/CreateCommentArticle.kt create mode 100644 src/main/kotlin/component/comment/article/routes/GetArticleComments.kt create mode 100644 src/main/kotlin/component/comment/article/routes/GetCitizenArticleComments.kt delete mode 100644 src/main/kotlin/routes/CommentArticle.kt diff --git a/src/main/kotlin/Application.kt b/src/main/kotlin/Application.kt index 56b2fe6..ba1fbcc 100644 --- a/src/main/kotlin/Application.kt +++ b/src/main/kotlin/Application.kt @@ -26,6 +26,9 @@ import fr.dcproject.component.auth.UserRepository import fr.dcproject.component.auth.routes.authLogin import fr.dcproject.component.auth.routes.authRegister import fr.dcproject.component.auth.routes.authSso +import fr.dcproject.component.comment.article.routes.createCommentArticle +import fr.dcproject.component.comment.article.routes.getArticleComments +import fr.dcproject.component.comment.article.routes.getCitizenArticleComments import fr.dcproject.event.EventNotification import fr.dcproject.event.EventSubscriber import fr.dcproject.routes.* @@ -175,6 +178,10 @@ fun Application.module(env: Env = PROD) { getOneComment(get(), get()) createCommentChildren(get(), get()) getChildrenComments(get(), get()) + /* Comment Article */ + getArticleComments(get(), get()) + createCommentArticle(get(), get()) + getCitizenArticleComments(get(), get()) /* Auth */ authLogin(get()) authRegister(get()) @@ -183,7 +190,6 @@ fun Application.module(env: Env = PROD) { constitution(get()) followArticle(get()) followConstitution(get()) - commentArticle(get(), get()) commentConstitution(get(), get()) voteArticle(get(), get(), get()) voteConstitution(get()) diff --git a/src/main/kotlin/component/comment/article/CommentArticleRepository.kt b/src/main/kotlin/component/comment/article/CommentArticleRepository.kt index 27ff7f9..c266081 100644 --- a/src/main/kotlin/component/comment/article/CommentArticleRepository.kt +++ b/src/main/kotlin/component/comment/article/CommentArticleRepository.kt @@ -48,7 +48,8 @@ class CommentArticleRepository(requester: Requester) : CommentRepositoryAbs().run { + CommentForUpdate( + target = article, + createdBy = call.citizen, + content = content + ) + } +} + +@KtorExperimentalLocationsAPI +fun Route.createCommentArticle(repo: CommentArticleRepository, voter: CommentVoter) { + post { + it.getComment(call).let { comment -> + voter.assert { canCreate(comment, citizenOrNull) } + repo.comment(comment) + call.respond(HttpStatusCode.Created, comment) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/component/comment/article/routes/GetArticleComments.kt b/src/main/kotlin/component/comment/article/routes/GetArticleComments.kt new file mode 100644 index 0000000..2dda5bb --- /dev/null +++ b/src/main/kotlin/component/comment/article/routes/GetArticleComments.kt @@ -0,0 +1,37 @@ +package fr.dcproject.component.comment.article.routes + +import fr.dcproject.citizenOrNull +import fr.dcproject.component.article.ArticleRef +import fr.dcproject.component.comment.article.CommentArticleRepository +import fr.dcproject.component.comment.generic.CommentVoter +import fr.dcproject.voter.assert +import io.ktor.application.* +import io.ktor.http.* +import io.ktor.locations.* +import io.ktor.response.* +import io.ktor.routing.* + +@KtorExperimentalLocationsAPI +@Location("/articles/{article}/comments") +class ArticleCommentsRequest( + val article: ArticleRef, + page: Int = 1, + limit: Int = 50, + val search: String? = null, + sort: String = CommentArticleRepository.Sort.CREATED_AT.sql +) { + val page: Int = if (page < 1) 1 else page + val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit + val sort: CommentArticleRepository.Sort = CommentArticleRepository.Sort.fromString(sort) ?: CommentArticleRepository.Sort.CREATED_AT +} + +@KtorExperimentalLocationsAPI +fun Route.getArticleComments(repo: CommentArticleRepository, voter: CommentVoter) { + get { + val comment = repo.findByTarget(it.article, it.page, it.limit, it.sort) + if (comment.result.isNotEmpty()) { + voter.assert { canView(comment.result, citizenOrNull) } + } + call.respond(HttpStatusCode.OK, comment) + } +} diff --git a/src/main/kotlin/component/comment/article/routes/GetCitizenArticleComments.kt b/src/main/kotlin/component/comment/article/routes/GetCitizenArticleComments.kt new file mode 100644 index 0000000..f7a932c --- /dev/null +++ b/src/main/kotlin/component/comment/article/routes/GetCitizenArticleComments.kt @@ -0,0 +1,26 @@ +package fr.dcproject.component.comment.article.routes + +import fr.dcproject.citizenOrNull +import fr.dcproject.component.citizen.Citizen +import fr.dcproject.component.comment.article.CommentArticleRepository +import fr.dcproject.component.comment.generic.CommentVoter +import fr.dcproject.voter.assert +import io.ktor.application.* +import io.ktor.locations.* +import io.ktor.response.* +import io.ktor.routing.* + + +@KtorExperimentalLocationsAPI +@Location("/citizens/{citizen}/comments/articles") +class CitizenCommentArticleRequest(val citizen: Citizen) + +@KtorExperimentalLocationsAPI +fun Route.getCitizenArticleComments(repo: CommentArticleRepository, voter: CommentVoter) { + get { + repo.findByCitizen(it.citizen).let { comments -> + voter.assert { canView(comments.result, citizenOrNull) } + call.respond(comments) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/routes/CommentArticle.kt b/src/main/kotlin/routes/CommentArticle.kt deleted file mode 100644 index 1bd6cb4..0000000 --- a/src/main/kotlin/routes/CommentArticle.kt +++ /dev/null @@ -1,80 +0,0 @@ -package fr.dcproject.routes - -import fr.dcproject.citizen -import fr.dcproject.citizenOrNull -import fr.dcproject.component.article.ArticleForView -import fr.dcproject.component.article.ArticleRef -import fr.dcproject.component.citizen.Citizen -import fr.dcproject.component.comment.article.CommentArticleRepository -import fr.dcproject.component.comment.article.CommentArticleRepository.Sort -import fr.dcproject.component.comment.generic.CommentForUpdate -import fr.dcproject.component.comment.generic.CommentVoter -import fr.dcproject.voter.assert -import io.ktor.application.* -import io.ktor.http.* -import io.ktor.locations.* -import io.ktor.request.* -import io.ktor.response.* -import io.ktor.routing.* - -@KtorExperimentalLocationsAPI -object CommentArticlePaths { - @Location("/articles/{article}/comments") - class ArticleCommentRequest( - val article: ArticleRef, - page: Int = 1, - limit: Int = 50, - val search: String? = null, - sort: String = Sort.CREATED_AT.sql - ) { - val page: Int = if (page < 1) 1 else page - val limit: Int = if (limit > 50) 50 else if (limit < 1) 1 else limit - val sort: Sort = Sort.fromString(sort) ?: Sort.CREATED_AT - } - - @Location("/articles/{article}/comments") - class PostArticleCommentRequest( - val article: ArticleForView - ) { - class Comment( - val content: String - ) - - suspend fun getComment(call: ApplicationCall) = call.receive().run { - CommentForUpdate( - target = article, - createdBy = call.citizen, - content = content - ) - } - } - - @Location("/citizens/{citizen}/comments/articles") - class CitizenCommentArticleRequest(val citizen: Citizen) -} - -@KtorExperimentalLocationsAPI -fun Route.commentArticle(repo: CommentArticleRepository, voter: CommentVoter) { - get { - val comment = repo.findByTarget(it.article, it.page, it.limit, it.sort) - if (comment.result.isNotEmpty()) { - voter.assert { canView(comment.result, citizenOrNull) } - } - call.respond(HttpStatusCode.OK, comment) - } - - post { - it.getComment(call).let { comment -> - voter.assert { canCreate(comment, citizenOrNull) } - repo.comment(comment) - call.respond(HttpStatusCode.Created, comment) - } - } - - get { - repo.findByCitizen(it.citizen).let { comments -> - voter.assert { canView(comments.result, citizenOrNull) } - call.respond(comments) - } - } -} \ No newline at end of file