Optimise GetOneArticle

This commit is contained in:
2021-02-04 23:58:53 +01:00
parent f2445f3b25
commit 16eadc0921
2 changed files with 11 additions and 13 deletions

View File

@@ -4,6 +4,7 @@ import fr.dcproject.common.dto.CreatedAt
import fr.dcproject.common.dto.Versionable import fr.dcproject.common.dto.Versionable
import fr.dcproject.component.article.ArticleAccessControl import fr.dcproject.component.article.ArticleAccessControl
import fr.dcproject.component.article.ArticleForView import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.article.ArticleRef
import fr.dcproject.component.article.ArticleRepository import fr.dcproject.component.article.ArticleRepository
import fr.dcproject.component.article.ArticleViewManager import fr.dcproject.component.article.ArticleViewManager
import fr.dcproject.component.auth.citizenOrNull import fr.dcproject.component.auth.citizenOrNull
@@ -20,17 +21,13 @@ import io.ktor.locations.get
import io.ktor.response.respond import io.ktor.response.respond
import io.ktor.routing.Route import io.ktor.routing.Route
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.core.KoinComponent
import org.koin.core.inject
import java.util.UUID import java.util.UUID
@KtorExperimentalLocationsAPI @KtorExperimentalLocationsAPI
object GetOneArticle { object GetOneArticle {
@Location("/articles/{articleId}") @Location("/articles/{article}")
class ArticleRequest(val articleId: UUID) : KoinComponent { class ArticleRequest(article: UUID) {
val repo: ArticleRepository by inject() val article = ArticleRef(article)
val article: ArticleForView = repo.findById(articleId) ?: throw NotFoundException("Article $articleId not found")
} }
class Output( class Output(
@@ -53,19 +50,20 @@ object GetOneArticle {
val workgroup = article.workgroup // TODO change to workgroup DTO val workgroup = article.workgroup // TODO change to workgroup DTO
} }
fun Route.getOneArticle(viewManager: ArticleViewManager<ArticleForView>, ac: ArticleAccessControl) { fun Route.getOneArticle(viewManager: ArticleViewManager<ArticleForView>, ac: ArticleAccessControl, repo: ArticleRepository) {
get<ArticleRequest> { get<ArticleRequest> {
ac.assert { canView(it.article, citizenOrNull) } val article: ArticleForView = repo.findById(it.article.id) ?: throw NotFoundException("Article ${it.article.id} not found")
ac.assert { canView(article, citizenOrNull) }
Output( Output(
it.article, article,
viewManager.getViewsCount(it.article) viewManager.getViewsCount(article)
).also { out -> ).also { out ->
call.respond(out) call.respond(out)
} }
launch { launch {
viewManager.addView(call.request.local.remoteHost, it.article, citizenOrNull) viewManager.addView(call.request.local.remoteHost, article, citizenOrNull)
} }
} }
} }

View File

@@ -14,7 +14,7 @@ fun Routing.installArticleRoutes() {
authenticate(optional = true) { authenticate(optional = true) {
findArticles(get(), get()) findArticles(get(), get())
findArticleVersions(get(), get()) findArticleVersions(get(), get())
getOneArticle(get(), get()) getOneArticle(get(), get(), get())
upsertArticle(get(), get(), get()) upsertArticle(get(), get(), get())
} }
} }