Optimise GetOneArticle
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user