Files
dc-project/src/main/kotlin/fr/dcproject/component/citizen/database/Citizen.kt

124 lines
3.5 KiB
Kotlin

package fr.dcproject.component.citizen.database
import fr.dcproject.common.entity.CreatedAt
import fr.dcproject.common.entity.DeletedAt
import fr.dcproject.common.entity.EntityI
import fr.dcproject.common.entity.TargetI
import fr.dcproject.common.entity.TargetRef
import fr.dcproject.component.auth.database.User
import fr.dcproject.component.auth.database.UserCreator
import fr.dcproject.component.auth.database.UserForCreate
import fr.dcproject.component.auth.database.UserI
import fr.dcproject.component.auth.database.UserRef
import fr.dcproject.component.auth.database.UserWithUsername
import fr.dcproject.component.citizen.database.CitizenI.Name
import fr.dcproject.component.workgroup.database.WorkgroupRef
import fr.postgresjson.entity.Serializable
import org.joda.time.DateTime
import java.util.UUID
class CitizenForCreate(
val name: Name,
val email: String,
val birthday: DateTime,
val voteAnonymous: Boolean = true,
val followAnonymous: Boolean = true,
override val user: UserForCreate,
id: UUID = UUID.randomUUID(),
) : CitizenI,
CitizenRefWithUser(id, user),
CreatedAt by CreatedAt.Imp()
class Citizen(
override val id: UUID = UUID.randomUUID(),
override val name: Name,
override val email: String,
val birthday: DateTime,
override val voteAnonymous: Boolean = true,
override val followAnonymous: Boolean = true,
override val user: User,
deletedAt: DateTime? = null
) : CitizenWithEmail,
CitizenCreatorI,
CitizenWithUserI,
CitizenRef(id),
CitizenCartI,
CreatedAt by CreatedAt.Imp(),
DeletedAt by DeletedAt.Imp(deletedAt) {
var workgroups: List<WorkgroupAndRoles> = emptyList()
class WorkgroupAndRoles(
val roles: List<String>,
val workgroup: WorkgroupRef
)
}
data class CitizenCreator(
override var id: UUID = UUID.randomUUID(),
override var name: Name,
override var email: String,
override var voteAnonymous: Boolean = true,
override var followAnonymous: Boolean = true,
override val user: UserCreator,
override val deletedAt: DateTime? = null
) : CitizenCreatorI,
CitizenRefWithUser(id, user),
DeletedAt by DeletedAt.Imp(deletedAt)
interface CitizenCreatorI : CitizenWithUserI, CitizenWithEmail, CitizenCartI, DeletedAt {
override val id: UUID
override val name: Name
override val email: String
val voteAnonymous: Boolean
val followAnonymous: Boolean
override val user: UserWithUsername
override val deletedAt: DateTime?
}
class CitizenCart(
id: UUID = UUID.randomUUID(),
override val name: Name,
override val user: UserRef,
override val deletedAt: DateTime? = null,
) : CitizenRef(id),
CitizenCartI,
DeletedAt by DeletedAt.Imp(deletedAt)
interface CitizenCartI : CitizenI, CitizenWithUserI {
val name: Name
}
open class CitizenRefWithUser(
id: UUID = UUID.randomUUID(),
override val user: UserRef
) : CitizenWithUserI,
CitizenRef(id)
open class CitizenRef(
id: UUID = UUID.randomUUID()
) : TargetRef(id),
CitizenI
interface CitizenI : EntityI, TargetI {
data class Name(
override val firstName: String,
override val lastName: String,
override val civility: String? = null
) : NameI
interface NameI : Serializable {
val firstName: String
val lastName: String
val civility: String?
fun getFullName(): String = "${civility ?: ""} $firstName $lastName".trim()
}
}
interface CitizenWithUserI : CitizenI {
val user: UserI
}
interface CitizenWithEmail : CitizenI {
val email: String
}