package fr.postgresjson.entity.immutable import fr.postgresjson.entity.EntityI import fr.postgresjson.entity.mutable.EntityDeletedAt import fr.postgresjson.entity.mutable.EntityDeletedAtImp import fr.postgresjson.entity.mutable.EntityDeletedBy import fr.postgresjson.entity.mutable.EntityDeletedByImp import org.joda.time.DateTime import java.util.* interface EntityRefI : EntityI { val id: T } interface UuidEntityI : EntityRefI { override val id: UUID } abstract class Entity(override val id: T) : EntityRefI open class UuidEntity(override val id: UUID = UUID.randomUUID()) : UuidEntityI, Entity(id) /* Version */ interface EntityVersioning { val versionId: ID val versionNumber: NUMBER } class UuidEntityVersioning( override val versionNumber: Int, override val versionId: UUID = UUID.randomUUID() ) : EntityVersioning /* Dates */ interface EntityCreatedAt { val createdAt: DateTime } interface EntityUpdatedAt { var updatedAt: DateTime } class EntityCreatedAtImp( override val createdAt: DateTime = DateTime.now() ) : EntityCreatedAt class EntityUpdatedAtImp( override var updatedAt: DateTime = DateTime.now() ) : EntityUpdatedAt /* Author */ interface EntityCreatedBy { val createdBy: T } interface EntityUpdatedBy { var updatedBy: T } class EntityCreatedByImp( override val createdBy: UserT ) : EntityCreatedBy class EntityUpdatedByImp( override var updatedBy: UserT ) : EntityUpdatedBy /* Mixed */ class EntityCreatedImp( override val createdAt: DateTime = DateTime.now(), createdBy: UserT ) : EntityCreatedBy by EntityCreatedByImp(createdBy), EntityCreatedAt by EntityCreatedAtImp() class EntityUpdatedImp( updatedAt: DateTime = DateTime.now(), override var updatedBy: UserT ) : EntityUpdatedBy, EntityUpdatedAt by EntityUpdatedAtImp(updatedAt) /* Implementation */ abstract class EntityImp( updatedBy: UserT, updatedAt: DateTime = DateTime.now() ) : UuidEntity(), EntityCreatedAt by EntityCreatedAtImp(updatedAt), EntityUpdatedAt by EntityUpdatedAtImp(updatedAt), EntityDeletedAt by EntityDeletedAtImp(), EntityCreatedBy by EntityCreatedByImp(updatedBy), EntityUpdatedBy by EntityUpdatedByImp(updatedBy), EntityDeletedBy by EntityDeletedByImp(updatedBy)