All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.dev.inmo.micro_utils.repos.StandartCRUDRepo.kt Maven / Gradle / Ivy

There is a newer version: 0.22.2
Show newest version
package dev.inmo.micro_utils.repos

import dev.inmo.micro_utils.pagination.Pagination
import dev.inmo.micro_utils.pagination.PaginationResult
import dev.inmo.micro_utils.pagination.changeResultsUnchecked
import dev.inmo.micro_utils.pagination.utils.getAllWithCurrentPaging
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
import kotlinx.coroutines.flow.Flow

interface ReadCRUDRepo : Repo {
    suspend fun getByPagination(pagination: Pagination): PaginationResult
    suspend fun getIdsByPagination(pagination: Pagination): PaginationResult
    suspend fun getById(id: IdType): ObjectType?
    suspend fun contains(id: IdType): Boolean
    suspend fun getAll(): Map = getAllWithCurrentPaging(maxPagePagination()) {
        getIdsByPagination(it).let {
            it.changeResultsUnchecked(
                it.results.mapNotNull { it to (getById(it) ?: return@mapNotNull null) }
            )
        }
    }.toMap()

    suspend fun count(): Long
}
typealias ReadStandardCRUDRepo = ReadCRUDRepo

typealias UpdatedValuePair = Pair
val  UpdatedValuePair.id
    get() = first
val  UpdatedValuePair<*, ValueType>.value
    get() = second

interface WriteCRUDRepo : Repo {
    val newObjectsFlow: Flow
    val updatedObjectsFlow: Flow
    val deletedObjectsIdsFlow: Flow

    suspend fun create(values: List): List
    suspend fun update(id: IdType, value: InputValueType): ObjectType?
    suspend fun update(values: List>): List
    suspend fun deleteById(ids: List)
}
typealias WriteStandardCRUDRepo = WriteCRUDRepo

/**
 * Just mirroring [WriteCRUDRepo.newObjectsFlow] to be same as in KV repos
 */
val  WriteCRUDRepo.onNewObjects: Flow
    get() = newObjectsFlow
/**
 * Just mirroring [WriteCRUDRepo.updatedObjectsFlow] to be same as in KV repos
 */
val  WriteCRUDRepo.onUpdatedObjects: Flow
    get() = updatedObjectsFlow
/**
 * Just mirroring [WriteCRUDRepo.deletedObjectsIdsFlow] to be same as in KV repos
 */
val  WriteCRUDRepo<*, IdType, *>.onDeletedObjectsIds: Flow
    get() = deletedObjectsIdsFlow

suspend fun  WriteCRUDRepo.create(
    vararg values: InputValueType
): List = create(values.toList())
suspend fun  WriteCRUDRepo.update(
    vararg values: UpdatedValuePair
): List = update(values.toList())
suspend fun  WriteCRUDRepo.deleteById(
    vararg ids: IdType
) = deleteById(ids.toList())

interface CRUDRepo : ReadCRUDRepo,
    WriteCRUDRepo
typealias StandardCRUDRepo = CRUDRepo

class DelegateBasedCRUDRepo(
    readDelegate: ReadCRUDRepo,
    writeDelegate: WriteCRUDRepo
) : CRUDRepo,
    ReadCRUDRepo by readDelegate,
    WriteCRUDRepo by writeDelegate




© 2015 - 2024 Weber Informatics LLC | Privacy Policy