2025-11-04 20:30:22 +03:00
|
|
|
/*
|
|
|
|
|
* Created by sweetbread
|
|
|
|
|
* Copyright (c) 2025. All rights reserved.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package ru.risdeveau.pixeldragon.repo
|
|
|
|
|
|
2025-11-05 01:23:35 +03:00
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.launch
|
2025-11-04 23:24:20 +03:00
|
|
|
import ru.risdeveau.pixeldragon.api.getJoinedRooms
|
2025-11-04 20:30:22 +03:00
|
|
|
import ru.risdeveau.pixeldragon.api.getRoom
|
|
|
|
|
import ru.risdeveau.pixeldragon.db.cacheDb
|
2025-11-05 00:06:04 +03:00
|
|
|
import ru.risdeveau.pixeldragon.db.isConnected
|
2025-11-04 20:30:22 +03:00
|
|
|
import ru.risdeveau.pixeldragon.db.isExpired
|
|
|
|
|
import ru.risdeveau.pixeldragon.db.toDomain
|
|
|
|
|
import ru.risdeveau.pixeldragon.db.toEntity
|
|
|
|
|
|
|
|
|
|
class Room (
|
|
|
|
|
val id: String,
|
|
|
|
|
val name: String?,
|
|
|
|
|
val type: String,
|
|
|
|
|
val creatorId: String?,
|
|
|
|
|
val createTime: Long?,
|
|
|
|
|
val avatarUrl: String?,
|
|
|
|
|
val members: Int?,
|
|
|
|
|
val joined: Boolean,
|
|
|
|
|
val direct: User?,
|
|
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
companion object {
|
|
|
|
|
suspend fun getById(id: String, cached: Boolean = true): Room {
|
|
|
|
|
val cachedRoom = cacheDb.roomDoa().getById(id)
|
2025-11-05 00:06:04 +03:00
|
|
|
if (!isConnected() and
|
|
|
|
|
(!cached or (cachedRoom == null) or (cachedRoom?.isExpired() == true))
|
|
|
|
|
) {
|
2025-11-04 20:30:22 +03:00
|
|
|
val room = getRoom(id)
|
2025-11-05 01:23:35 +03:00
|
|
|
CoroutineScope(Dispatchers.IO).launch {
|
|
|
|
|
val cacheRoom = room.toEntity()
|
|
|
|
|
cacheDb.roomDoa().insert(cacheRoom)
|
|
|
|
|
}
|
2025-11-04 20:30:22 +03:00
|
|
|
return room
|
|
|
|
|
}
|
|
|
|
|
return cachedRoom!!.toDomain()
|
|
|
|
|
}
|
2025-11-04 23:24:20 +03:00
|
|
|
|
|
|
|
|
suspend fun getJoined(cached: Boolean = true): List<Room> {
|
|
|
|
|
val cacheJoined = cacheDb.roomDoa().getAllJoined()
|
2025-11-05 01:23:35 +03:00
|
|
|
if (isConnected() and
|
|
|
|
|
(!cached or cacheJoined.isEmpty() or (cacheJoined.any { it.isExpired() }))
|
|
|
|
|
) {
|
|
|
|
|
val rooms = getJoinedRooms()
|
|
|
|
|
CoroutineScope(Dispatchers.IO).launch {
|
|
|
|
|
val roomsDb = List(rooms.size) { i -> rooms[i].toEntity() }
|
|
|
|
|
cacheDb.roomDoa().insert(*roomsDb.toTypedArray())
|
|
|
|
|
}
|
|
|
|
|
return rooms
|
2025-11-04 23:24:20 +03:00
|
|
|
}
|
|
|
|
|
return List(cacheJoined.size) { i -> cacheJoined[i].toDomain() }
|
|
|
|
|
}
|
2025-11-04 20:30:22 +03:00
|
|
|
}
|
|
|
|
|
}
|