core/core/exposed/src/jvmMain/kotlin/dev/inmo/postssystem/core/exposed/content/BinaryContentHolderRepo.kt

67 lines
2.0 KiB
Kotlin
Raw Normal View History

2020-11-25 08:08:45 +00:00
package dev.inmo.postssystem.core.exposed.content
2020-04-11 07:06:10 +00:00
2020-11-25 08:08:45 +00:00
import dev.inmo.postssystem.core.content.BinaryContent
import dev.inmo.postssystem.core.content.ContentId
2020-11-25 07:53:15 +00:00
import dev.inmo.micro_utils.mime_types.mimeType
2020-04-11 07:06:10 +00:00
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.statements.api.ExposedBlob
import org.jetbrains.exposed.sql.transactions.transaction
private class BinaryContentHolderRepoTable(
private val database: Database
) : ContentHolderRepo<BinaryContent>, Table() {
private val idColumn = text("id")
private val dataColumn = blob("data")
private val mimeColumn = text("mimeType")
private val originalFileNameColumn = text("filename")
override val primaryKey: PrimaryKey = PrimaryKey(idColumn)
init {
2020-07-30 09:34:32 +00:00
transaction (
db = database
) {
2020-04-11 07:06:10 +00:00
SchemaUtils.createMissingTablesAndColumns(this@BinaryContentHolderRepoTable)
}
}
2020-07-31 05:28:27 +00:00
override suspend fun getContent(id: ContentId): BinaryContent? = transaction (
2020-07-30 09:34:32 +00:00
db = database
) {
2020-04-11 07:06:10 +00:00
select {
idColumn.eq(id)
}.limit(1).firstOrNull() ?.let {
val bytes = it[dataColumn].bytes
BinaryContent(
2020-08-17 16:50:13 +00:00
mimeType(it[mimeColumn]),
2020-04-11 07:06:10 +00:00
it[originalFileNameColumn]
) {
bytes
}
}
}
override suspend fun removeContent(id: ContentId) {
2020-07-31 05:28:27 +00:00
transaction(
2020-07-30 09:34:32 +00:00
db = database
) {
2020-04-11 07:06:10 +00:00
deleteWhere { idColumn.eq(id) }
}
}
override suspend fun putContent(id: ContentId, content: BinaryContent) {
2020-07-31 05:28:27 +00:00
transaction(
2020-07-30 09:34:32 +00:00
db = database
) {
2020-04-11 07:06:10 +00:00
insert {
it[idColumn] = id
it[originalFileNameColumn] = content.originalFileName
2020-08-17 16:50:13 +00:00
it[mimeColumn] = content.mimeType.raw
2020-04-11 07:06:10 +00:00
it[dataColumn] = ExposedBlob(content.dataAllocator())
}
}
}
}
class BinaryContentHolderRepo(
database: Database
) : ContentHolderRepo<BinaryContent> by BinaryContentHolderRepoTable(database)