package fr.dcproject.entity import fr.dcproject.entity.WorkgroupWithMembersI.Member import fr.dcproject.entity.WorkgroupWithMembersI.Member.Role import fr.postgresjson.entity.EntityI import fr.postgresjson.entity.immutable.* import fr.postgresjson.entity.mutable.EntityDeletedAt import fr.postgresjson.entity.mutable.EntityDeletedAtImp import java.util.* class Workgroup( id: UUID? = null, name: String, description: String, logo: String? = null, anonymous: Boolean = true, createdBy: CitizenBasic, override var members: List> = emptyList() ) : WorkgroupWithAuthI, WorkgroupSimple( id, name, description, logo, anonymous, createdBy ), EntityCreatedAt by EntityCreatedAtImp(), EntityUpdatedAt by EntityUpdatedAtImp() open class WorkgroupSimple( id: UUID? = null, var name: String, var description: String, var logo: String? = null, var anonymous: Boolean = true, createdBy: Z ) : WorkgroupRef(id), EntityCreatedBy by EntityCreatedByImp(createdBy), EntityDeletedAt by EntityDeletedAtImp() open class WorkgroupRef( id: UUID? = null ) : UuidEntity(id ?: UUID.randomUUID()), WorkgroupI interface WorkgroupWithAuthI : WorkgroupWithMembersI, EntityCreatedBy, EntityDeletedAt { val anonymous: Boolean fun isMember(user: UserI): Boolean = members.isMember(user) fun isMember(citizen: CitizenWithUserI): Boolean = members.isMember(citizen) fun hasRole(expectedRole: Role, user: UserI): Boolean = members.hasRole(expectedRole, user) fun hasRole(expectedRole: Role, citizen: CitizenI): Boolean = members.hasRole(expectedRole, citizen) fun getRoles(user: UserI): List = members.getRoles(user) fun getRoles(citizen: CitizenI): List = members.getRoles(citizen) } interface WorkgroupWithMembersI : WorkgroupI { var members: List> class Member ( val citizen: C, val roles: List = emptyList() ) : EntityI { enum class Role { MASTER, MANAGER, EDITOR, REPORTER } } } fun List.hasCitizen(citizen: CitizenI): Boolean = this.map { it.id }.contains(citizen.id) fun List>.isMember(user: UserI): Boolean = map { it.citizen.user.id }.contains(user.id) fun List>.isMember(citizen: CitizenI): Boolean = map { it.citizen.id }.contains(citizen.id) fun List>.hasRole(expectedRole: Role, citizen: CitizenI): Boolean = any { member -> member.citizen.id == citizen.id && member.roles.any { it == expectedRole } } fun List>.hasRole(expectedRole: Role, user: UserI): Boolean = any { member -> member.citizen.user.id == user.id && member.roles.any { it == expectedRole } } fun List>.getRoles(user: UserI): List = firstOrNull { it.citizen.user.id == user.id }?.roles ?: emptyList() fun List>.getRoles(citizen: CitizenI): List = firstOrNull { it.citizen.id == citizen.id }?.roles ?: emptyList() interface WorkgroupI : UuidEntityI