#68 Clean vote and citizen Entity

remove last warnings
This commit is contained in:
2021-03-03 02:25:24 +01:00
parent 2e8215eafc
commit 79feed54dd
17 changed files with 52 additions and 142 deletions

View File

@@ -32,13 +32,12 @@ class Citizen(
override val id: UUID = UUID.randomUUID(),
override val name: Name,
override val email: String,
override val birthday: DateTime,
val birthday: DateTime,
override val voteAnonymous: Boolean = true,
override val followAnonymous: Boolean = true,
override val user: User,
deletedAt: DateTime? = null
) : CitizenFull,
CitizenBasicI,
) : CitizenWithEmail,
CitizenCreatorI,
CitizenWithUserI,
CitizenRef(id),
@@ -75,33 +74,14 @@ interface CitizenCreatorI : CitizenWithUserI, CitizenWithEmail, CitizenCartI, De
override val deletedAt: DateTime?
}
@Deprecated("")
data class CitizenBasic(
override var id: UUID = UUID.randomUUID(),
override var name: Name,
override var email: String,
override var birthday: DateTime,
override var voteAnonymous: Boolean = true,
override var followAnonymous: Boolean = true,
override val user: User,
override val deletedAt: DateTime? = null
) : CitizenBasicI,
CitizenRefWithUser(id, user),
DeletedAt by DeletedAt.Imp(deletedAt)
@Deprecated("")
open class CitizenSimple(
id: UUID = UUID.randomUUID(),
var name: Name,
user: UserRef
) : CitizenRefWithUser(id, user)
class CitizenCart(
id: UUID = UUID.randomUUID(),
override val name: Name,
override val user: UserRef
override val user: UserRef,
override val deletedAt: DateTime? = null,
) : CitizenRef(id),
CitizenCartI
CitizenCartI,
DeletedAt by DeletedAt.Imp(deletedAt)
interface CitizenCartI : CitizenI, CitizenWithUserI {
val name: Name
@@ -133,19 +113,6 @@ interface CitizenI : EntityI {
}
}
@Deprecated("")
interface CitizenBasicI : CitizenWithUserI, CitizenWithEmail, DeletedAt {
val name: Name
val birthday: DateTime
val voteAnonymous: Boolean
val followAnonymous: Boolean
}
@Deprecated("")
interface CitizenFull : CitizenBasicI {
override val user: User
}
interface CitizenWithUserI : CitizenI {
val user: UserI
}

View File

@@ -35,7 +35,7 @@ class CitizenRepository(override var requester: Requester) : RepositoryI {
sort: String? = null,
direction: RepositoryI.Direction? = null,
search: String? = null
): Paginated<CitizenBasic> = requester
): Paginated<CitizenCart> = requester
.getFunction("find_citizens")
.select(
page,

View File

@@ -9,7 +9,7 @@ import fr.dcproject.common.entity.TargetRef
import fr.dcproject.common.entity.VersionableId
import fr.dcproject.component.article.ArticleForListing
import fr.dcproject.component.article.ArticleI
import fr.dcproject.component.citizen.CitizenSimple
import fr.dcproject.component.citizen.CitizenCreator
import fr.dcproject.component.citizen.CitizenWithUserI
import fr.dcproject.component.constitution.ConstitutionSimple.TitleSimple
import java.util.UUID
@@ -21,8 +21,8 @@ class Constitution(
titles: MutableList<TitleSimple<ArticleForListing>> = mutableListOf(),
draft: Boolean = false,
lastVersion: Boolean = false,
override val createdBy: CitizenSimple
) : ConstitutionSimple<CitizenSimple, TitleSimple<ArticleForListing>>(
override val createdBy: CitizenCreator
) : ConstitutionSimple<CitizenCreator, TitleSimple<ArticleForListing>>(
id,
title = title,
anonymous = anonymous,

View File

@@ -8,7 +8,7 @@ import fr.dcproject.common.entity.EntityI
import fr.dcproject.common.entity.TargetRef
import fr.dcproject.component.article.ArticleRepository
import fr.dcproject.component.article.ArticleWithTitleI
import fr.dcproject.component.citizen.CitizenBasicI
import fr.dcproject.component.citizen.CitizenCreatorI
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.component.follow.FollowForView
import java.util.UUID
@@ -42,7 +42,7 @@ class NotificationEmailSender(
}
}
private fun generateHtmlContent(citizen: CitizenBasicI, target: EntityI): String? {
private fun generateHtmlContent(citizen: CitizenCreatorI, target: EntityI): String? {
return when (target) {
is ArticleWithTitleI -> """
Hello ${citizen.name.getFullName()},<br/>
@@ -52,7 +52,7 @@ class NotificationEmailSender(
}
}
private fun generateContent(citizen: CitizenBasicI, target: EntityI): String {
private fun generateContent(citizen: CitizenCreatorI, target: EntityI): String {
return when (target) {
is ArticleWithTitleI -> """
Hello ${citizen.name.getFullName()},

View File

@@ -6,7 +6,7 @@ import fr.dcproject.common.security.AccessControl
import fr.dcproject.common.security.AccessResponse
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.vote.entity.VoteForUpdateI
import fr.dcproject.component.vote.entity.Vote as VoteEntity
import fr.dcproject.component.vote.entity.VoteForView as VoteEntity
class VoteAccessControl : AccessControl() {
fun <S> canCreate(subject: VoteForUpdateI<S, *>, citizen: CitizenI?): AccessResponse where S : DeletedAt, S : TargetI = when {

View File

@@ -15,7 +15,7 @@ import fr.postgresjson.connexion.Requester
import fr.postgresjson.repository.RepositoryI
import java.util.UUID
import fr.dcproject.component.citizen.Citizen as CitizenEntity
import fr.dcproject.component.vote.entity.Vote as VoteEntity
import fr.dcproject.component.vote.entity.VoteForView as VoteEntity
abstract class VoteRepositoryAbs<T : TargetI>(override var requester: Requester) : RepositoryI {
fun vote(vote: VoteForUpdateI<T, *>, anonymous: Boolean? = null): VoteAggregation {

View File

@@ -7,22 +7,21 @@ import fr.dcproject.common.entity.ExtraI
import fr.dcproject.common.entity.HasTarget
import fr.dcproject.common.entity.TargetI
import fr.dcproject.common.entity.UpdatedAt
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenBasicI
import fr.dcproject.component.citizen.CitizenCreator
import fr.dcproject.component.citizen.CitizenCreatorI
import fr.dcproject.component.citizen.CitizenI
import java.util.UUID
@Deprecated("")
class Vote<T : TargetI>(
class VoteForView<T : TargetI>(
id: UUID = UUID.randomUUID(),
override val createdBy: CitizenBasic,
override val createdBy: CitizenCreator,
override val target: T,
var note: Int,
var anonymous: Boolean = true
) : ExtraI<T, CitizenBasicI>,
) : ExtraI<T, CitizenCreatorI>,
VoteRef(id),
CreatedAt by CreatedAt.Imp(),
CreatedBy<CitizenBasicI> by CreatedBy.Imp(createdBy),
CreatedBy<CitizenCreatorI> by CreatedBy.Imp(createdBy),
UpdatedAt by UpdatedAt.Imp() {
init {
if (note > 1 && note < -1) {

View File

@@ -1,6 +1,5 @@
package fr.dcproject.component.workgroup
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCreator
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRef
@@ -59,24 +58,24 @@ class WorkgroupRepository(override var requester: Requester) : RepositoryI {
"members" to Member(citizen, roles).serialize()
)
fun <Z : CitizenI> addMembers(workgroup: WorkgroupI, members: List<Member<Z>>): List<Member<CitizenBasic>> = requester
fun <Z : CitizenI> addMembers(workgroup: WorkgroupI, members: List<Member<Z>>): List<Member<CitizenCreator>> = requester
.getFunction("add_workgroup_members")
.select(
"id" to workgroup.id,
"members" to members.serialize()
)
fun <Z : CitizenI> removeMember(workgroup: WorkgroupI, memberToDelete: Member<Z>): List<Member<CitizenBasic>> =
fun <Z : CitizenI> removeMember(workgroup: WorkgroupI, memberToDelete: Member<Z>): List<Member<CitizenCreator>> =
removeMembers(workgroup, listOf(memberToDelete))
fun <Z : CitizenI> removeMembers(workgroup: WorkgroupI, membersToDelete: List<Member<Z>>): List<Member<CitizenBasic>> = requester
fun <Z : CitizenI> removeMembers(workgroup: WorkgroupI, membersToDelete: List<Member<Z>>): List<Member<CitizenCreator>> = requester
.getFunction("remove_workgroup_members")
.select(
"id" to workgroup.id,
"members" to membersToDelete
)
fun <Z : CitizenI> updateMembers(workgroup: WorkgroupI, members: List<Member<Z>>): List<Member<CitizenBasic>> = requester
fun <Z : CitizenI> updateMembers(workgroup: WorkgroupI, members: List<Member<Z>>): List<Member<CitizenCreator>> = requester
.getFunction("update_workgroup_members")
.select(
"id" to workgroup.id,

View File

@@ -9,6 +9,7 @@ import fr.dcproject.common.email.Mailer
import io.ktor.locations.KtorExperimentalLocationsAPI
import io.ktor.server.testing.withTestApplication
import io.ktor.util.KtorExperimentalAPI
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.InternalCoroutinesApi
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
@@ -24,6 +25,7 @@ import org.koin.test.get
@Tags(Tag("functional"))
class MailerTest : KoinTest, AutoCloseKoinTest() {
@InternalCoroutinesApi
@ExperimentalCoroutinesApi
@Test
@Tags(Tag("online"))
fun `can be send an email`() {

View File

@@ -8,6 +8,7 @@ import fr.dcproject.component.citizen.CitizenRef
import io.ktor.locations.KtorExperimentalLocationsAPI
import io.ktor.server.testing.withTestApplication
import io.ktor.util.KtorExperimentalAPI
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.amshove.kluent.`should be equal to`
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
@@ -19,6 +20,7 @@ import java.util.UUID
@KtorExperimentalLocationsAPI
@KtorExperimentalAPI
@ExperimentalCoroutinesApi
@TestInstance(PER_CLASS)
@Tags(Tag("functional"))
class ViewTest {

View File

@@ -46,13 +46,13 @@ fun createConstitution(
): Constitution {
val constitutionRepository: ConstitutionRepository by lazy { GlobalContext.get().koin.get() }
val createdBy: CitizenWithUserI = createCitizen(createdBy)
val creator: CitizenWithUserI = createCitizen(createdBy)
val constitution = ConstitutionSimple(
id = id ?: UUID.randomUUID(),
title = LoremIpsum().getTitle(3),
titles = titles ?: createTitles(5),
createdBy = createdBy,
createdBy = creator,
versionId = UUID.randomUUID()
)
return constitutionRepository.upsert(constitution) ?: error("Cannot create constitution")

View File

@@ -34,6 +34,7 @@ fun WorkgroupForView<CitizenCreator>.`With members`(
addMemberToWorkgroup(this, *member)
}
@Suppress("UNCHECKED_CAST")
fun addMemberToWorkgroup(workgroup: WorkgroupForView<CitizenCreator>, vararg membersNames: CitizenI.Name) {
val citizenRepository: CitizenRepository by lazy { GlobalContext.get().koin.get() }
val workgroupRepository: WorkgroupRepository by lazy { GlobalContext.get().koin.get() }
@@ -58,8 +59,8 @@ private fun createWorkgroup(
val citizenRepository: CitizenRepository by lazy { GlobalContext.get().koin.get() }
val workgroupRepository: WorkgroupRepository by lazy { GlobalContext.get().koin.get() }
val createdBy = createdBy ?: CitizenI.Name("Paul", "Langevin")
val creator = citizenRepository.findByName(createdBy) ?: run {
val creatorName = createdBy ?: CitizenI.Name("Paul", "Langevin")
val creator = citizenRepository.findByName(creatorName) ?: run {
val username = ("username" + UUID.randomUUID().toString())
.toLowerCase().replace(' ', '-')
val user = UserForCreate(
@@ -67,7 +68,7 @@ private fun createWorkgroup(
password = "azerty",
)
CitizenForCreate(
name = createdBy,
name = creatorName,
email = "$username@dc-project.fr",
birthday = DateTime.now(),
user = user

View File

@@ -5,7 +5,7 @@ import fr.dcproject.common.security.AccessDecision.GRANTED
import fr.dcproject.component.auth.User
import fr.dcproject.component.auth.UserI
import fr.dcproject.component.citizen.CitizenAccessControl
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import org.amshove.kluent.`should be`
import org.joda.time.DateTime
@@ -20,32 +20,26 @@ import org.junit.jupiter.api.parallel.ExecutionMode.CONCURRENT
@Execution(CONCURRENT)
@Tags(Tag("security"), Tag("unit"))
internal class `Citizen Access Control` {
private val tesla = CitizenBasic(
private val tesla = CitizenCart(
user = User(
username = "nicolas-tesla",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "tesla@best.com",
name = CitizenI.Name("Nicolas", "Tesla")
)
private val einstein = CitizenBasic(
private val einstein = CitizenCart(
user = User(
username = "albert-einstein",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "einstein@best.com",
name = CitizenI.Name("Albert", "Einstein")
)
private val curie = CitizenBasic(
private val curie = CitizenCart(
user = User(
username = "marie-curie",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "curie@best.com",
name = CitizenI.Name("Marie", "Curie"),
deletedAt = DateTime.now()
)

View File

@@ -6,15 +6,14 @@ import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.auth.User
import fr.dcproject.component.auth.UserCreator
import fr.dcproject.component.auth.UserI
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenCreator
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRef
import fr.dcproject.component.opinion.OpinionAccessControl
import fr.dcproject.component.opinion.entity.Opinion
import fr.dcproject.component.opinion.entity.OpinionChoice
import org.amshove.kluent.`should be`
import org.joda.time.DateTime
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
import org.junit.jupiter.api.Test
@@ -36,16 +35,8 @@ internal class `Opinion Access Control` {
followAnonymous = false
)
private val einstein = CitizenBasic(
private val einstein = CitizenRef(
id = UUID.fromString("319f1226-8f47-4df3-babd-2c7671ad0fbc"),
user = User(
username = "albert-einstein",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "einstein@best.com",
name = CitizenI.Name("Albert", "Einstein"),
followAnonymous = true
)
private val einstein2 = CitizenCart(

View File

@@ -1,16 +1,10 @@
package unit.security
import fr.dcproject.common.security.AccessDecision.GRANTED
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.auth.User
import fr.dcproject.component.auth.UserI
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRef
import fr.dcproject.component.opinion.OpinionChoiceAccessControl
import fr.dcproject.component.opinion.entity.OpinionChoice
import org.amshove.kluent.`should be`
import org.joda.time.DateTime
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
import org.junit.jupiter.api.Test
@@ -23,32 +17,12 @@ import java.util.UUID
@Execution(CONCURRENT)
@Tags(Tag("security"), Tag("unit"))
internal class `OpinionChoice Access Control` {
private val tesla = CitizenBasic(
private val tesla = CitizenRef(
id = UUID.fromString("e6efc288-4283-4729-a268-6debb18de1a0"),
user = User(
username = "nicolas-tesla",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "tesla@best.com",
name = CitizenI.Name("Nicolas", "Tesla"),
followAnonymous = false
)
private val tesla2 = CitizenCart(
private val tesla2 = CitizenRef(
id = UUID.fromString("e6efc288-4283-4729-a268-6debb18de1a0"),
user = User(
username = "nicolas-tesla",
roles = listOf(UserI.Roles.ROLE_USER)
),
name = CitizenI.Name("Nicolas", "Tesla")
)
private val article1 = ArticleForView(
content = "Hi",
createdBy = tesla2,
description = "blablabla",
title = "Super article"
)
private val choice1 = OpinionChoice(

View File

@@ -4,10 +4,11 @@ import fr.dcproject.common.security.AccessDecision.DENIED
import fr.dcproject.common.security.AccessDecision.GRANTED
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.auth.User
import fr.dcproject.component.auth.UserCreator
import fr.dcproject.component.auth.UserI
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenCreator
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.vote.VoteAccessControl
import fr.dcproject.component.vote.entity.VoteForUpdate
@@ -20,7 +21,7 @@ import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.api.parallel.Execution
import org.junit.jupiter.api.parallel.ExecutionMode.CONCURRENT
import java.util.UUID
import fr.dcproject.component.vote.entity.Vote as VoteEntity
import fr.dcproject.component.vote.entity.VoteForView
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Execution(CONCURRENT)
@@ -37,13 +38,11 @@ internal class `Vote Access Control` {
name = CitizenI.Name("Nicolas", "Tesla"),
followAnonymous = false
)
private val tesla3 = CitizenBasic(
private val tesla3 = CitizenCreator(
id = UUID.fromString("a1e35c99-9d33-4fb4-9201-58d7071243bb"),
user = User(
user = UserCreator(
username = "nicolas-tesla",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "tesla@best.com",
name = CitizenI.Name("Nicolas", "Tesla"),
followAnonymous = false
@@ -77,7 +76,7 @@ internal class `Vote Access Control` {
title = "Super article"
)
private val vote1 = VoteEntity(
private val vote1 = VoteForView(
createdBy = tesla3,
target = article1,
note = 1

View File

@@ -5,14 +5,13 @@ import fr.dcproject.common.security.AccessDecision.GRANTED
import fr.dcproject.component.auth.User
import fr.dcproject.component.auth.UserCreator
import fr.dcproject.component.auth.UserI
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenCreator
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRef
import fr.dcproject.component.workgroup.WorkgroupAccessControl
import fr.dcproject.component.workgroup.WorkgroupWithMembersI
import org.amshove.kluent.`should be`
import org.joda.time.DateTime
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
import org.junit.jupiter.api.Test
@@ -35,25 +34,8 @@ internal class `Workgroup Access Control` {
followAnonymous = false
)
private val einstein = CitizenBasic(
private val einstein = CitizenRef(
id = UUID.fromString("319f1226-8f47-4df3-babd-2c7671ad0fbc"),
user = User(
username = "albert-einstein",
roles = listOf(UserI.Roles.ROLE_USER)
),
birthday = DateTime.now(),
email = "einstein@best.com",
name = CitizenI.Name("Albert", "Einstein"),
followAnonymous = true
)
private val einstein2 = CitizenCart(
id = UUID.fromString("319f1226-8f47-4df3-babd-2c7671ad0fbc"),
user = User(
username = "albert-einstein",
roles = listOf(UserI.Roles.ROLE_USER)
),
name = CitizenI.Name("Albert", "Einstein")
)
private val workgroupPublic = WorkgroupEntity(