Remove Deprecated Article Entities

This commit is contained in:
2021-01-23 00:54:53 +01:00
parent 49a03a57cb
commit f34407962b
8 changed files with 35 additions and 65 deletions

View File

@@ -9,6 +9,7 @@ import com.fasterxml.jackson.datatype.joda.JodaModule
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.rabbitmq.client.ConnectionFactory import com.rabbitmq.client.ConnectionFactory
import fr.dcproject.component.article.ArticleAccessControl import fr.dcproject.component.article.ArticleAccessControl
import fr.dcproject.component.article.ArticleForView
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.PasswordlessAuth import fr.dcproject.component.auth.PasswordlessAuth
@@ -143,7 +144,7 @@ val KoinModule = module {
).build() ).build()
} }
single { ArticleViewManager(get()) } single { ArticleViewManager<ArticleForView>(get()) }
// Mailer // Mailer
single { Mailer(Configuration.sendGridKey) } single { Mailer(Configuration.sendGridKey) }

View File

@@ -1,13 +1,10 @@
package fr.dcproject.component.article package fr.dcproject.component.article
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenBasicI
import fr.dcproject.component.citizen.CitizenCart import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenCartI import fr.dcproject.component.citizen.CitizenCartI
import fr.dcproject.component.citizen.CitizenI import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRef import fr.dcproject.component.citizen.CitizenRef
import fr.dcproject.component.opinion.entity.Opinionable import fr.dcproject.component.opinion.entity.Opinionable
import fr.dcproject.component.opinion.entity.OpinionableImp
import fr.dcproject.component.opinion.entity.Opinions import fr.dcproject.component.opinion.entity.Opinions
import fr.dcproject.component.vote.entity.Votable import fr.dcproject.component.vote.entity.Votable
import fr.dcproject.component.vote.entity.VotableImp import fr.dcproject.component.vote.entity.VotableImp
@@ -16,18 +13,15 @@ import fr.dcproject.component.workgroup.WorkgroupCartI
import fr.dcproject.component.workgroup.WorkgroupRef import fr.dcproject.component.workgroup.WorkgroupRef
import fr.dcproject.component.workgroup.WorkgroupSimple import fr.dcproject.component.workgroup.WorkgroupSimple
import fr.dcproject.entity.CreatedBy import fr.dcproject.entity.CreatedBy
import fr.dcproject.entity.CreatedByImp
import fr.dcproject.entity.TargetI import fr.dcproject.entity.TargetI
import fr.dcproject.entity.TargetRef import fr.dcproject.entity.TargetRef
import fr.dcproject.entity.VersionableRef import fr.dcproject.entity.VersionableRef
import fr.dcproject.entity.VersionableRefImp
import fr.postgresjson.entity.EntityCreatedAt import fr.postgresjson.entity.EntityCreatedAt
import fr.postgresjson.entity.EntityCreatedAtImp import fr.postgresjson.entity.EntityCreatedAtImp
import fr.postgresjson.entity.EntityDeletedAt import fr.postgresjson.entity.EntityDeletedAt
import fr.postgresjson.entity.EntityDeletedAtImp import fr.postgresjson.entity.EntityDeletedAtImp
import fr.postgresjson.entity.EntityVersioning import fr.postgresjson.entity.EntityVersioning
import fr.postgresjson.entity.UuidEntityI import fr.postgresjson.entity.UuidEntityI
import fr.postgresjson.entity.UuidEntityVersioning
import org.joda.time.DateTime import org.joda.time.DateTime
import java.util.UUID import java.util.UUID
@@ -51,7 +45,7 @@ data class ArticleForView(
EntityVersioning<UUID, Int>, EntityVersioning<UUID, Int>,
EntityCreatedAt by EntityCreatedAtImp(), EntityCreatedAt by EntityCreatedAtImp(),
EntityDeletedAt by EntityDeletedAtImp(deletedAt), EntityDeletedAt by EntityDeletedAtImp(deletedAt),
ArticleRefVersioningI, VersionableRef,
Opinionable, Opinionable,
Votable by VotableImp() { Votable by VotableImp() {
val lastVersion: Boolean = false val lastVersion: Boolean = false
@@ -66,7 +60,7 @@ interface ArticleForUpdateI<C : CitizenRef> : ArticleI, ArticleWithTitleI, Versi
} }
class ArticleForUpdate( class ArticleForUpdate(
id: UUID? = null, override val id: UUID = UUID.randomUUID(),
override val title: String, override val title: String,
override val anonymous: Boolean = true, override val anonymous: Boolean = true,
override val content: String, override val content: String,
@@ -75,30 +69,15 @@ class ArticleForUpdate(
override val draft: Boolean = false, override val draft: Boolean = false,
override val createdBy: CitizenRef, override val createdBy: CitizenRef,
override val workgroup: WorkgroupRef? = null, override val workgroup: WorkgroupRef? = null,
versionId: UUID? = null, override val versionId: UUID = UUID.randomUUID(),
override val deletedAt: DateTime? = null override val deletedAt: DateTime? = null,
) : ArticleForUpdateI<CitizenRef>, ) : ArticleRef(id),
ArticleForUpdateI<CitizenRef>,
ArticleAuthI<CitizenRef>, ArticleAuthI<CitizenRef>,
ArticleRefVersioningI by ArticleRefVersioningImmutable(id, versionId = versionId ?: UUID.randomUUID()) { VersionableRef {
val tags: List<String> = tags.distinct() val tags: List<String> = tags.distinct()
val isNew = versionId == null
} }
@Deprecated("")
open class ArticleSimple(
id: UUID = UUID.randomUUID(),
var title: String,
override val createdBy: CitizenBasic,
override var draft: Boolean = false,
var workgroup: WorkgroupSimple<CitizenRef>? = null
) : ArticleAuthI<CitizenBasicI>,
ArticleRefVersioning(id),
EntityCreatedAt by EntityCreatedAtImp(),
CreatedBy<CitizenBasicI> by CreatedByImp(createdBy),
EntityDeletedAt by EntityDeletedAtImp(),
Votable by VotableImp(),
Opinionable by OpinionableImp()
class ArticleForListing( class ArticleForListing(
id: UUID? = null, id: UUID? = null,
override val title: String, override val title: String,
@@ -116,24 +95,6 @@ interface ArticleForListingI : ArticleWithTitleI, CreatedBy<CitizenCartI> {
val workgroup: WorkgroupCartI? val workgroup: WorkgroupCartI?
} }
@Deprecated("", ReplaceWith("ArticleRefVersioningImmutable"))
open class ArticleRefVersioning(
id: UUID = UUID.randomUUID(),
override var versionNumber: Int = 0,
versionId: UUID = UUID.randomUUID()
) : ArticleRefVersioningI,
ArticleRef(id),
EntityVersioning<UUID, Int> by UuidEntityVersioning(versionNumber, versionId)
open class ArticleRefVersioningImmutable(
id: UUID? = null,
versionId: UUID = UUID.randomUUID()
) : ArticleRefVersioningI,
ArticleRef(id),
VersionableRef by VersionableRefImp(versionId)
interface ArticleRefVersioningI : ArticleI, VersionableRef
open class ArticleRef( open class ArticleRef(
id: UUID? = null id: UUID? = null
) : ArticleI, TargetRef(id) ) : ArticleI, TargetRef(id)

View File

@@ -2,6 +2,7 @@ package fr.dcproject.component.article
import fr.dcproject.component.citizen.CitizenI import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.views.ViewManager import fr.dcproject.component.views.ViewManager
import fr.dcproject.entity.VersionableRef
import fr.dcproject.entity.ViewAggregation import fr.dcproject.entity.ViewAggregation
import fr.dcproject.utils.contentToString import fr.dcproject.utils.contentToString
import fr.dcproject.utils.getJsonField import fr.dcproject.utils.getJsonField
@@ -15,11 +16,11 @@ import java.util.UUID
/** /**
* Wrapper for manage views with elasticsearch * Wrapper for manage views with elasticsearch
*/ */
class ArticleViewManager(private val restClient: RestClient) : ViewManager<ArticleRefVersioningI> { class ArticleViewManager <A> (private val restClient: RestClient) : ViewManager<A> where A : VersionableRef, A : ArticleI {
/** /**
* Add view on article to elasticsearch * Add view on article to elasticsearch
*/ */
override fun addView(ip: String, article: ArticleRefVersioningI, citizen: CitizenI?, dateTime: DateTime): Response? { override fun addView(ip: String, entity: A, citizen: CitizenI?, dateTime: DateTime): Response? {
val isLogged = (citizen != null).toString() val isLogged = (citizen != null).toString()
val ref = citizen?.id ?: UUID.nameUUIDFromBytes(ip.toByteArray())!! val ref = citizen?.id ?: UUID.nameUUIDFromBytes(ip.toByteArray())!!
val request = Request( val request = Request(
@@ -34,8 +35,8 @@ class ArticleViewManager(private val restClient: RestClient) : ViewManager<Artic
"type": "article", "type": "article",
"user_ref": "$ref", "user_ref": "$ref",
"ip": "$ip", "ip": "$ip",
"id": "${article.id}", "id": "${entity.id}",
"version_id": "${article.versionId}", "version_id": "${entity.versionId}",
"citizen_id": "${citizen?.id}", "citizen_id": "${citizen?.id}",
"view_at": "${dateTime.toIso()}" "view_at": "${dateTime.toIso()}"
} }
@@ -49,7 +50,7 @@ class ArticleViewManager(private val restClient: RestClient) : ViewManager<Artic
/** /**
* Get article views aggregations from elasticsearch * Get article views aggregations from elasticsearch
*/ */
override fun getViewsCount(article: ArticleRefVersioningI): ViewAggregation { override fun getViewsCount(entity: A): ViewAggregation {
val request = Request( val request = Request(
"GET", "GET",
"/views/_search" "/views/_search"
@@ -63,7 +64,7 @@ class ArticleViewManager(private val restClient: RestClient) : ViewManager<Artic
"bool": { "bool": {
"must": { "must": {
"term": { "term": {
"version_id": "${article.versionId}" "version_id": "${entity.versionId}"
} }
} }
} }

View File

@@ -53,7 +53,7 @@ object GetOneArticle {
} }
} }
fun Route.getOneArticle(viewManager: ArticleViewManager, ac: ArticleAccessControl) { fun Route.getOneArticle(viewManager: ArticleViewManager<ArticleForView>, ac: ArticleAccessControl) {
get<ArticleRequest> { get<ArticleRequest> {
ac.assert { canView(it.article, citizenOrNull) } ac.assert { canView(it.article, citizenOrNull) }

View File

@@ -34,7 +34,7 @@ object UpsertArticle {
val description: String, val description: String,
val tags: List<String> = emptyList(), val tags: List<String> = emptyList(),
val draft: Boolean = false, val draft: Boolean = false,
val versionId: UUID?, val versionId: UUID,
val workgroup: WorkgroupRef? = null val workgroup: WorkgroupRef? = null
) )
} }
@@ -50,7 +50,7 @@ object UpsertArticle {
tags = tags, tags = tags,
draft = draft, draft = draft,
createdBy = citizen, createdBy = citizen,
workgroup = if (workgroup != null) workgroupRepository.findById(workgroup.id) else null, workgroup = workgroup,
versionId = versionId versionId = versionId
) )
} }

View File

@@ -1,7 +1,7 @@
package fr.dcproject.entity package fr.dcproject.entity
import fr.dcproject.component.article.ArticleForListing
import fr.dcproject.component.article.ArticleI import fr.dcproject.component.article.ArticleI
import fr.dcproject.component.article.ArticleSimple
import fr.dcproject.component.citizen.CitizenSimple import fr.dcproject.component.citizen.CitizenSimple
import fr.dcproject.component.citizen.CitizenWithUserI import fr.dcproject.component.citizen.CitizenWithUserI
import fr.postgresjson.entity.EntityCreatedAt import fr.postgresjson.entity.EntityCreatedAt
@@ -19,11 +19,11 @@ class Constitution(
id: UUID = UUID.randomUUID(), id: UUID = UUID.randomUUID(),
title: String, title: String,
anonymous: Boolean = true, anonymous: Boolean = true,
titles: MutableList<TitleSimple<ArticleSimple>> = mutableListOf(), titles: MutableList<TitleSimple<ArticleForListing>> = mutableListOf(),
draft: Boolean = false, draft: Boolean = false,
lastVersion: Boolean = false, lastVersion: Boolean = false,
override val createdBy: CitizenSimple override val createdBy: CitizenSimple
) : ConstitutionSimple<CitizenSimple, ConstitutionSimple.TitleSimple<ArticleSimple>>( ) : ConstitutionSimple<CitizenSimple, ConstitutionSimple.TitleSimple<ArticleForListing>>(
id, id,
title = title, title = title,
anonymous = anonymous, anonymous = anonymous,
@@ -37,8 +37,8 @@ class Constitution(
id: UUID = UUID.randomUUID(), id: UUID = UUID.randomUUID(),
name: String, name: String,
rank: Int? = null, rank: Int? = null,
override val articles: MutableList<ArticleSimple> = mutableListOf() override val articles: MutableList<ArticleForListing> = mutableListOf()
) : ConstitutionSimple.TitleSimple<ArticleSimple>(id, name, rank) ) : ConstitutionSimple.TitleSimple<ArticleForListing>(id, name, rank)
} }
open class ConstitutionSimple<Cr : CitizenWithUserI, T : ConstitutionSimple.TitleSimple<*>>( open class ConstitutionSimple<Cr : CitizenWithUserI, T : ConstitutionSimple.TitleSimple<*>>(

View File

@@ -2,7 +2,7 @@ package functional
import fr.dcproject.application.Env.TEST import fr.dcproject.application.Env.TEST
import fr.dcproject.application.module import fr.dcproject.application.module
import fr.dcproject.component.article.ArticleRefVersioning import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.article.ArticleViewManager import fr.dcproject.component.article.ArticleViewManager
import fr.dcproject.component.citizen.CitizenRef import fr.dcproject.component.citizen.CitizenRef
import io.ktor.locations.KtorExperimentalLocationsAPI import io.ktor.locations.KtorExperimentalLocationsAPI
@@ -23,11 +23,18 @@ import java.util.UUID
class ViewTest { class ViewTest {
@Test @Test
fun `test View Article`() { fun `test View Article`() {
val article = ArticleRefVersioning(id = UUID.randomUUID(), versionId = UUID.randomUUID()) val article = ArticleForView(
id = UUID.randomUUID(),
versionId = UUID.randomUUID(),
createdBy = CitizenRef(),
content = "",
description = "",
title = ""
)
val citizenRef = CitizenRef() val citizenRef = CitizenRef()
withTestApplication({ module(TEST) }) { withTestApplication({ module(TEST) }) {
val viewManager: ArticleViewManager = application.get() val viewManager: ArticleViewManager<ArticleForView> = application.get()
/* Get view before */ /* Get view before */
val startView = viewManager.getViewsCount(article) val startView = viewManager.getViewsCount(article)

View File

@@ -71,7 +71,7 @@ class ArticleSteps : En, KoinTest {
} }
val article = ArticleForUpdate( val article = ArticleForUpdate(
id = id ?: params?.get("id")?.toUUID(), id = id ?: params?.get("id")?.toUUID() ?: UUID.randomUUID(),
title = "hello", title = "hello",
content = "bla bla bla", content = "bla bla bla",
description = "A super article", description = "A super article",