package com.restapi.domain import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.Module import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.restapi.config.AppConfig.Companion.appConfig import io.ebean.Database import io.ebean.DatabaseFactory import io.ebean.config.CurrentTenantProvider import io.ebean.config.CurrentUserProvider import io.ebean.config.DatabaseConfig import io.ebean.config.TenantMode import java.util.* data class CurrentUser( val anon: Boolean = true, val userId: String = "", val tenantId: String = "" ) object Session { private val currentUser = object : ThreadLocal() { override fun initialValue(): CurrentUser { return CurrentUser() } } private val sc = DatabaseConfig().apply { loadFromProperties(Properties().apply { setProperty("datasource.db.username", appConfig.dbUser()) setProperty("datasource.db.password", appConfig.dbPass()) setProperty("datasource.db.url", appConfig.dbUrl()) setProperty("ebean.migration.run", appConfig.dbRunMigration().toString()) }) tenantMode = TenantMode.PARTITION currentTenantProvider = CurrentTenantProvider { currentUser.get().tenantId } currentUserProvider = CurrentUserProvider { currentUser.get().userId } } val database: Database = DatabaseFactory.create(sc) val objectMapper = jacksonObjectMapper().apply { configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) findAndRegisterModules() } fun currentUser() = currentUser.get().userId fun Database.findByEntityAndId(entity: String, id: String): DataModel { return find(DataModel::class.java) .where() .eq("uniqueIdentifier", id) .eq("entityName", entity) .findOne() ?: throw DataNotFoundException } private fun seqName(entity: String) = "sequence_$entity" fun creatSeq(entity: String): Int { return database.sqlUpdate("CREATE SEQUENCE IF NOT EXISTS ${seqName(entity)} START 1;").execute() } fun nextUniqId(entity: String): String { val s = database .sqlQuery("SELECT nextval('${seqName(entity)}');") .findOne()?.getLong("nextval") ?: throw DataNotFoundException return String.format("%s-%s", entity, "$s".padStart(10, '0')) } } object DataNotFoundException : Exception() { private fun readResolve(): Any = DataNotFoundException }