package fr.postgresjson.entity import com.fasterxml.jackson.annotation.JsonIgnore import org.joda.time.DateTime import java.util.* import kotlin.reflect.KClass /* ID */ interface EntityI { var id: T? val className: KClass> @JsonIgnore() get() = this::class as KClass> } abstract class Entity(override var id: T? = null): EntityI open class UuidEntity(override var id: UUID? = UUID.randomUUID()): Entity(id) open class IdEntity(override var id: Int? = null): Entity(id) /* Version */ interface EntityVersioning { var versionId: ID var versionNumber: NUMBER? } class UuidEntityVersioning: EntityVersioning { override var versionId: UUID = UUID.randomUUID() override var versionNumber: Int? = null } /* Dates */ interface EntityCreatedAt { var createdAt: DateTime? } interface EntityUpdatedAt { var updatedAt: DateTime? } class EntityCreatedAtImp: EntityCreatedAt { override var createdAt: DateTime? = null } class EntityUpdatedAtImp: EntityUpdatedAt { override var updatedAt: DateTime? = null } /* Author */ interface EntityCreatedBy> { var createdBy: T? } interface EntityUpdatedBy> { var updatedBy: T? } class EntityCreatedByImp>( override var createdBy: UserT? ): EntityCreatedBy class EntityUpdatedByImp>( override var updatedBy: UserT? ): EntityUpdatedBy /* Published */ interface Published> { var publishedAt: DateTime? var publishedBy: UserT? } class EntityPublishedImp>( override var publishedBy: UserT? ): Published { override var publishedAt: DateTime? = null } /* Implementation */ abstract class EntityImp>( updatedBy: UserT? ): Entity(), EntityCreatedAt by EntityCreatedAtImp(), EntityUpdatedAt by EntityUpdatedAtImp(), EntityCreatedBy by EntityCreatedByImp(updatedBy), EntityUpdatedBy by EntityUpdatedByImp(updatedBy) abstract class UuidEntityExtended>( updatedBy: UserT?, publishedBy: UserT? ): EntityImp(updatedBy), EntityVersioning by UuidEntityVersioning(), Published by EntityPublishedImp(publishedBy)