Add Immutable Entities
This commit is contained in:
@@ -1,126 +1,5 @@
|
|||||||
package fr.postgresjson.entity
|
package fr.postgresjson.entity
|
||||||
|
|
||||||
import org.joda.time.DateTime
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
interface Serializable
|
interface Serializable
|
||||||
interface EntityI : Serializable
|
interface EntityI : Serializable
|
||||||
interface Parameter : Serializable
|
interface Parameter : Serializable
|
||||||
|
|
||||||
abstract class Entity<T>(open var id: T? = null) : EntityI
|
|
||||||
open class UuidEntity(override var id: UUID? = UUID.randomUUID()) : Entity<UUID>(id)
|
|
||||||
open class IdEntity(override var id: Int? = null) : Entity<Int>(id)
|
|
||||||
|
|
||||||
/* Version */
|
|
||||||
interface EntityVersioning<ID, NUMBER> {
|
|
||||||
var versionId: ID
|
|
||||||
var versionNumber: NUMBER?
|
|
||||||
}
|
|
||||||
|
|
||||||
class UuidEntityVersioning : EntityVersioning<UUID, Int> {
|
|
||||||
override var versionId: UUID = UUID.randomUUID()
|
|
||||||
override var versionNumber: Int? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dates */
|
|
||||||
interface EntityCreatedAt {
|
|
||||||
var createdAt: DateTime?
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EntityUpdatedAt {
|
|
||||||
var updatedAt: DateTime?
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EntityDeletedAt {
|
|
||||||
var deletedAt: DateTime?
|
|
||||||
fun isDeleted(): Boolean {
|
|
||||||
val deletedAt = deletedAt
|
|
||||||
return deletedAt != null && deletedAt < DateTime.now()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class EntityCreatedAtImp : EntityCreatedAt {
|
|
||||||
override var createdAt: DateTime? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
class EntityUpdatedAtImp : EntityUpdatedAt {
|
|
||||||
override var updatedAt: DateTime? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
class EntityDeletedAtImp : EntityDeletedAt {
|
|
||||||
override var deletedAt: DateTime? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Author */
|
|
||||||
interface EntityCreatedBy<T : EntityI> {
|
|
||||||
var createdBy: T?
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EntityUpdatedBy<T : EntityI> {
|
|
||||||
var updatedBy: T?
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EntityDeletedBy<T : EntityI> {
|
|
||||||
var deletedBy: T?
|
|
||||||
}
|
|
||||||
|
|
||||||
class EntityCreatedByImp<UserT : EntityI>(
|
|
||||||
override var createdBy: UserT?
|
|
||||||
) : EntityCreatedBy<UserT>
|
|
||||||
|
|
||||||
class EntityUpdatedByImp<UserT : EntityI>(
|
|
||||||
override var updatedBy: UserT?
|
|
||||||
) : EntityUpdatedBy<UserT>
|
|
||||||
|
|
||||||
class EntityDeletedByImp<UserT : EntityI>(
|
|
||||||
override var deletedBy: UserT?
|
|
||||||
) : EntityDeletedBy<UserT>
|
|
||||||
|
|
||||||
/* Mixed */
|
|
||||||
class EntityDeletedImp<UserT : EntityI>(
|
|
||||||
override var deletedBy: UserT? = null
|
|
||||||
) : EntityDeletedBy<UserT>,
|
|
||||||
EntityDeletedAt by EntityDeletedAtImp()
|
|
||||||
|
|
||||||
class EntityUpdatedImp<UserT : EntityI>(
|
|
||||||
override var updatedAt: DateTime? = null,
|
|
||||||
override var updatedBy: UserT? = null
|
|
||||||
) : EntityUpdatedBy<UserT>,
|
|
||||||
EntityUpdatedAt by EntityUpdatedAtImp()
|
|
||||||
|
|
||||||
class EntityCreatedImp<UserT : EntityI>(
|
|
||||||
override var createdAt: DateTime? = null,
|
|
||||||
override var createdBy: UserT? = null
|
|
||||||
) : EntityCreatedBy<UserT>,
|
|
||||||
EntityCreatedAt by EntityCreatedAtImp()
|
|
||||||
|
|
||||||
/* Published */
|
|
||||||
interface Published<UserT : EntityI> {
|
|
||||||
var publishedAt: DateTime?
|
|
||||||
var publishedBy: UserT?
|
|
||||||
}
|
|
||||||
|
|
||||||
class EntityPublishedImp<UserT : EntityI>(
|
|
||||||
override var publishedBy: UserT?
|
|
||||||
) : Published<UserT> {
|
|
||||||
override var publishedAt: DateTime? = null
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Implementation */
|
|
||||||
abstract class EntityImp<T, UserT : EntityI>(
|
|
||||||
updatedBy: UserT?
|
|
||||||
) : Entity<T>(),
|
|
||||||
EntityCreatedAt by EntityCreatedAtImp(),
|
|
||||||
EntityUpdatedAt by EntityUpdatedAtImp(),
|
|
||||||
EntityDeletedAt by EntityDeletedAtImp(),
|
|
||||||
EntityCreatedBy<UserT> by EntityCreatedByImp(updatedBy),
|
|
||||||
EntityUpdatedBy<UserT> by EntityUpdatedByImp(updatedBy),
|
|
||||||
EntityDeletedBy<UserT> by EntityDeletedByImp(updatedBy)
|
|
||||||
|
|
||||||
abstract class UuidEntityExtended<T, UserT : EntityI>(
|
|
||||||
updatedBy: UserT?,
|
|
||||||
publishedBy: UserT?
|
|
||||||
) :
|
|
||||||
EntityImp<T, UserT>(updatedBy),
|
|
||||||
EntityVersioning<UUID, Int> by UuidEntityVersioning(),
|
|
||||||
Published<UserT> by EntityPublishedImp(publishedBy)
|
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
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<T> : EntityI {
|
||||||
|
val id: T
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UuidEntityI : EntityRefI<UUID> {
|
||||||
|
override val id: UUID
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class Entity<T>(override val id: T) : EntityRefI<T>
|
||||||
|
open class UuidEntity(override val id: UUID = UUID.randomUUID()) : UuidEntityI, Entity<UUID>(id)
|
||||||
|
|
||||||
|
/* Version */
|
||||||
|
interface EntityVersioning<ID, NUMBER> {
|
||||||
|
val versionId: ID
|
||||||
|
val versionNumber: NUMBER
|
||||||
|
}
|
||||||
|
|
||||||
|
class UuidEntityVersioning(
|
||||||
|
override val versionNumber: Int,
|
||||||
|
override val versionId: UUID = UUID.randomUUID()
|
||||||
|
) : EntityVersioning<UUID, Int>
|
||||||
|
|
||||||
|
/* 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<T : EntityI> {
|
||||||
|
val createdBy: T
|
||||||
|
}
|
||||||
|
interface EntityUpdatedBy<T : EntityI> {
|
||||||
|
var updatedBy: T
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityCreatedByImp<UserT : EntityI>(
|
||||||
|
override val createdBy: UserT
|
||||||
|
) : EntityCreatedBy<UserT>
|
||||||
|
|
||||||
|
class EntityUpdatedByImp<UserT : EntityI>(
|
||||||
|
override var updatedBy: UserT
|
||||||
|
) : EntityUpdatedBy<UserT>
|
||||||
|
|
||||||
|
/* Mixed */
|
||||||
|
class EntityCreatedImp<UserT : EntityI>(
|
||||||
|
override val createdAt: DateTime = DateTime.now(),
|
||||||
|
createdBy: UserT
|
||||||
|
) : EntityCreatedBy<UserT> by EntityCreatedByImp(createdBy),
|
||||||
|
EntityCreatedAt by EntityCreatedAtImp()
|
||||||
|
|
||||||
|
class EntityUpdatedImp<UserT : EntityI>(
|
||||||
|
updatedAt: DateTime = DateTime.now(),
|
||||||
|
override var updatedBy: UserT
|
||||||
|
) : EntityUpdatedBy<UserT>,
|
||||||
|
EntityUpdatedAt by EntityUpdatedAtImp(updatedAt)
|
||||||
|
|
||||||
|
/* Implementation */
|
||||||
|
abstract class EntityImp<T, UserT : EntityI>(
|
||||||
|
updatedBy: UserT,
|
||||||
|
updatedAt: DateTime = DateTime.now()
|
||||||
|
) : UuidEntity(),
|
||||||
|
EntityCreatedAt by EntityCreatedAtImp(updatedAt),
|
||||||
|
EntityUpdatedAt by EntityUpdatedAtImp(updatedAt),
|
||||||
|
EntityDeletedAt by EntityDeletedAtImp(),
|
||||||
|
EntityCreatedBy<UserT> by EntityCreatedByImp(updatedBy),
|
||||||
|
EntityUpdatedBy<UserT> by EntityUpdatedByImp(updatedBy),
|
||||||
|
EntityDeletedBy<UserT> by EntityDeletedByImp(updatedBy)
|
||||||
135
src/main/kotlin/fr/postgresjson/entity/mutable/MutableEntity.kt
Normal file
135
src/main/kotlin/fr/postgresjson/entity/mutable/MutableEntity.kt
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
package fr.postgresjson.entity.mutable
|
||||||
|
|
||||||
|
import fr.postgresjson.entity.EntityI
|
||||||
|
import org.joda.time.DateTime
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
interface EntityRefI<T> : EntityI {
|
||||||
|
var id: T?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UuidEntityI : EntityRefI<UUID> {
|
||||||
|
override var id: UUID?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IdEntityI : EntityRefI<Int> {
|
||||||
|
override var id: Int?
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class Entity<T>(override var id: T? = null) : EntityRefI<T>
|
||||||
|
open class UuidEntity(override var id: UUID? = UUID.randomUUID()) : UuidEntityI, Entity<UUID>(id)
|
||||||
|
open class IdEntity(override var id: Int? = null) : IdEntityI, Entity<Int>(id)
|
||||||
|
|
||||||
|
/* Version */
|
||||||
|
interface EntityVersioning<ID, NUMBER> {
|
||||||
|
var versionId: ID
|
||||||
|
var versionNumber: NUMBER?
|
||||||
|
}
|
||||||
|
|
||||||
|
class UuidEntityVersioning : EntityVersioning<UUID, Int> {
|
||||||
|
override var versionId: UUID = UUID.randomUUID()
|
||||||
|
override var versionNumber: Int? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dates */
|
||||||
|
interface EntityCreatedAt {
|
||||||
|
var createdAt: DateTime?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EntityUpdatedAt {
|
||||||
|
var updatedAt: DateTime?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EntityDeletedAt {
|
||||||
|
var deletedAt: DateTime?
|
||||||
|
fun isDeleted(): Boolean {
|
||||||
|
val deletedAt = deletedAt
|
||||||
|
return deletedAt != null && deletedAt < DateTime.now()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityCreatedAtImp : EntityCreatedAt {
|
||||||
|
override var createdAt: DateTime? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityUpdatedAtImp : EntityUpdatedAt {
|
||||||
|
override var updatedAt: DateTime? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityDeletedAtImp : EntityDeletedAt {
|
||||||
|
override var deletedAt: DateTime? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Author */
|
||||||
|
interface EntityCreatedBy<T : EntityI> {
|
||||||
|
var createdBy: T?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EntityUpdatedBy<T : EntityI> {
|
||||||
|
var updatedBy: T?
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EntityDeletedBy<T : EntityI> {
|
||||||
|
var deletedBy: T?
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityCreatedByImp<UserT : EntityI>(
|
||||||
|
override var createdBy: UserT?
|
||||||
|
) : EntityCreatedBy<UserT>
|
||||||
|
|
||||||
|
class EntityUpdatedByImp<UserT : EntityI>(
|
||||||
|
override var updatedBy: UserT?
|
||||||
|
) : EntityUpdatedBy<UserT>
|
||||||
|
|
||||||
|
class EntityDeletedByImp<UserT : EntityI>(
|
||||||
|
override var deletedBy: UserT?
|
||||||
|
) : EntityDeletedBy<UserT>
|
||||||
|
|
||||||
|
/* Mixed */
|
||||||
|
class EntityDeletedImp<UserT : EntityI>(
|
||||||
|
override var deletedBy: UserT? = null
|
||||||
|
) : EntityDeletedBy<UserT>,
|
||||||
|
EntityDeletedAt by EntityDeletedAtImp()
|
||||||
|
|
||||||
|
class EntityUpdatedImp<UserT : EntityI>(
|
||||||
|
override var updatedAt: DateTime? = null,
|
||||||
|
override var updatedBy: UserT? = null
|
||||||
|
) : EntityUpdatedBy<UserT>,
|
||||||
|
EntityUpdatedAt by EntityUpdatedAtImp()
|
||||||
|
|
||||||
|
class EntityCreatedImp<UserT : EntityI>(
|
||||||
|
override var createdAt: DateTime? = null,
|
||||||
|
override var createdBy: UserT? = null
|
||||||
|
) : EntityCreatedBy<UserT>,
|
||||||
|
EntityCreatedAt by EntityCreatedAtImp()
|
||||||
|
|
||||||
|
/* Published */
|
||||||
|
interface Published<UserT : EntityI> {
|
||||||
|
var publishedAt: DateTime?
|
||||||
|
var publishedBy: UserT?
|
||||||
|
}
|
||||||
|
|
||||||
|
class EntityPublishedImp<UserT : EntityI>(
|
||||||
|
override var publishedBy: UserT?
|
||||||
|
) : Published<UserT> {
|
||||||
|
override var publishedAt: DateTime? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Implementation */
|
||||||
|
abstract class EntityImp<T, UserT : EntityI>(
|
||||||
|
updatedBy: UserT?
|
||||||
|
) : Entity<T>(),
|
||||||
|
EntityCreatedAt by EntityCreatedAtImp(),
|
||||||
|
EntityUpdatedAt by EntityUpdatedAtImp(),
|
||||||
|
EntityDeletedAt by EntityDeletedAtImp(),
|
||||||
|
EntityCreatedBy<UserT> by EntityCreatedByImp(updatedBy),
|
||||||
|
EntityUpdatedBy<UserT> by EntityUpdatedByImp(updatedBy),
|
||||||
|
EntityDeletedBy<UserT> by EntityDeletedByImp(updatedBy)
|
||||||
|
|
||||||
|
abstract class UuidEntityExtended<T, UserT : EntityI>(
|
||||||
|
updatedBy: UserT?,
|
||||||
|
publishedBy: UserT?
|
||||||
|
) :
|
||||||
|
EntityImp<T, UserT>(updatedBy),
|
||||||
|
EntityVersioning<UUID, Int> by UuidEntityVersioning(),
|
||||||
|
Published<UserT> by EntityPublishedImp(publishedBy)
|
||||||
@@ -3,7 +3,7 @@ package fr.postgresjson.migration
|
|||||||
import com.fasterxml.jackson.core.type.TypeReference
|
import com.fasterxml.jackson.core.type.TypeReference
|
||||||
import fr.postgresjson.connexion.Connection
|
import fr.postgresjson.connexion.Connection
|
||||||
import fr.postgresjson.definition.Function.FunctionNotFound
|
import fr.postgresjson.definition.Function.FunctionNotFound
|
||||||
import fr.postgresjson.entity.Entity
|
import fr.postgresjson.entity.mutable.Entity
|
||||||
import fr.postgresjson.migration.Migration.Action
|
import fr.postgresjson.migration.Migration.Action
|
||||||
import fr.postgresjson.migration.Migration.Status
|
import fr.postgresjson.migration.Migration.Status
|
||||||
import fr.postgresjson.utils.LoggerDelegate
|
import fr.postgresjson.utils.LoggerDelegate
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package fr.postgresjson.migration
|
package fr.postgresjson.migration
|
||||||
|
|
||||||
import fr.postgresjson.connexion.Connection
|
import fr.postgresjson.connexion.Connection
|
||||||
import fr.postgresjson.entity.Entity
|
import fr.postgresjson.entity.mutable.Entity
|
||||||
import fr.postgresjson.migration.Migration.Action
|
import fr.postgresjson.migration.Migration.Action
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package fr.postgresjson
|
package fr.postgresjson
|
||||||
|
|
||||||
import fr.postgresjson.connexion.Paginated
|
import fr.postgresjson.connexion.Paginated
|
||||||
import fr.postgresjson.entity.IdEntity
|
import fr.postgresjson.entity.mutable.IdEntity
|
||||||
import fr.postgresjson.entity.Parameter
|
import fr.postgresjson.entity.Parameter
|
||||||
import org.junit.Assert.*
|
import org.junit.Assert.*
|
||||||
import org.junit.jupiter.api.Assertions
|
import org.junit.jupiter.api.Assertions
|
||||||
@@ -38,8 +38,7 @@ class ConnectionTest() : TestAbstract() {
|
|||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
assertNotNull(objs)
|
assertNotNull(objs)
|
||||||
assertTrue(objs is List<ObjTest2>)
|
assertEquals(objs.size, 2)
|
||||||
assertEquals(objs!!.size, 2)
|
|
||||||
assertEquals(objs[0].id, 1)
|
assertEquals(objs[0].id, 1)
|
||||||
assertEquals(objs[0].test!!.id, 1)
|
assertEquals(objs[0].test!!.id, 1)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package fr.postgresjson
|
package fr.postgresjson
|
||||||
|
|
||||||
import fr.postgresjson.entity.*
|
import fr.postgresjson.entity.EntityI
|
||||||
|
import fr.postgresjson.entity.mutable.*
|
||||||
import org.junit.jupiter.api.Assertions.assertTrue
|
import org.junit.jupiter.api.Assertions.assertTrue
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.junit.jupiter.api.TestInstance
|
import org.junit.jupiter.api.TestInstance
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package fr.postgresjson
|
|||||||
|
|
||||||
import fr.postgresjson.connexion.Paginated
|
import fr.postgresjson.connexion.Paginated
|
||||||
import fr.postgresjson.connexion.Requester
|
import fr.postgresjson.connexion.Requester
|
||||||
import fr.postgresjson.entity.IdEntity
|
import fr.postgresjson.entity.mutable.IdEntity
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.jupiter.api.Assertions.assertEquals
|
import org.junit.jupiter.api.Assertions.assertEquals
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package fr.postgresjson
|
package fr.postgresjson
|
||||||
|
|
||||||
import fr.postgresjson.entity.IdEntity
|
import fr.postgresjson.entity.mutable.IdEntity
|
||||||
import fr.postgresjson.serializer.Serializer
|
import fr.postgresjson.serializer.Serializer
|
||||||
import fr.postgresjson.serializer.deserialize
|
import fr.postgresjson.serializer.deserialize
|
||||||
import fr.postgresjson.serializer.serialize
|
import fr.postgresjson.serializer.serialize
|
||||||
|
|||||||
Reference in New Issue
Block a user