diff --git a/app/src/main/java/com/example/testapp/CryptoDealApplication.kt b/app/src/main/java/com/example/testapp/CryptoDealApplication.kt
index 9bfabaa..07f7768 100644
--- a/app/src/main/java/com/example/testapp/CryptoDealApplication.kt
+++ b/app/src/main/java/com/example/testapp/CryptoDealApplication.kt
@@ -1,8 +1,8 @@
package com.example.testapp
import android.app.Application
-import com.example.testapp.room.AppContainer
-import com.example.testapp.room.AppDataContainer
+import com.example.testapp.data.room.AppContainer
+import com.example.testapp.data.room.AppDataContainer
class CryptoDealApplication : Application() {
lateinit var container: AppContainer
diff --git a/app/src/main/java/com/example/testapp/data/api/CryptoDealService.kt b/app/src/main/java/com/example/testapp/data/api/CryptoDealService.kt
new file mode 100644
index 0000000..3f1c10c
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/CryptoDealService.kt
@@ -0,0 +1,135 @@
+package com.example.testapp.data.api
+
+import com.example.testapp.data.api.model.CoinRemote
+import com.example.testapp.data.api.model.DealRemote
+import com.example.testapp.data.api.model.UserRemote
+import com.example.testapp.data.api.model.WalletItemRemote
+import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
+import kotlinx.serialization.json.Json
+import okhttp3.MediaType.Companion.toMediaType
+import okhttp3.OkHttpClient
+import okhttp3.logging.HttpLoggingInterceptor
+import retrofit2.Retrofit
+import retrofit2.http.Body
+import retrofit2.http.DELETE
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.PUT
+import retrofit2.http.Path
+import retrofit2.http.Query
+
+interface UserRequests {
+ /**
+ * User Request interface
+ * */
+ @GET("users")
+ suspend fun getUsers(): List
+
+ @GET("users/{id}")
+ suspend fun getUserById(@Path("id") id: Int): UserRemote
+
+ @POST("users")
+ suspend fun insert(@Body obj: UserRemote): UserRemote
+
+ @PUT("users/{id}")
+ suspend fun update(@Path("id") id: Int, @Body obj: UserRemote): UserRemote
+
+ @DELETE("users/{id}")
+ suspend fun deleteUser(@Path("id") id: Int): UserRemote
+
+ @GET("user_wallet/{id}")
+ suspend fun getUserWallet(@Path("id") id: Int): List
+
+ @GET("user_deal/{id}")
+ suspend fun getUserDeal(@Path("id") id: Int): List
+}
+
+interface DealRequests {
+ /**
+ * Deal Request interface
+ */
+ @GET("deals")
+ suspend fun getDeals(): List
+
+ @GET("deals/{id}")
+ suspend fun getDealById(@Path("id") id: Int): DealRemote
+
+ @POST("deals")
+ suspend fun insert(@Body obj: DealRemote): DealRemote
+
+ @PUT("deals/{id}")
+ suspend fun update(@Path("id") id: Int, @Body obj: DealRemote): DealRemote
+
+ @DELETE("deals/{id}")
+ suspend fun deleteDeal(@Path("id") id: Int): DealRemote
+
+ @GET("p_deals")
+ suspend fun pagingDeals(
+ @Query("_page") page: Int,
+ @Query("_limit") limit: Int
+ ): List
+
+ @POST("complete_deal}")
+ suspend fun completeDeal(
+ @Query("dealId") dealId: Int,
+ @Query("sellerId")sellerId: Int,
+ @Query("buyerId") buyerId: Int,
+ ): Boolean
+}
+
+interface CoinRequests {
+ /**
+ * Coin Request interface
+ */
+ @GET("")
+ suspend fun getCoins(): List
+}
+
+interface WalletItemRequests {
+ /**
+ * Wallet Item Request interface
+ */
+ @GET("wal_item")
+ suspend fun getWalletItems(): List
+
+ @POST("wal_item")
+ suspend fun insert(@Body obj: WalletItemRemote): WalletItemRemote
+
+ @PUT("wal_item")
+ suspend fun update(@Body obj: WalletItemRemote): WalletItemRemote
+
+ @DELETE("wal_item/{id}")
+ suspend fun deleteWalletItem(@Path("id") id: Int): WalletItemRemote
+
+ @GET("p_wal_item")
+ suspend fun pagingWalletItems(
+ @Query("_page") page: Int,
+ @Query("_limit") limit: Int
+ ): List
+}
+
+interface CryptoDealService : UserRequests, DealRequests, CoinRequests, WalletItemRequests {
+ companion object {
+ private const val BASE_URL = "http://10.0.2.2:8079/"
+
+ @Volatile
+ private var INSTANCE: CryptoDealService? = null
+
+ fun getInstance(): CryptoDealService {
+ return INSTANCE ?: synchronized(this) {
+ val logger = HttpLoggingInterceptor()
+ logger.level = HttpLoggingInterceptor.Level.BASIC
+ val client = OkHttpClient.Builder()
+ .addInterceptor(logger)
+ .build()
+ return Retrofit.Builder()
+ .baseUrl(BASE_URL)
+ .client(client)
+ .addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
+ .build()
+ .create(CryptoDealService::class.java)
+ .also { INSTANCE = it }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/mediator/DealRemoteMediator.kt b/app/src/main/java/com/example/testapp/data/api/mediator/DealRemoteMediator.kt
new file mode 100644
index 0000000..52a50d9
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/mediator/DealRemoteMediator.kt
@@ -0,0 +1,105 @@
+package com.example.testapp.data.api.mediator
+
+import androidx.paging.ExperimentalPagingApi
+import androidx.paging.LoadType
+import androidx.paging.PagingState
+import androidx.paging.RemoteMediator
+import androidx.room.withTransaction
+import com.example.testapp.data.api.CryptoDealService
+import com.example.testapp.data.api.model.toDeal
+import com.example.testapp.data.room.database.CryptoDealDb
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.RemoteKeyType
+import com.example.testapp.data.room.models.RemoteKeys
+import com.example.testapp.data.room.repository.offline.OfflineDealRepository
+import com.example.testapp.data.room.repository.offline.OfflineRemoteKeyRepository
+import okio.IOException
+import retrofit2.HttpException
+
+@OptIn(ExperimentalPagingApi::class)
+class DealRemoteMediator(
+ private val service: CryptoDealService,
+ private val dbDealRepository: OfflineDealRepository,
+ private val dbRemoteKeyRepository: OfflineRemoteKeyRepository,
+ private val database: CryptoDealDb
+) : RemoteMediator() {
+
+ override suspend fun initialize(): InitializeAction {
+ return InitializeAction.LAUNCH_INITIAL_REFRESH
+ }
+
+ override suspend fun load(loadType: LoadType, state: PagingState): MediatorResult {
+ val page = when (loadType) {
+ LoadType.REFRESH -> {
+ val remoteKeys = getRemoteKeyClosestToCurrentPosition(state)
+ remoteKeys?.nextKey?.minus(1) ?: 1
+ }
+
+ LoadType.PREPEND -> {
+ val remoteKeys = getRemoteKeyForFirstItem(state)
+ remoteKeys?.prevKey
+ ?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null)
+ }
+
+ LoadType.APPEND -> {
+ val remoteKeys = getRemoteKeyForLastItem(state)
+ remoteKeys?.nextKey
+ ?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null)
+ }
+ }
+
+ try {
+ val articles = service.pagingDeals(page, state.config.pageSize).map { it.toDeal() }
+ val endOfPaginationReached = articles.isEmpty()
+ database.withTransaction {
+ if (loadType == LoadType.REFRESH) {
+ dbRemoteKeyRepository.deleteRemoteKey(RemoteKeyType.DEAL)
+ dbDealRepository.clearData()
+ }
+ val prevKey = if (page == 1) null else page - 1
+ val nextKey = if (endOfPaginationReached) null else page + 1
+ val keys = articles.map {
+ it.id?.let { it1 ->
+ RemoteKeys(
+ entityId = it1,
+ type = RemoteKeyType.DEAL,
+ prevKey = prevKey,
+ nextKey = nextKey
+ )
+ }
+ }
+ dbRemoteKeyRepository.createRemoteKeys(keys)
+ dbDealRepository.insert(articles)
+ }
+ return MediatorResult.Success(endOfPaginationReached = endOfPaginationReached)
+ } catch (exception: IOException) {
+ return MediatorResult.Error(exception)
+ } catch (exception: HttpException) {
+ return MediatorResult.Error(exception)
+ }
+ }
+
+ private suspend fun getRemoteKeyForLastItem(state: PagingState): RemoteKeys? {
+ return state.pages.lastOrNull { it.data.isNotEmpty() }?.data?.lastOrNull()
+ ?.let { art ->
+ art.id?.let { dbRemoteKeyRepository.getAllRemoteKeys(it, RemoteKeyType.DEAL) }
+ }
+ }
+
+ private suspend fun getRemoteKeyForFirstItem(state: PagingState): RemoteKeys? {
+ return state.pages.firstOrNull { it.data.isNotEmpty() }?.data?.firstOrNull()
+ ?.let { art ->
+ art.id?.let { dbRemoteKeyRepository.getAllRemoteKeys(it, RemoteKeyType.DEAL) }
+ }
+ }
+
+ private suspend fun getRemoteKeyClosestToCurrentPosition(
+ state: PagingState
+ ): RemoteKeys? {
+ return state.anchorPosition?.let { position ->
+ state.closestItemToPosition(position)?.id?.let { artid ->
+ dbRemoteKeyRepository.getAllRemoteKeys(artid, RemoteKeyType.DEAL)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/mediator/WalletItemRemoteMediator.kt b/app/src/main/java/com/example/testapp/data/api/mediator/WalletItemRemoteMediator.kt
new file mode 100644
index 0000000..5ec5195
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/mediator/WalletItemRemoteMediator.kt
@@ -0,0 +1,105 @@
+package com.example.testapp.data.api.mediator
+
+import androidx.paging.ExperimentalPagingApi
+import androidx.paging.LoadType
+import androidx.paging.PagingState
+import androidx.paging.RemoteMediator
+import androidx.room.withTransaction
+import com.example.testapp.data.api.CryptoDealService
+import com.example.testapp.data.api.model.toWalletItem
+import com.example.testapp.data.room.database.CryptoDealDb
+import com.example.testapp.data.room.models.RemoteKeyType
+import com.example.testapp.data.room.models.RemoteKeys
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.offline.OfflineRemoteKeyRepository
+import com.example.testapp.data.room.repository.offline.OfflineWalletItemRepository
+import okio.IOException
+import retrofit2.HttpException
+
+@OptIn(ExperimentalPagingApi::class)
+class WalletItemRemoteMediator(
+ private val service: CryptoDealService,
+ private val dbWalletItemRepository: OfflineWalletItemRepository,
+ private val dbRemoteKeyRepository: OfflineRemoteKeyRepository,
+ private val database: CryptoDealDb
+) : RemoteMediator() {
+
+ override suspend fun initialize(): InitializeAction {
+ return InitializeAction.LAUNCH_INITIAL_REFRESH
+ }
+
+ override suspend fun load(loadType: LoadType, state: PagingState): MediatorResult {
+ val page = when (loadType) {
+ LoadType.REFRESH -> {
+ val remoteKeys = getRemoteKeyClosestToCurrentPosition(state)
+ remoteKeys?.nextKey?.minus(1) ?: 1
+ }
+
+ LoadType.PREPEND -> {
+ val remoteKeys = getRemoteKeyForFirstItem(state)
+ remoteKeys?.prevKey
+ ?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null)
+ }
+
+ LoadType.APPEND -> {
+ val remoteKeys = getRemoteKeyForLastItem(state)
+ remoteKeys?.nextKey
+ ?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null)
+ }
+ }
+
+ try {
+ val articles = service.pagingWalletItems(page, state.config.pageSize).map { it.toWalletItem() }
+ val endOfPaginationReached = articles.isEmpty()
+ database.withTransaction {
+ if (loadType == LoadType.REFRESH) {
+ dbRemoteKeyRepository.deleteRemoteKey(RemoteKeyType.WALLETITEM)
+ dbWalletItemRepository.clearData()
+ }
+ val prevKey = if (page == 1) null else page - 1
+ val nextKey = if (endOfPaginationReached) null else page + 1
+ val keys = articles.map {
+ it.id?.let { it1 ->
+ RemoteKeys(
+ entityId = it1,
+ type = RemoteKeyType.WALLETITEM,
+ prevKey = prevKey,
+ nextKey = nextKey
+ )
+ }
+ }
+ dbRemoteKeyRepository.createRemoteKeys(keys)
+ dbWalletItemRepository.insert(articles)
+ }
+ return MediatorResult.Success(endOfPaginationReached = endOfPaginationReached)
+ } catch (exception: IOException) {
+ return MediatorResult.Error(exception)
+ } catch (exception: HttpException) {
+ return MediatorResult.Error(exception)
+ }
+ }
+
+ private suspend fun getRemoteKeyForLastItem(state: PagingState): RemoteKeys? {
+ return state.pages.lastOrNull { it.data.isNotEmpty() }?.data?.lastOrNull()
+ ?.let { art ->
+ art.id?.let { dbRemoteKeyRepository.getAllRemoteKeys(it, RemoteKeyType.WALLETITEM) }
+ }
+ }
+
+ private suspend fun getRemoteKeyForFirstItem(state: PagingState): RemoteKeys? {
+ return state.pages.firstOrNull { it.data.isNotEmpty() }?.data?.firstOrNull()
+ ?.let { art ->
+ art.id?.let { dbRemoteKeyRepository.getAllRemoteKeys(it, RemoteKeyType.WALLETITEM) }
+ }
+ }
+
+ private suspend fun getRemoteKeyClosestToCurrentPosition(
+ state: PagingState
+ ): RemoteKeys? {
+ return state.anchorPosition?.let { position ->
+ state.closestItemToPosition(position)?.id?.let { artid ->
+ dbRemoteKeyRepository.getAllRemoteKeys(artid, RemoteKeyType.WALLETITEM)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/model/CoinRemote.kt b/app/src/main/java/com/example/testapp/data/api/model/CoinRemote.kt
new file mode 100644
index 0000000..f6619ce
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/model/CoinRemote.kt
@@ -0,0 +1,13 @@
+package com.example.testapp.data.api.model
+
+import com.example.testapp.data.room.models.Coin
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class CoinRemote(
+ val id: Int?,
+ val name: String
+)
+
+fun CoinRemote.toCoin(): Coin = Coin(id, name)
+fun Coin.toRemote(): CoinRemote = CoinRemote(id, name)
diff --git a/app/src/main/java/com/example/testapp/data/api/model/DealRemote.kt b/app/src/main/java/com/example/testapp/data/api/model/DealRemote.kt
new file mode 100644
index 0000000..09221b6
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/model/DealRemote.kt
@@ -0,0 +1,44 @@
+package com.example.testapp.data.api.model
+
+import com.example.testapp.data.room.models.Deal
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class DealRemote(
+ val id: Int?,
+ var sellerId: Int?,
+ val buyerId: Int?,
+ val sellerCoinId: Int,
+ val buyerCoinId: Int,
+ val countSell: Float,
+ val countBuy: Float,
+ val operation: String,
+ var date: Long?,
+ val tip: String
+)
+
+fun DealRemote.toDeal(): Deal = Deal(
+ id,
+ sellerId,
+ buyerId,
+ sellerCoinId,
+ buyerCoinId,
+ countSell,
+ countBuy,
+ operation,
+ date,
+ tip
+)
+
+fun Deal.toRemote(): DealRemote = DealRemote(
+ id,
+ sellerId,
+ buyerId,
+ sellerCoinId,
+ buyerCoinId,
+ countSell,
+ countBuy,
+ operation,
+ date,
+ tip
+)
diff --git a/app/src/main/java/com/example/testapp/data/api/model/UserRemote.kt b/app/src/main/java/com/example/testapp/data/api/model/UserRemote.kt
new file mode 100644
index 0000000..639cbfb
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/model/UserRemote.kt
@@ -0,0 +1,14 @@
+package com.example.testapp.data.api.model
+
+import com.example.testapp.data.room.models.User
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class UserRemote(
+ val id: Int? = 0,
+ var email: String = "",
+ var password: String = ""
+)
+
+fun UserRemote.toUser(): User = User(id, email, password)
+fun User.toRemote(): UserRemote = UserRemote(id, email, password)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/model/WalletItemRemote.kt b/app/src/main/java/com/example/testapp/data/api/model/WalletItemRemote.kt
new file mode 100644
index 0000000..2e12c6c
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/model/WalletItemRemote.kt
@@ -0,0 +1,15 @@
+package com.example.testapp.data.api.model
+
+import com.example.testapp.data.room.models.WalletItem
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class WalletItemRemote(
+ val id: Int?,
+ val coinId: Int,
+ val userId: Int,
+ var count: Float,
+)
+
+fun WalletItemRemote.toWalletItem(): WalletItem = WalletItem(id, coinId, userId, count)
+fun WalletItem.toRemote(): WalletItemRemote = WalletItemRemote(id, coinId, userId, count)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/repository/CoinRestRepository.kt b/app/src/main/java/com/example/testapp/data/api/repository/CoinRestRepository.kt
new file mode 100644
index 0000000..cbed51d
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/repository/CoinRestRepository.kt
@@ -0,0 +1,46 @@
+package com.example.testapp.data.api.repository
+
+import com.example.testapp.data.api.CryptoDealService
+import com.example.testapp.data.api.model.toCoin
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.repository.basic.CoinRepository
+import com.example.testapp.data.room.repository.offline.OfflineCoinRepository
+
+class CoinRestRepository(
+ private val service: CryptoDealService,
+ private val dbCoinRepository: OfflineCoinRepository
+) : CoinRepository {
+ override suspend fun insert(x: Coin) {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun update(x: Coin) {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun delete(x: Coin) {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun getById(id: Int): Coin {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun getAll(): List {
+ val exists = dbCoinRepository.getAll().associateBy { it.id }.toMutableMap()
+
+ service.getCoins()
+ .map { it.toCoin() }
+ .forEach { item ->
+ val existUser = exists[item.id]
+ if (existUser == null) {
+ dbCoinRepository.insert(item)
+ } else if (existUser != item) {
+ dbCoinRepository.update(item)
+ }
+ exists[item.id] = item
+ }
+
+ return exists.map { it.value }.sortedBy { it.id }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/repository/DealRestRepository.kt b/app/src/main/java/com/example/testapp/data/api/repository/DealRestRepository.kt
new file mode 100644
index 0000000..35f1399
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/repository/DealRestRepository.kt
@@ -0,0 +1,105 @@
+package com.example.testapp.data.api.repository
+
+import androidx.paging.ExperimentalPagingApi
+import androidx.paging.Pager
+import androidx.paging.PagingConfig
+import androidx.paging.PagingData
+import androidx.paging.PagingSource
+import com.example.testapp.data.api.CryptoDealService
+import com.example.testapp.data.api.mediator.DealRemoteMediator
+import com.example.testapp.data.api.model.toDeal
+import com.example.testapp.data.api.model.toRemote
+import com.example.testapp.data.room.AppContainer
+import com.example.testapp.data.room.database.CryptoDealDb
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.repository.basic.DealRepository
+import com.example.testapp.data.room.repository.offline.OfflineDealRepository
+import com.example.testapp.data.room.repository.offline.OfflineRemoteKeyRepository
+import kotlinx.coroutines.flow.Flow
+
+class DealRestRepository(
+ private val service: CryptoDealService,
+ private val dbDealRepository: OfflineDealRepository,
+ private val dbRemoteKeyRepository: OfflineRemoteKeyRepository,
+ private val database: CryptoDealDb
+
+) : DealRepository {
+ override suspend fun getUserDeals(id: Int): List {
+ val exists = dbDealRepository.getAll().associateBy { it.id }.toMutableMap()
+
+ service.getDeals()
+ .map { it.toDeal() }
+ .forEach { item ->
+ val existUser = exists[item.id]
+ if (existUser == null) {
+ dbDealRepository.insert(item)
+ } else if (existUser != item) {
+ dbDealRepository.update(item)
+ }
+ exists[item.id] = item
+ }
+
+ return exists.map { it.value }.sortedBy { it.id }
+ }
+
+ override suspend fun completeDeal(deal: Deal, sellerId: Int, buyerId: Int): Boolean {
+ return service.completeDeal(deal.id!!, sellerId, buyerId)
+ }
+
+ override fun pagingData(): Flow> {
+ val pagingSourceFactory = { dbDealRepository.getAllPagingData() }
+
+ @OptIn(ExperimentalPagingApi::class)
+ return Pager(
+ config = PagingConfig(
+ pageSize = AppContainer.LIMIT,
+ enablePlaceholders = false
+ ),
+ remoteMediator = DealRemoteMediator(
+ service,
+ dbDealRepository,
+ dbRemoteKeyRepository,
+ database
+ ),
+ pagingSourceFactory = pagingSourceFactory
+ ).flow
+ }
+
+ override fun getAllPagingData(): PagingSource {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun insert(x: Deal) {
+ service.insert(x.toRemote())
+ }
+
+ override suspend fun update(x: Deal) {
+ x.id?.let { service.update(it, x.toRemote()) }
+ }
+
+ override suspend fun delete(x: Deal) {
+ x.id?.let { service.deleteDeal(it) }
+ }
+
+ override suspend fun getById(id: Int): Deal {
+ return service.getDealById(id).toDeal()
+ }
+
+ override suspend fun getAll(): List {
+ val exists = dbDealRepository.getAll().associateBy { it.id }.toMutableMap()
+
+ service.getDeals()
+ .map { it.toDeal() }
+ .forEach { item ->
+ val existUser = exists[item.id]
+ if (existUser == null) {
+ dbDealRepository.insert(item)
+ } else if (existUser != item) {
+ dbDealRepository.update(item)
+ }
+ exists[item.id] = item
+ }
+
+ return exists.map { it.value }.sortedBy { it.id }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/repository/UserRestRepository.kt b/app/src/main/java/com/example/testapp/data/api/repository/UserRestRepository.kt
new file mode 100644
index 0000000..4005ac8
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/repository/UserRestRepository.kt
@@ -0,0 +1,97 @@
+package com.example.testapp.data.api.repository
+
+import com.example.testapp.data.api.CryptoDealService
+import com.example.testapp.data.api.model.toDeal
+import com.example.testapp.data.api.model.toRemote
+import com.example.testapp.data.api.model.toUser
+import com.example.testapp.data.api.model.toWalletItem
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.basic.DealRepository
+import com.example.testapp.data.room.repository.basic.UserRepository
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
+
+class UserRestRepository(
+ private val service: CryptoDealService,
+ private val dbUserRepository: UserRepository,
+ private val dbDealRepository: DealRepository,
+ private val dbWalletItemRepository: WalletItemRepository
+) : UserRepository {
+ override suspend fun getUserWallet(id: Int): List {
+ val existArticles = dbUserRepository.getUserWallet(id)
+ .associateBy { it.userId * 10 + it.coinId }.toMutableMap()
+
+ service.getUserWallet(id)
+ .map { it.toWalletItem() }
+ .forEach { walletItem ->
+ val pseudoId = walletItem.userId * 10 + walletItem.coinId
+ if (walletItem.userId == id) {
+ val existArt = existArticles[pseudoId]
+ if (existArt == null) {
+ dbWalletItemRepository.insert(walletItem)
+ } else if (existArt != walletItem) {
+ dbWalletItemRepository.update(walletItem)
+ }
+ existArticles[pseudoId] = walletItem
+ }
+ }
+
+ return existArticles.map { it.value }.sortedBy { it.count }
+ }
+
+ override suspend fun getUserDeals(id: Int): List {
+ val existArticles = dbUserRepository.getUserDeals(id)
+ .associateBy { it.id }.toMutableMap()
+
+ service.getUserDeal(id)
+ .map { it.toDeal() }
+ .forEach { deal ->
+ if (deal.buyerId == id) {
+ val existArt = existArticles[deal.id]
+ if (existArt == null) {
+ dbDealRepository.insert(deal)
+ } else if (existArt != deal) {
+ dbDealRepository.update(deal)
+ }
+ existArticles[deal.id] = deal
+ }
+ }
+
+ return existArticles.map { it.value }.sortedBy { it.id }
+ }
+
+ override suspend fun insert(x: User) {
+ service.insert(x.toRemote())
+ }
+
+ override suspend fun update(x: User) {
+ x.id?.let { service.update(it, x.toRemote()) }
+ }
+
+ override suspend fun delete(x: User) {
+ x.id?.let { service.deleteUser(it) }
+ }
+
+ override suspend fun getById(id: Int): User {
+ return service.getUserById(id).toUser()
+ }
+
+ override suspend fun getAll(): List {
+ val existUsers = dbUserRepository.getAll().associateBy { it.id }.toMutableMap()
+
+ service.getUsers()
+ .map { it.toUser() }
+ .forEach { user ->
+ val existUser = existUsers[user.id]
+ if (existUser == null) {
+ dbUserRepository.insert(user)
+ } else if (existUser != user) {
+ dbUserRepository.update(user)
+ }
+ existUsers[user.id] = user
+ }
+
+ return existUsers.map { it.value }.sortedBy { it.id }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/api/repository/WalletItemRestRepository.kt b/app/src/main/java/com/example/testapp/data/api/repository/WalletItemRestRepository.kt
new file mode 100644
index 0000000..385e200
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/api/repository/WalletItemRestRepository.kt
@@ -0,0 +1,86 @@
+package com.example.testapp.data.api.repository
+
+import androidx.paging.ExperimentalPagingApi
+import androidx.paging.Pager
+import androidx.paging.PagingConfig
+import androidx.paging.PagingData
+import androidx.paging.PagingSource
+import com.example.testapp.data.api.CryptoDealService
+import com.example.testapp.data.api.mediator.WalletItemRemoteMediator
+import com.example.testapp.data.api.model.toRemote
+import com.example.testapp.data.api.model.toWalletItem
+import com.example.testapp.data.room.AppContainer
+import com.example.testapp.data.room.database.CryptoDealDb
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
+import com.example.testapp.data.room.repository.offline.OfflineRemoteKeyRepository
+import com.example.testapp.data.room.repository.offline.OfflineWalletItemRepository
+import kotlinx.coroutines.flow.Flow
+
+class WalletItemRestRepository(
+ private val service: CryptoDealService,
+ private val dbWalletItemRepository: OfflineWalletItemRepository,
+ private val dbRemoteKeyRepository: OfflineRemoteKeyRepository,
+ private val database: CryptoDealDb
+) : WalletItemRepository {
+ override fun getUserWallet(id: Int): List {
+ TODO("Not yet implemented")
+ }
+
+ override fun pagingData(id: Int): Flow> {
+ val pagingSourceFactory = { dbWalletItemRepository.getWalletItemsPaging(id) }
+
+ @OptIn(ExperimentalPagingApi::class)
+ return Pager(
+ config = PagingConfig(
+ pageSize = AppContainer.LIMIT,
+ enablePlaceholders = false
+ ),
+ remoteMediator = WalletItemRemoteMediator(
+ service,
+ dbWalletItemRepository,
+ dbRemoteKeyRepository,
+ database
+ ),
+ pagingSourceFactory = pagingSourceFactory
+ ).flow
+ }
+
+ override fun getWalletItemsPaging(id: Int): PagingSource {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun insert(x: WalletItem) {
+ service.insert(x.toRemote())
+ }
+
+ override suspend fun update(x: WalletItem) {
+ service.update(x.toRemote())
+ }
+
+ override suspend fun delete(x: WalletItem) {
+ x.id?.let { service.deleteWalletItem(it) }
+ }
+
+ override suspend fun getById(id: Int): WalletItem {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun getAll(): List {
+ val exists = dbWalletItemRepository.getAll().associateBy { it.id }.toMutableMap()
+
+ service.getWalletItems()
+ .map { it.toWalletItem() }
+ .forEach { item ->
+ val existUser = exists[item.id]
+ if (existUser == null) {
+ dbWalletItemRepository.insert(item)
+ } else if (existUser != item) {
+ dbWalletItemRepository.update(item)
+ }
+ exists[item.id] = item
+ }
+
+ return exists.map { it.value }.sortedBy { it.id }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/AppContainer.kt b/app/src/main/java/com/example/testapp/data/room/AppContainer.kt
similarity index 56%
rename from app/src/main/java/com/example/testapp/room/AppContainer.kt
rename to app/src/main/java/com/example/testapp/data/room/AppContainer.kt
index 0da2099..b167f9d 100644
--- a/app/src/main/java/com/example/testapp/room/AppContainer.kt
+++ b/app/src/main/java/com/example/testapp/data/room/AppContainer.kt
@@ -1,30 +1,31 @@
-package com.example.testapp.room
+package com.example.testapp.data.room
import android.content.Context
-import com.example.testapp.room.database.CryptoDealDb
-import com.example.testapp.room.repository.basic.CoinRepository
-import com.example.testapp.room.repository.basic.DealRepository
-import com.example.testapp.room.repository.basic.UserRepository
-import com.example.testapp.room.repository.basic.WalletItemRepository
-import com.example.testapp.room.repository.offline.OfflineCoinRepository
-import com.example.testapp.room.repository.offline.OfflineDealRepository
-import com.example.testapp.room.repository.offline.OfflineUserRepository
-import com.example.testapp.room.repository.offline.OfflineWalletItemRepository
+import com.example.testapp.data.room.database.CryptoDealDb
+import com.example.testapp.data.room.repository.basic.CoinRepository
+import com.example.testapp.data.room.repository.basic.DealRepository
+import com.example.testapp.data.room.repository.basic.UserRepository
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
+import com.example.testapp.data.room.repository.offline.OfflineCoinRepository
+import com.example.testapp.data.room.repository.offline.OfflineDealRepository
+import com.example.testapp.data.room.repository.offline.OfflineUserRepository
+import com.example.testapp.data.room.repository.offline.OfflineWalletItemRepository
interface AppContainer {
val userRepository: UserRepository
val dealRepository: DealRepository
val coinRepository: CoinRepository
val walletItemRepository: WalletItemRepository
+
+ companion object {
+ const val TIMEOUT = 5000L
+ const val LIMIT = 10
+ }
}
class AppDataContainer(
private val context: Context
) : AppContainer {
- companion object {
- const val TIMEOUT = 5000L
- }
-
override val userRepository: UserRepository by lazy {
OfflineUserRepository(CryptoDealDb.getInstance(context).userDao())
}
diff --git a/app/src/main/java/com/example/testapp/data/room/dao/CoinDao.kt b/app/src/main/java/com/example/testapp/data/room/dao/CoinDao.kt
new file mode 100644
index 0000000..0d1be72
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/dao/CoinDao.kt
@@ -0,0 +1,11 @@
+package com.example.testapp.data.room.dao
+
+import androidx.room.Dao
+import androidx.room.Query
+import com.example.testapp.data.room.models.Coin
+
+@Dao
+interface CoinDao : IDao {
+ @Query("select * from coin")
+ fun getAll(): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/dao/DealDao.kt b/app/src/main/java/com/example/testapp/data/room/dao/DealDao.kt
similarity index 65%
rename from app/src/main/java/com/example/testapp/room/dao/DealDao.kt
rename to app/src/main/java/com/example/testapp/data/room/dao/DealDao.kt
index 2391e40..f66c54f 100644
--- a/app/src/main/java/com/example/testapp/room/dao/DealDao.kt
+++ b/app/src/main/java/com/example/testapp/data/room/dao/DealDao.kt
@@ -1,9 +1,9 @@
-package com.example.testapp.room.dao
+package com.example.testapp.data.room.dao
+import androidx.paging.PagingSource
import androidx.room.Dao
import androidx.room.Query
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.User
+import com.example.testapp.data.room.models.Deal
import kotlinx.coroutines.flow.Flow
@Dao
@@ -19,4 +19,10 @@ interface DealDao : IDao {
@Query("select * from deal where deal.buyerId = :idUser OR deal.sellerId = :idUser")
fun getUserDeals(idUser: Int): Flow>
+
+ @Query("SELECT * FROM deal where deal.date IS NULL ORDER BY id ASC")
+ fun getDeals(): PagingSource
+
+ @Query("DELETE FROM deal")
+ suspend fun deleteAll()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/dao/IDao.kt b/app/src/main/java/com/example/testapp/data/room/dao/IDao.kt
similarity index 74%
rename from app/src/main/java/com/example/testapp/room/dao/IDao.kt
rename to app/src/main/java/com/example/testapp/data/room/dao/IDao.kt
index a2298a3..8f10151 100644
--- a/app/src/main/java/com/example/testapp/room/dao/IDao.kt
+++ b/app/src/main/java/com/example/testapp/data/room/dao/IDao.kt
@@ -1,4 +1,4 @@
-package com.example.testapp.room.dao
+package com.example.testapp.data.room.dao
import androidx.room.Dao
import androidx.room.Delete
@@ -8,7 +8,7 @@ import androidx.room.Update
@Dao
interface IDao {
@Insert
- suspend fun insert(obj: T)
+ suspend fun insert(vararg obj: T)
@Update
suspend fun update(obj: T)
diff --git a/app/src/main/java/com/example/testapp/data/room/dao/RemoteKeysDao.kt b/app/src/main/java/com/example/testapp/data/room/dao/RemoteKeysDao.kt
new file mode 100644
index 0000000..9396edd
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/dao/RemoteKeysDao.kt
@@ -0,0 +1,18 @@
+package com.example.testapp.data.room.dao
+
+import androidx.room.Insert
+import androidx.room.OnConflictStrategy
+import androidx.room.Query
+import com.example.testapp.data.room.models.RemoteKeyType
+import com.example.testapp.data.room.models.RemoteKeys
+
+interface RemoteKeysDao {
+ @Query("SELECT * FROM remote_keys WHERE entityId = :entityId AND type = :type")
+ suspend fun getRemoteKeys(entityId: Int, type: RemoteKeyType): RemoteKeys?
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun insertAll(remoteKey: List)
+
+ @Query("DELETE FROM remote_keys WHERE type = :type")
+ suspend fun clearRemoteKeys(type: RemoteKeyType)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/dao/UserDao.kt b/app/src/main/java/com/example/testapp/data/room/dao/UserDao.kt
similarity index 74%
rename from app/src/main/java/com/example/testapp/room/dao/UserDao.kt
rename to app/src/main/java/com/example/testapp/data/room/dao/UserDao.kt
index db15d73..8e7fae6 100644
--- a/app/src/main/java/com/example/testapp/room/dao/UserDao.kt
+++ b/app/src/main/java/com/example/testapp/data/room/dao/UserDao.kt
@@ -1,10 +1,10 @@
-package com.example.testapp.room.dao
+package com.example.testapp.data.room.dao
import androidx.room.Dao
import androidx.room.Query
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.User
-import com.example.testapp.room.models.WalletItem
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.models.WalletItem
import kotlinx.coroutines.flow.Flow
@Dao
diff --git a/app/src/main/java/com/example/testapp/data/room/dao/WalletItemDao.kt b/app/src/main/java/com/example/testapp/data/room/dao/WalletItemDao.kt
new file mode 100644
index 0000000..80a0459
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/dao/WalletItemDao.kt
@@ -0,0 +1,24 @@
+package com.example.testapp.data.room.dao
+
+import androidx.paging.PagingSource
+import androidx.room.Dao
+import androidx.room.Query
+import com.example.testapp.data.room.models.WalletItem
+
+@Dao
+interface WalletItemDao : IDao {
+ @Query("select * from walletitem")
+ fun getAll(): List
+
+ @Query("select * from walletitem where walletitem.userId = :id ORDER BY walletitem.coinId DESC LIMIT :limit OFFSET :offset")
+ fun getAll(limit: Int, offset: Int, id: Int): List
+
+ @Query("select * from walletitem where walletitem.userId = :id")
+ fun getUserWallet(id: Int): List
+
+ @Query("SELECT * FROM walletitem where walletitem.userId = :id ORDER BY walletitem.coinId ASC")
+ fun getDeals(id: Int): PagingSource
+
+ @Query("DELETE FROM walletitem")
+ suspend fun deleteAll()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/database/CryptoDealDb.kt b/app/src/main/java/com/example/testapp/data/room/database/CryptoDealDb.kt
similarity index 77%
rename from app/src/main/java/com/example/testapp/room/database/CryptoDealDb.kt
rename to app/src/main/java/com/example/testapp/data/room/database/CryptoDealDb.kt
index d0ffc3d..1cc3673 100644
--- a/app/src/main/java/com/example/testapp/room/database/CryptoDealDb.kt
+++ b/app/src/main/java/com/example/testapp/data/room/database/CryptoDealDb.kt
@@ -1,18 +1,22 @@
-package com.example.testapp.room.database
+package com.example.testapp.data.room.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
-import androidx.sqlite.db.SupportSQLiteDatabase
-import com.example.testapp.room.dao.*
-import com.example.testapp.room.models.*
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
+import com.example.testapp.data.room.dao.CoinDao
+import com.example.testapp.data.room.dao.DealDao
+import com.example.testapp.data.room.dao.RemoteKeysDao
+import com.example.testapp.data.room.dao.UserDao
+import com.example.testapp.data.room.dao.WalletItemDao
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.RemoteKeys
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.models.WalletItem
@Database(
- entities = [User::class, Deal::class, Coin::class, WalletItem::class],
+ entities = [User::class, Deal::class, Coin::class, WalletItem::class, RemoteKeys::class],
version = 2,
exportSchema = false)
abstract class CryptoDealDb: RoomDatabase() {
@@ -20,6 +24,7 @@ abstract class CryptoDealDb: RoomDatabase() {
abstract fun coinDao(): CoinDao;
abstract fun dealDao(): DealDao;
abstract fun walletItemDao(): WalletItemDao;
+ abstract fun RemoteKeysDao(): RemoteKeysDao;
companion object {
private const val DB_NAME: String = "crypto-deal7"
@@ -91,14 +96,14 @@ abstract class CryptoDealDb: RoomDatabase() {
CryptoDealDb::class.java,
DB_NAME
)
- .addCallback(object : Callback() {
- override fun onCreate(db: SupportSQLiteDatabase) {
- super.onCreate(db)
- CoroutineScope(Dispatchers.IO).launch {
- populateDatabase()
- }
- }
- })
+// .addCallback(object : Callback() {
+// override fun onCreate(db: SupportSQLiteDatabase) {
+// super.onCreate(db)
+// CoroutineScope(Dispatchers.IO).launch {
+// populateDatabase()
+// }
+// }
+// })
.allowMainThreadQueries()
.build()
.also { INSTANCE = it }
diff --git a/app/src/main/java/com/example/testapp/room/models/Coin.kt b/app/src/main/java/com/example/testapp/data/room/models/Coin.kt
similarity index 87%
rename from app/src/main/java/com/example/testapp/room/models/Coin.kt
rename to app/src/main/java/com/example/testapp/data/room/models/Coin.kt
index e92277a..98c1ad2 100644
--- a/app/src/main/java/com/example/testapp/room/models/Coin.kt
+++ b/app/src/main/java/com/example/testapp/data/room/models/Coin.kt
@@ -1,4 +1,4 @@
-package com.example.testapp.room.models
+package com.example.testapp.data.room.models
import androidx.room.ColumnInfo
import androidx.room.Entity
diff --git a/app/src/main/java/com/example/testapp/room/models/Deal.kt b/app/src/main/java/com/example/testapp/data/room/models/Deal.kt
similarity index 83%
rename from app/src/main/java/com/example/testapp/room/models/Deal.kt
rename to app/src/main/java/com/example/testapp/data/room/models/Deal.kt
index 4313989..4f5eb1b 100644
--- a/app/src/main/java/com/example/testapp/room/models/Deal.kt
+++ b/app/src/main/java/com/example/testapp/data/room/models/Deal.kt
@@ -1,8 +1,7 @@
-package com.example.testapp.room.models
+package com.example.testapp.data.room.models
import androidx.room.Entity
import androidx.room.PrimaryKey
-import java.time.LocalDateTime
@Entity
class Deal (
diff --git a/app/src/main/java/com/example/testapp/data/room/models/RemoteKeys.kt b/app/src/main/java/com/example/testapp/data/room/models/RemoteKeys.kt
new file mode 100644
index 0000000..2bc18f0
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/models/RemoteKeys.kt
@@ -0,0 +1,26 @@
+package com.example.testapp.data.room.models
+
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+import androidx.room.TypeConverter
+import androidx.room.TypeConverters
+
+enum class RemoteKeyType(private val type: String) {
+ DEAL(Deal::class.simpleName ?: "Deal"),
+ WALLETITEM(WalletItem::class.simpleName ?: "WalletItem");
+
+ @TypeConverter
+ fun toRemoteKeyType(value: String) = RemoteKeyType.values().first { it.type == value }
+
+ @TypeConverter
+ fun fromRemoteKeyType(value: RemoteKeyType) = value.type
+}
+
+@Entity(tableName = "remote_keys")
+data class RemoteKeys(
+ @PrimaryKey val entityId: Int,
+ @TypeConverters(RemoteKeyType::class)
+ val type: RemoteKeyType,
+ val prevKey: Int?,
+ val nextKey: Int?
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/models/User.kt b/app/src/main/java/com/example/testapp/data/room/models/User.kt
similarity index 93%
rename from app/src/main/java/com/example/testapp/room/models/User.kt
rename to app/src/main/java/com/example/testapp/data/room/models/User.kt
index a9b16d4..05de8e9 100644
--- a/app/src/main/java/com/example/testapp/room/models/User.kt
+++ b/app/src/main/java/com/example/testapp/data/room/models/User.kt
@@ -1,4 +1,4 @@
-package com.example.testapp.room.models
+package com.example.testapp.data.room.models
import androidx.room.ColumnInfo
import androidx.room.Entity
diff --git a/app/src/main/java/com/example/testapp/room/models/WalletItem.kt b/app/src/main/java/com/example/testapp/data/room/models/WalletItem.kt
similarity index 80%
rename from app/src/main/java/com/example/testapp/room/models/WalletItem.kt
rename to app/src/main/java/com/example/testapp/data/room/models/WalletItem.kt
index a70437b..2b9b172 100644
--- a/app/src/main/java/com/example/testapp/room/models/WalletItem.kt
+++ b/app/src/main/java/com/example/testapp/data/room/models/WalletItem.kt
@@ -1,7 +1,8 @@
-package com.example.testapp.room.models
+package com.example.testapp.data.room.models
import androidx.room.Entity
import androidx.room.ForeignKey
+import androidx.room.PrimaryKey
@Entity(
primaryKeys = ["coinId", "userId"],
@@ -11,6 +12,8 @@ import androidx.room.ForeignKey
]
)
class WalletItem (
+ @PrimaryKey(autoGenerate = true)
+ val id: Int?,
val coinId: Int,
val userId: Int,
var count: Float,
diff --git a/app/src/main/java/com/example/testapp/room/pagination/DealPagination.kt b/app/src/main/java/com/example/testapp/data/room/pagination/DealPagination.kt
similarity index 87%
rename from app/src/main/java/com/example/testapp/room/pagination/DealPagination.kt
rename to app/src/main/java/com/example/testapp/data/room/pagination/DealPagination.kt
index aa36e97..4ef3530 100644
--- a/app/src/main/java/com/example/testapp/room/pagination/DealPagination.kt
+++ b/app/src/main/java/com/example/testapp/data/room/pagination/DealPagination.kt
@@ -1,10 +1,9 @@
-package com.example.testapp.room.pagination
+package com.example.testapp.data.room.pagination
-import android.util.Log
import androidx.paging.PagingSource
import androidx.paging.PagingState
-import com.example.testapp.room.dao.DealDao
-import com.example.testapp.room.models.Deal
+import com.example.testapp.data.room.dao.DealDao
+import com.example.testapp.data.room.models.Deal
import kotlinx.coroutines.delay
class DealPagination(
diff --git a/app/src/main/java/com/example/testapp/room/pagination/WalletPagination.kt b/app/src/main/java/com/example/testapp/data/room/pagination/WalletPagination.kt
similarity index 84%
rename from app/src/main/java/com/example/testapp/room/pagination/WalletPagination.kt
rename to app/src/main/java/com/example/testapp/data/room/pagination/WalletPagination.kt
index 808f953..03a7498 100644
--- a/app/src/main/java/com/example/testapp/room/pagination/WalletPagination.kt
+++ b/app/src/main/java/com/example/testapp/data/room/pagination/WalletPagination.kt
@@ -1,11 +1,10 @@
-package com.example.testapp.room.pagination
+package com.example.testapp.data.room.pagination
import android.util.Log
import androidx.paging.PagingSource
import androidx.paging.PagingState
-import com.example.testapp.room.dao.WalletItemDao
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.repository.basic.WalletItemRepository
+import com.example.testapp.data.room.dao.WalletItemDao
+import com.example.testapp.data.room.models.WalletItem
import kotlinx.coroutines.delay
class WalletPagination(
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/basic/CoinRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/basic/CoinRepository.kt
new file mode 100644
index 0000000..c58fc94
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/basic/CoinRepository.kt
@@ -0,0 +1,6 @@
+package com.example.testapp.data.room.repository.basic
+
+import com.example.testapp.data.room.models.Coin
+
+interface CoinRepository : IRepository {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/basic/DealRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/basic/DealRepository.kt
new file mode 100644
index 0000000..226189c
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/basic/DealRepository.kt
@@ -0,0 +1,14 @@
+package com.example.testapp.data.room.repository.basic
+
+import androidx.paging.PagingData
+import androidx.paging.PagingSource
+import com.example.testapp.data.room.models.Deal
+import kotlinx.coroutines.flow.Flow
+
+interface DealRepository : IRepository {
+ suspend fun getUserDeals(id: Int): List
+ suspend fun completeDeal(deal: Deal, sellerId: Int, buyerId: Int): Boolean
+ suspend fun clearData()
+ fun pagingData(): Flow>
+ fun getAllPagingData(): PagingSource
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/basic/IRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/basic/IRepository.kt
new file mode 100644
index 0000000..0139277
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/basic/IRepository.kt
@@ -0,0 +1,9 @@
+package com.example.testapp.data.room.repository.basic
+
+interface IRepository {
+ suspend fun insert(vararg x: T)
+ suspend fun update(x: T)
+ suspend fun delete(x: T)
+ suspend fun getById(id: Int): T
+ suspend fun getAll(): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/basic/RemoteKeyRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/basic/RemoteKeyRepository.kt
new file mode 100644
index 0000000..16bf74a
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/basic/RemoteKeyRepository.kt
@@ -0,0 +1,10 @@
+package com.example.testapp.data.room.repository.basic
+
+import com.example.testapp.data.room.models.RemoteKeyType
+import com.example.testapp.data.room.models.RemoteKeys
+
+interface RemoteKeyRepository {
+ suspend fun getAllRemoteKeys(id: Int, type: RemoteKeyType): RemoteKeys?
+ suspend fun createRemoteKeys(remoteKeys: List)
+ suspend fun deleteRemoteKey(type: RemoteKeyType)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/basic/UserRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/basic/UserRepository.kt
new file mode 100644
index 0000000..d7a33d2
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/basic/UserRepository.kt
@@ -0,0 +1,10 @@
+package com.example.testapp.data.room.repository.basic
+
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.models.WalletItem
+
+interface UserRepository : IRepository {
+ suspend fun getUserWallet(id: Int): List
+ suspend fun getUserDeals(id: Int): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/basic/WalletItemRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/basic/WalletItemRepository.kt
new file mode 100644
index 0000000..0d96fd0
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/basic/WalletItemRepository.kt
@@ -0,0 +1,13 @@
+package com.example.testapp.data.room.repository.basic
+
+import androidx.paging.PagingData
+import androidx.paging.PagingSource
+import com.example.testapp.data.room.models.WalletItem
+import kotlinx.coroutines.flow.Flow
+
+interface WalletItemRepository : IRepository {
+ fun getUserWallet(id: Int): List
+ fun pagingData(id: Int): Flow>
+ fun getWalletItemsPaging(id: Int): PagingSource
+ suspend fun clearData()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineCoinRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineCoinRepository.kt
new file mode 100644
index 0000000..aa27f82
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineCoinRepository.kt
@@ -0,0 +1,12 @@
+package com.example.testapp.data.room.repository.offline
+
+import com.example.testapp.data.room.dao.CoinDao
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.repository.basic.CoinRepository
+
+class OfflineCoinRepository(
+ private val coinDao: CoinDao
+) : OfflineRepository(coinDao), CoinRepository {
+ override suspend fun getAll(): List = coinDao.getAll()
+ override suspend fun getById(id: Int): Coin = throw NotImplementedError()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineDealRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineDealRepository.kt
new file mode 100644
index 0000000..1e8d922
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineDealRepository.kt
@@ -0,0 +1,33 @@
+package com.example.testapp.data.room.repository.offline
+
+import androidx.paging.Pager
+import androidx.paging.PagingConfig
+import androidx.paging.PagingData
+import com.example.testapp.data.room.dao.DealDao
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.pagination.DealPagination
+import com.example.testapp.data.room.repository.basic.DealRepository
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.first
+
+class OfflineDealRepository(
+ private val dealDao: DealDao
+) : OfflineRepository(dealDao), DealRepository {
+ override suspend fun getAll(): List = dealDao.getAll().first()
+ override suspend fun getById(id: Int): Deal = dealDao.getById(id);
+ override suspend fun getUserDeals(id: Int): List = dealDao.getUserDeals(id).first()
+
+ override suspend fun completeDeal(deal: Deal, sellerId: Int, buyerId: Int): Boolean {
+ return true;
+ }
+
+ override suspend fun clearData() = dealDao.deleteAll()
+
+ override fun pagingData(): Flow> = Pager(config = PagingConfig(
+ pageSize = 4, jumpThreshold = 4, initialLoadSize = 4
+ ), pagingSourceFactory = { DealPagination(dealDao) }, initialKey = 1).flow
+
+ override fun getAllPagingData() = dealDao.getDeals()
+
+ suspend fun insert(list: List) = dealDao.insert(*list.toTypedArray())
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineRemoteKeysRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineRemoteKeysRepository.kt
new file mode 100644
index 0000000..768eed9
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineRemoteKeysRepository.kt
@@ -0,0 +1,17 @@
+package com.example.testapp.data.room.repository.offline
+
+import com.example.testapp.data.room.dao.RemoteKeysDao
+import com.example.testapp.data.room.models.RemoteKeyType
+import com.example.testapp.data.room.models.RemoteKeys
+import com.example.testapp.data.room.repository.basic.RemoteKeyRepository
+
+class OfflineRemoteKeyRepository(private val remoteKeysDao: RemoteKeysDao) : RemoteKeyRepository {
+ override suspend fun getAllRemoteKeys(id: Int, type: RemoteKeyType) =
+ remoteKeysDao.getRemoteKeys(id, type)
+
+ override suspend fun createRemoteKeys(remoteKeys: List) =
+ remoteKeysDao.insertAll(remoteKeys)
+
+ override suspend fun deleteRemoteKey(type: RemoteKeyType) =
+ remoteKeysDao.clearRemoteKeys(type)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineRepository.kt
new file mode 100644
index 0000000..3ee686a
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineRepository.kt
@@ -0,0 +1,12 @@
+package com.example.testapp.data.room.repository.offline
+
+import com.example.testapp.data.room.dao.IDao
+import com.example.testapp.data.room.repository.basic.IRepository
+
+abstract class OfflineRepository (
+ private val dao: IDao
+) : IRepository {
+ override suspend fun insert(vararg x: T) = dao.insert(*x)
+ override suspend fun update(x: T) = dao.update(x)
+ override suspend fun delete(x: T) = dao.delete(x)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineUserRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineUserRepository.kt
new file mode 100644
index 0000000..a82483c
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineUserRepository.kt
@@ -0,0 +1,17 @@
+package com.example.testapp.data.room.repository.offline
+
+import com.example.testapp.data.room.dao.UserDao
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.basic.UserRepository
+import kotlinx.coroutines.flow.Flow
+
+class OfflineUserRepository(
+ private val userDao: UserDao
+) : OfflineRepository(userDao), UserRepository {
+ override suspend fun getAll(): Flow> = userDao.getAll()
+ override suspend fun getById(id: Int): User = userDao.getUserById(id)
+ override suspend fun getUserWallet(id: Int): Flow> = userDao.getUserWallet(id)
+ override suspend fun getUserDeals(id: Int): Flow> = userDao.getUserDeals(id)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineWalletItemRepository.kt b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineWalletItemRepository.kt
new file mode 100644
index 0000000..43da4b6
--- /dev/null
+++ b/app/src/main/java/com/example/testapp/data/room/repository/offline/OfflineWalletItemRepository.kt
@@ -0,0 +1,27 @@
+package com.example.testapp.data.room.repository.offline
+
+import androidx.paging.Pager
+import androidx.paging.PagingConfig
+import androidx.paging.PagingData
+import androidx.paging.PagingSource
+import com.example.testapp.data.room.dao.WalletItemDao
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.pagination.WalletPagination
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
+import kotlinx.coroutines.flow.Flow
+
+class OfflineWalletItemRepository(
+ private val walletItemDao: WalletItemDao
+) : OfflineRepository(walletItemDao), WalletItemRepository {
+ override fun getUserWallet(id: Int): List = walletItemDao.getUserWallet(id)
+ override suspend fun getAll(): List = walletItemDao.getAll()
+ override suspend fun getById(id: Int): WalletItem = throw NotImplementedError()
+
+ override fun pagingData(id: Int): Flow> = Pager(config = PagingConfig(
+ pageSize = 10, jumpThreshold = 10, initialLoadSize = 10
+ ), pagingSourceFactory = { WalletPagination(walletItemDao, id) }, initialKey = 1).flow
+
+ override fun getWalletItemsPaging(id: Int): PagingSource = walletItemDao.getDeals(id)
+ override suspend fun clearData() = walletItemDao.deleteAll()
+ suspend fun insert(list: List) = walletItemDao.insert(*list.toTypedArray())
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/designElem/DealItem.kt b/app/src/main/java/com/example/testapp/designElem/DealItem.kt
index ad641d7..8f521d8 100644
--- a/app/src/main/java/com/example/testapp/designElem/DealItem.kt
+++ b/app/src/main/java/com/example/testapp/designElem/DealItem.kt
@@ -32,8 +32,8 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
import androidx.compose.ui.unit.sp
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
@Composable
fun DealItem(modifier: Modifier = Modifier, deal: Deal, coins: List) {
diff --git a/app/src/main/java/com/example/testapp/designElem/ListItem.kt b/app/src/main/java/com/example/testapp/designElem/ListItem.kt
index ec8bc45..0f17aba 100644
--- a/app/src/main/java/com/example/testapp/designElem/ListItem.kt
+++ b/app/src/main/java/com/example/testapp/designElem/ListItem.kt
@@ -18,8 +18,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
@@ -27,7 +25,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
import androidx.compose.ui.unit.sp
-import com.example.testapp.room.models.Coin
+import com.example.testapp.data.room.models.Coin
@Composable
fun ListItem(modifier: Modifier = Modifier, coin : Coin, count: Float) {
diff --git a/app/src/main/java/com/example/testapp/room/dao/CoinDao.kt b/app/src/main/java/com/example/testapp/room/dao/CoinDao.kt
deleted file mode 100644
index cf5273e..0000000
--- a/app/src/main/java/com/example/testapp/room/dao/CoinDao.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.example.testapp.room.dao
-
-import androidx.room.Dao
-import androidx.room.Query
-import com.example.testapp.room.models.Coin
-import kotlinx.coroutines.flow.Flow
-
-@Dao
-interface CoinDao : IDao {
- @Query("select * from coin")
- fun getAll(): Flow>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/dao/WalletItemDao.kt b/app/src/main/java/com/example/testapp/room/dao/WalletItemDao.kt
deleted file mode 100644
index de8072d..0000000
--- a/app/src/main/java/com/example/testapp/room/dao/WalletItemDao.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.example.testapp.room.dao
-
-import androidx.room.Dao
-import androidx.room.Query
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import kotlinx.coroutines.flow.Flow
-
-@Dao
-interface WalletItemDao : IDao {
- @Query("select * from walletitem")
- fun getAll(): Flow>
-
- @Query("select * from walletitem where walletitem.userId = :id ORDER BY walletitem.coinId DESC LIMIT :limit OFFSET :offset")
- fun getAll(limit: Int, offset: Int, id: Int): List
-
- @Query("select * from walletitem where walletitem.userId = :id")
- fun getUserWallet(id: Int): Flow>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/basic/CoinRepository.kt b/app/src/main/java/com/example/testapp/room/repository/basic/CoinRepository.kt
deleted file mode 100644
index 8fa6d5d..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/basic/CoinRepository.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.example.testapp.room.repository.basic
-
-import com.example.testapp.room.models.Coin
-
-interface CoinRepository : IRepository {
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/basic/DealRepository.kt b/app/src/main/java/com/example/testapp/room/repository/basic/DealRepository.kt
deleted file mode 100644
index c579f8d..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/basic/DealRepository.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.example.testapp.room.repository.basic
-
-import androidx.paging.PagingData
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import kotlinx.coroutines.flow.Flow
-
-interface DealRepository : IRepository {
- fun getUserDeals(id: Int): Flow>
- fun completeDeal(deal: Deal, sellerId: Int, buyerId: Int): Boolean
- fun pagingData(): Flow>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/basic/IRepository.kt b/app/src/main/java/com/example/testapp/room/repository/basic/IRepository.kt
deleted file mode 100644
index 4efa420..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/basic/IRepository.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.example.testapp.room.repository.basic
-
-import kotlinx.coroutines.flow.Flow
-
-interface IRepository {
- suspend fun insert(x: T)
- suspend fun update(x: T)
- suspend fun delete(x: T)
- fun getById(id: Int): T
- fun getAll(): Flow>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/basic/UserRepository.kt b/app/src/main/java/com/example/testapp/room/repository/basic/UserRepository.kt
deleted file mode 100644
index 672f8d9..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/basic/UserRepository.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.example.testapp.room.repository.basic
-
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.User
-import com.example.testapp.room.models.WalletItem
-import kotlinx.coroutines.flow.Flow
-
-interface UserRepository : IRepository {
- fun getUserWallet(id: Int): Flow>
- fun getUserDeals(id: Int): Flow>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/basic/WalletItemRepository.kt b/app/src/main/java/com/example/testapp/room/repository/basic/WalletItemRepository.kt
deleted file mode 100644
index b595974..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/basic/WalletItemRepository.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.example.testapp.room.repository.basic
-
-import androidx.lifecycle.LiveData
-import androidx.paging.PagingData
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import kotlinx.coroutines.flow.Flow
-
-interface WalletItemRepository : IRepository {
- fun getUserWallet(id: Int): Flow>
- fun pagingData(id: Int): Flow>
- fun pagingDataTest(id: Int): LiveData>
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineCoinRepository.kt b/app/src/main/java/com/example/testapp/room/repository/offline/OfflineCoinRepository.kt
deleted file mode 100644
index 7d867be..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineCoinRepository.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.example.testapp.room.repository.offline
-
-import androidx.paging.Pager
-import androidx.paging.PagingConfig
-import androidx.paging.PagingData
-import com.example.testapp.room.dao.CoinDao
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.pagination.DealPagination
-import com.example.testapp.room.pagination.WalletPagination
-import com.example.testapp.room.repository.basic.CoinRepository
-import kotlinx.coroutines.flow.Flow
-
-class OfflineCoinRepository(
- private val coinDao: CoinDao
-) : OfflineRepository(coinDao), CoinRepository {
- override fun getAll(): Flow> = coinDao.getAll()
- override fun getById(id: Int): Coin = throw NotImplementedError()
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineDealRepository.kt b/app/src/main/java/com/example/testapp/room/repository/offline/OfflineDealRepository.kt
deleted file mode 100644
index 9896e5d..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineDealRepository.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.example.testapp.room.repository.offline
-
-import androidx.paging.Pager
-import androidx.paging.PagingConfig
-import androidx.paging.PagingData
-import com.example.testapp.room.dao.DealDao
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.pagination.DealPagination
-import com.example.testapp.room.pagination.WalletPagination
-import com.example.testapp.room.repository.basic.DealRepository
-import kotlinx.coroutines.flow.Flow
-
-class OfflineDealRepository(
- private val dealDao: DealDao
-) : OfflineRepository(dealDao), DealRepository {
- override fun getAll(): Flow> = dealDao.getAll()
- override fun getById(id: Int): Deal = dealDao.getById(id);
- override fun getUserDeals(id: Int): Flow> = dealDao.getUserDeals(id)
-
- override fun completeDeal(deal: Deal, sellerId: Int, buyerId: Int): Boolean {
- return true;
- }
-
- override fun pagingData(): Flow> = Pager(config = PagingConfig(
- pageSize = 4, jumpThreshold = 4, initialLoadSize = 4
- ), pagingSourceFactory = { DealPagination(dealDao) }, initialKey = 1).flow
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineRepository.kt b/app/src/main/java/com/example/testapp/room/repository/offline/OfflineRepository.kt
deleted file mode 100644
index f2eee79..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineRepository.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.example.testapp.room.repository.offline
-
-import com.example.testapp.room.dao.IDao
-import com.example.testapp.room.repository.basic.IRepository
-
-abstract class OfflineRepository (
- private val dao: IDao
-) : IRepository {
- override suspend fun insert(x: T) = dao.insert(x)
- override suspend fun update(x: T) = dao.update(x)
- override suspend fun delete(x: T) = dao.delete(x)
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineUserRepository.kt b/app/src/main/java/com/example/testapp/room/repository/offline/OfflineUserRepository.kt
deleted file mode 100644
index 9039da8..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineUserRepository.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.example.testapp.room.repository.offline
-
-import com.example.testapp.room.dao.UserDao
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.User
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.repository.basic.UserRepository
-import kotlinx.coroutines.flow.Flow
-
-class OfflineUserRepository(
- private val userDao: UserDao
-) : OfflineRepository(userDao), UserRepository {
- override fun getAll(): Flow> = userDao.getAll()
- override fun getById(id: Int): User = userDao.getUserById(id)
- override fun getUserWallet(id: Int): Flow> = userDao.getUserWallet(id)
- override fun getUserDeals(id: Int): Flow> = userDao.getUserDeals(id)
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineWalletItemRepository.kt b/app/src/main/java/com/example/testapp/room/repository/offline/OfflineWalletItemRepository.kt
deleted file mode 100644
index d7e2d7f..0000000
--- a/app/src/main/java/com/example/testapp/room/repository/offline/OfflineWalletItemRepository.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.example.testapp.room.repository.offline
-
-import androidx.lifecycle.LiveData
-import androidx.paging.Pager
-import androidx.paging.PagingConfig
-import androidx.paging.PagingData
-import androidx.paging.liveData
-import com.example.testapp.room.dao.WalletItemDao
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.pagination.WalletPagination
-import com.example.testapp.room.repository.basic.WalletItemRepository
-import kotlinx.coroutines.flow.Flow
-
-class OfflineWalletItemRepository(
- private val walletItemDao: WalletItemDao
-) : OfflineRepository(walletItemDao), WalletItemRepository {
- override fun getUserWallet(id: Int): Flow> = walletItemDao.getUserWallet(id)
- override fun getAll(): Flow> = walletItemDao.getAll()
- override fun getById(id: Int): WalletItem = throw NotImplementedError()
-
- override fun pagingData(id: Int): Flow> = Pager(config = PagingConfig(
- pageSize = 10, jumpThreshold = 10, initialLoadSize = 10
- ), pagingSourceFactory = { WalletPagination(walletItemDao, id) }, initialKey = 1).flow
-
- override fun pagingDataTest(id: Int): LiveData> = Pager(config = PagingConfig(
- pageSize = 1, jumpThreshold = 1, initialLoadSize = 1
- ), pagingSourceFactory = { WalletPagination(walletItemDao, id) }, initialKey = 1).liveData
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/testapp/screensMobile/CreateDeal.kt b/app/src/main/java/com/example/testapp/screensMobile/CreateDeal.kt
index 760ee27..156dbd6 100644
--- a/app/src/main/java/com/example/testapp/screensMobile/CreateDeal.kt
+++ b/app/src/main/java/com/example/testapp/screensMobile/CreateDeal.kt
@@ -43,9 +43,9 @@ import com.example.testapp.designElem.DropDown
import com.example.testapp.designElem.DropDownConfig
import com.example.testapp.designElem.SharedViewModel
import com.example.testapp.navigate.BottomBarScreen
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.WalletItem
import com.example.testapp.viewModels.AppViewModelProvider
import com.example.testapp.viewModels.CurrentUserViewModel
import com.example.testapp.viewModels.DealCreateViewModel
diff --git a/app/src/main/java/com/example/testapp/screensMobile/DealList.kt b/app/src/main/java/com/example/testapp/screensMobile/DealList.kt
index 5607c0a..c1808b9 100644
--- a/app/src/main/java/com/example/testapp/screensMobile/DealList.kt
+++ b/app/src/main/java/com/example/testapp/screensMobile/DealList.kt
@@ -45,8 +45,8 @@ import androidx.paging.LoadState
import androidx.paging.compose.collectAsLazyPagingItems
import com.example.testapp.designElem.SharedViewModel
import com.example.testapp.navigate.BottomBarScreen
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
import com.example.testapp.viewModels.AppViewModelProvider
import com.example.testapp.viewModels.CurrentUserViewModel
import com.example.testapp.viewModels.DealCreateViewModel
diff --git a/app/src/main/java/com/example/testapp/screensMobile/History.kt b/app/src/main/java/com/example/testapp/screensMobile/History.kt
index ed69962..95fb520 100644
--- a/app/src/main/java/com/example/testapp/screensMobile/History.kt
+++ b/app/src/main/java/com/example/testapp/screensMobile/History.kt
@@ -19,8 +19,6 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -36,8 +34,8 @@ import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
import com.example.testapp.viewModels.AppViewModelProvider
import com.example.testapp.viewModels.CurrentUserViewModel
import com.example.testapp.viewModels.HistoryViewModel
diff --git a/app/src/main/java/com/example/testapp/screensMobile/authScreens/RegisterScreen.kt b/app/src/main/java/com/example/testapp/screensMobile/authScreens/RegisterScreen.kt
index 99d64d7..5af48a2 100644
--- a/app/src/main/java/com/example/testapp/screensMobile/authScreens/RegisterScreen.kt
+++ b/app/src/main/java/com/example/testapp/screensMobile/authScreens/RegisterScreen.kt
@@ -38,7 +38,7 @@ import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import com.example.testapp.graphs.AuthScreen
import com.example.testapp.graphs.Graph
-import com.example.testapp.room.models.User
+import com.example.testapp.data.room.models.User
import com.example.testapp.viewModels.CurrentUserViewModel
import com.example.testapp.viewModels.RegistrationScreenViewModel
import kotlinx.coroutines.async
diff --git a/app/src/main/java/com/example/testapp/viewModels/CurrentUserViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/CurrentUserViewModel.kt
index ecddd66..e4b2a45 100644
--- a/app/src/main/java/com/example/testapp/viewModels/CurrentUserViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/CurrentUserViewModel.kt
@@ -1,16 +1,10 @@
package com.example.testapp.viewModels
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.example.testapp.room.models.User
-import com.example.testapp.room.repository.basic.UserRepository
-import kotlinx.coroutines.Dispatchers
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.repository.basic.UserRepository
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
class CurrentUserViewModel(private val userRepository: UserRepository) : ViewModel() {
diff --git a/app/src/main/java/com/example/testapp/viewModels/DealCreateViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/DealCreateViewModel.kt
index e8453e0..feb01c3 100644
--- a/app/src/main/java/com/example/testapp/viewModels/DealCreateViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/DealCreateViewModel.kt
@@ -1,24 +1,18 @@
package com.example.testapp.viewModels
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import androidx.paging.PagingData
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.repository.basic.CoinRepository
-import com.example.testapp.room.repository.basic.DealRepository
-import com.example.testapp.room.repository.basic.WalletItemRepository
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.basic.CoinRepository
+import com.example.testapp.data.room.repository.basic.DealRepository
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class DealCreateViewModel(
diff --git a/app/src/main/java/com/example/testapp/viewModels/DealListViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/DealListViewModel.kt
index ee134b2..1497b7b 100644
--- a/app/src/main/java/com/example/testapp/viewModels/DealListViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/DealListViewModel.kt
@@ -5,15 +5,14 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.PagingData
import androidx.paging.cachedIn
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.repository.basic.CoinRepository
-import com.example.testapp.room.repository.basic.DealRepository
-import com.example.testapp.room.repository.basic.WalletItemRepository
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.basic.CoinRepository
+import com.example.testapp.data.room.repository.basic.DealRepository
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import java.util.Date
diff --git a/app/src/main/java/com/example/testapp/viewModels/EntryScreenViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/EntryScreenViewModel.kt
index c80c4ed..c31e753 100644
--- a/app/src/main/java/com/example/testapp/viewModels/EntryScreenViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/EntryScreenViewModel.kt
@@ -1,12 +1,9 @@
package com.example.testapp.viewModels
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.example.testapp.room.models.User
-import com.example.testapp.room.repository.basic.UserRepository
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.repository.basic.UserRepository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
diff --git a/app/src/main/java/com/example/testapp/viewModels/HistoryViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/HistoryViewModel.kt
index c9d6fb6..0b04f36 100644
--- a/app/src/main/java/com/example/testapp/viewModels/HistoryViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/HistoryViewModel.kt
@@ -1,14 +1,11 @@
package com.example.testapp.viewModels
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.Deal
-import com.example.testapp.room.repository.basic.CoinRepository
-import com.example.testapp.room.repository.basic.DealRepository
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.Deal
+import com.example.testapp.data.room.repository.basic.CoinRepository
+import com.example.testapp.data.room.repository.basic.DealRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.first
diff --git a/app/src/main/java/com/example/testapp/viewModels/RegistrationScreenViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/RegistrationScreenViewModel.kt
index 44a7673..5a6011f 100644
--- a/app/src/main/java/com/example/testapp/viewModels/RegistrationScreenViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/RegistrationScreenViewModel.kt
@@ -4,8 +4,8 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.example.testapp.room.models.User
-import com.example.testapp.room.repository.basic.UserRepository
+import com.example.testapp.data.room.models.User
+import com.example.testapp.data.room.repository.basic.UserRepository
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
diff --git a/app/src/main/java/com/example/testapp/viewModels/WalletViewModel.kt b/app/src/main/java/com/example/testapp/viewModels/WalletViewModel.kt
index dbbd624..d51aaf9 100644
--- a/app/src/main/java/com/example/testapp/viewModels/WalletViewModel.kt
+++ b/app/src/main/java/com/example/testapp/viewModels/WalletViewModel.kt
@@ -1,24 +1,15 @@
package com.example.testapp.viewModels
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.PagingData
import androidx.paging.cachedIn
-import androidx.paging.filter
-import com.example.testapp.room.models.Coin
-import com.example.testapp.room.models.WalletItem
-import com.example.testapp.room.repository.basic.CoinRepository
-import com.example.testapp.room.repository.basic.WalletItemRepository
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.Flow
+import com.example.testapp.data.room.models.Coin
+import com.example.testapp.data.room.models.WalletItem
+import com.example.testapp.data.room.repository.basic.CoinRepository
+import com.example.testapp.data.room.repository.basic.WalletItemRepository
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch