update published posts repo
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
package dev.inmo.postssystem.core.publishing.exposed
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import dev.inmo.micro_utils.coroutines.launchSynchronously
|
||||
import dev.inmo.micro_utils.pagination.*
|
||||
import dev.inmo.micro_utils.pagination.utils.reverse
|
||||
import dev.inmo.micro_utils.repos.exposed.AbstractExposedCRUDRepo
|
||||
import dev.inmo.micro_utils.repos.exposed.initTable
|
||||
import dev.inmo.postssystem.core.generateId
|
||||
import dev.inmo.postssystem.core.post.PostId
|
||||
import dev.inmo.postssystem.core.post.RegisteredPost
|
||||
import dev.inmo.postssystem.core.post.repo.ReadPostsRepo
|
||||
import dev.inmo.postssystem.core.publishing.repos.*
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import org.jetbrains.exposed.sql.*
|
||||
import org.jetbrains.exposed.sql.statements.InsertStatement
|
||||
import org.jetbrains.exposed.sql.statements.UpdateStatement
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
|
||||
class ExposedPublishedPostsRepo(
|
||||
override val database: Database,
|
||||
private val postsRepo: ReadPostsRepo,
|
||||
tableName: String = "PublishedPostsRepo",
|
||||
private val scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||
) : PublishedPostsRepo,
|
||||
AbstractExposedCRUDRepo<PublishedPost, PublishedPostId, RegisteredPost>(
|
||||
tableName = tableName
|
||||
) {
|
||||
private val idColumn = text("id")
|
||||
private val postIdColumn = text("postId")
|
||||
private val dateTimeColumn = double("dateTime").clientDefault {
|
||||
DateTime.now().unixMillis
|
||||
}
|
||||
|
||||
override val selectByIds: SqlExpressionBuilder.(List<PublishedPostId>) -> Op<Boolean> = { idColumn.inList(it) }
|
||||
override val InsertStatement<Number>.asObject: PublishedPost get() = TODO()
|
||||
|
||||
override fun InsertStatement<Number>.asObject(value: RegisteredPost): PublishedPost = PublishedPost(
|
||||
get(idColumn),
|
||||
value,
|
||||
get(dateTimeColumn)
|
||||
)
|
||||
|
||||
override val selectById: SqlExpressionBuilder.(PublishedPostId) -> Op<Boolean> = { idColumn.eq(it) }
|
||||
override val ResultRow.asObject: PublishedPost
|
||||
get() = PublishedPost(
|
||||
get(idColumn),
|
||||
requireNotNull(launchSynchronously(scope) { postsRepo.getPostById(get(postIdColumn)) }) { "Post with id \"${get(postIdColumn)}\" not found" },
|
||||
get(dateTimeColumn)
|
||||
)
|
||||
|
||||
init {
|
||||
initTable()
|
||||
}
|
||||
|
||||
override fun insert(value: RegisteredPost, it: InsertStatement<Number>) {
|
||||
it[idColumn] = generateId()
|
||||
it[postIdColumn] = value.id
|
||||
}
|
||||
|
||||
override fun update(id: PublishedPostId, value: RegisteredPost, it: UpdateStatement) {
|
||||
it[postIdColumn] = value.id
|
||||
}
|
||||
|
||||
override suspend fun getPostPublishing(
|
||||
postId: PostId,
|
||||
pagination: Pagination,
|
||||
reversed: Boolean
|
||||
): PaginationResult<PublishedPostId> = transaction(database) {
|
||||
val query = select { postIdColumn.eq(postId) }
|
||||
query.paginate(pagination, postIdColumn, reversed).map {
|
||||
it[idColumn]
|
||||
} to query.count()
|
||||
}.let { (results, count) ->
|
||||
results.createPaginationResult(
|
||||
if (reversed) pagination.reverse(count) else pagination,
|
||||
count
|
||||
)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user