diff --git a/CHANGELOG.md b/CHANGELOG.md index b72c8245ddc..0db1eebd3fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ ## 0.15.0 +* `Repos`: + * `CRUD`: + * `Common`: + * New method `ReadCRUDRepo#getIdsByPagination` + * `Android`: + * `AbstractAndroidCRUDRepo` got new abstract method `toId` + * `Exposed`: + * `CommonExposedRepo` new abstract property `asId` + * `Ktor`: + * `Client`: + * `KtorReadCRUDRepoClient` now requires `paginationIdType` + ## 0.14.4 * `Common`: diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt index bbd5445e5f3..242b07e12ed 100644 --- a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/full/FullCRUDCacheRepo.kt @@ -46,6 +46,12 @@ open class FullReadCRUDCacheRepo( { if (it.results.isNotEmpty()) actualizeAll() } ) + override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult = doOrTakeAndActualize( + { keys(pagination).takeIf { it.results.isNotEmpty() }.optionalOrAbsentIfNull }, + { getIdsByPagination(pagination) }, + { if (it.results.isNotEmpty()) actualizeAll() } + ) + override suspend fun count(): Long = doOrTakeAndActualize( { count().takeIf { it != 0L }.optionalOrAbsentIfNull }, { count() }, diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt index 265de6dab16..5af7ec929fc 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt @@ -6,6 +6,7 @@ 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 count(): Long diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/CRUDMappers.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/CRUDMappers.kt index 97894431d7b..4fb74e91f59 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/CRUDMappers.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/CRUDMappers.kt @@ -20,6 +20,14 @@ open class MapperReadCRUDRepo( ) } + override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult = to.getIdsByPagination( + pagination + ).let { + it.changeResultsUnchecked( + it.results.map { it.toInnerKey() } + ) + } + override suspend fun count(): Long = to.count() override suspend fun contains(id: FromId): Boolean = to.contains(id.toOutKey()) diff --git a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/crud/AbstractAndroidCRUDRepo.kt b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/crud/AbstractAndroidCRUDRepo.kt index 817e3aeb3fe..ae832c1a1a5 100644 --- a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/crud/AbstractAndroidCRUDRepo.kt +++ b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/crud/AbstractAndroidCRUDRepo.kt @@ -16,6 +16,7 @@ abstract class AbstractAndroidCRUDRepo( protected abstract val tableName: String protected abstract val idColumnName: String protected abstract suspend fun Cursor.toObject(): ObjectType + protected abstract suspend fun Cursor.toId(): IdType protected fun SQLiteDatabase.count(): Long = select(tableName).use { it.count }.toLong() @@ -64,4 +65,23 @@ abstract class AbstractAndroidCRUDRepo( } } } + + override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult { + return helper.readableTransaction { + select( + tableName, + limit = pagination.limitClause() + ).use { + if (it.moveToFirst()) { + val resultList = mutableListOf(it.toId()) + while (it.moveToNext()) { + resultList.add(it.toId()) + } + resultList.createPaginationResult(pagination, count()) + } else { + emptyList().createPaginationResult(pagination, 0) + } + } + } + } } diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedReadCRUDRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedReadCRUDRepo.kt index bcac643e6dc..95b25277a26 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedReadCRUDRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/AbstractExposedReadCRUDRepo.kt @@ -22,6 +22,17 @@ abstract class AbstractExposedReadCRUDRepo( ) } } + + override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult { + return transaction(db = database) { + selectAll().paginate(pagination).map { + it.asId + }.createPaginationResult( + pagination, + selectAll().count() + ) + } + } override suspend fun getById(id: IdType): ObjectType? { return transaction(db = database) { select { diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/CommonExposedRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/CommonExposedRepo.kt index fe19c54493e..8e12921bece 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/CommonExposedRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/CommonExposedRepo.kt @@ -4,6 +4,7 @@ import org.jetbrains.exposed.sql.* interface CommonExposedRepo : ExposedRepo { val ResultRow.asObject: ObjectType + val ResultRow.asId: IdType val selectById: ISqlExpressionBuilder.(IdType) -> Op val selectByIds: ISqlExpressionBuilder.(List) -> Op get() = { list -> diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedReadKeyValueRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedReadKeyValueRepo.kt index 3498bf2685b..428b3498bf5 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedReadKeyValueRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/AbstractExposedReadKeyValueRepo.kt @@ -15,7 +15,13 @@ abstract class AbstractExposedReadKeyValueRepo( CommonExposedRepo, Table(tableName ?: "") { abstract val keyColumn: Column<*> + + /** + * Same as [asId] in context of KeyValue repo + */ abstract val ResultRow.asKey: Key + override val ResultRow.asId: Key + get() = asKey abstract val selectByValue: ISqlExpressionBuilder.(Value) -> Op override suspend fun get(k: Key): Value? = transaction(database) { diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/AbstractExposedReadKeyValueRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/AbstractExposedReadKeyValueRepo.kt index 3b0e7313887..15fa501e579 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/AbstractExposedReadKeyValueRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/onetomany/AbstractExposedReadKeyValueRepo.kt @@ -17,6 +17,8 @@ abstract class AbstractExposedReadKeyValuesRepo( Table(tableName ?: "") { abstract val keyColumn: Column<*> abstract val ResultRow.asKey: Key + override val ResultRow.asId: Key + get() = asKey abstract val selectByValue: ISqlExpressionBuilder.(Value) -> Op override suspend fun count(k: Key): Long = transaction(database) { select { selectById(k) }.count() } diff --git a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapCRUDRepo.kt b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapCRUDRepo.kt index 875510b5ee2..bce6525676d 100644 --- a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapCRUDRepo.kt +++ b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapCRUDRepo.kt @@ -15,6 +15,13 @@ class ReadMapCRUDRepo( ) } + override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult { + return map.keys.drop(pagination.firstIndex).take(pagination.size).createPaginationResult( + pagination, + count() + ) + } + override suspend fun getById(id: IdType): ObjectType? = map[id] override suspend fun contains(id: IdType): Boolean = map.containsKey(id) diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorCRUDRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorCRUDRepoClient.kt index 45a521c264f..51f79547dcc 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorCRUDRepoClient.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorCRUDRepoClient.kt @@ -28,6 +28,7 @@ class KtorCRUDRepoClient ( httpClient, typeInfo(), typeInfo>(), + typeInfo>(), contentType, idSerializer ), diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadCRUDRepoClient.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadCRUDRepoClient.kt index ec675f6857b..250192de745 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadCRUDRepoClient.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/crud/KtorReadCRUDRepoClient.kt @@ -19,6 +19,7 @@ class KtorReadCRUDRepoClient ( private val httpClient: HttpClient, private val objectType: TypeInfo, private val paginationObjectType: TypeInfo, + private val paginationIdType: TypeInfo, private val contentType: ContentType, private val idSerializer: suspend (IdType) -> String ) : ReadCRUDRepo { @@ -27,6 +28,11 @@ class KtorReadCRUDRepoClient ( ) { contentType(contentType) }.body(paginationObjectType) + override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult = httpClient.get( + buildStandardUrl(baseUrl, getIdsByPaginationRouting, pagination.asUrlQueryParts) + ) { + contentType(contentType) + }.body(paginationIdType) override suspend fun getById(id: IdType): ObjectType? = httpClient.get( buildStandardUrl( @@ -72,6 +78,7 @@ inline fun KtorReadCRUDRepoClient( httpClient, typeInfo(), typeInfo>(), + typeInfo>(), contentType, idSerializer ) diff --git a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/crud/CrudReadRoutes.kt b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/crud/CrudReadRoutes.kt index dc44163c26e..d04464d2205 100644 --- a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/crud/CrudReadRoutes.kt +++ b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/crud/CrudReadRoutes.kt @@ -1,5 +1,6 @@ package dev.inmo.micro_utils.repos.ktor.common.crud const val getByPaginationRouting = "getByPagination" +const val getIdsByPaginationRouting = "getIdsByPagination" const val getByIdRouting = "getById" const val containsRouting = "contains" diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadCRUDRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadCRUDRepoRoutes.kt index fd5acf5cf4b..4cc54433b87 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadCRUDRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/crud/KtorReadCRUDRepoRoutes.kt @@ -23,6 +23,11 @@ inline fun Route.configureReadCRUDRepoRoute call.respond(originalRepo.getByPagination(pagination)) } + get(getIdsByPaginationRouting) { + val pagination = call.request.queryParameters.extractPagination + + call.respond(originalRepo.getIdsByPagination(pagination)) + } get(getByIdRouting) { val id = idDeserializer(