Skip to content

Commit e33883f

Browse files
committed
feat: backup closed channels & restore activities using bulk upsert
1 parent e37e7f4 commit e33883f

File tree

4 files changed

+42
-15
lines changed

4 files changed

+42
-15
lines changed

app/src/main/java/to/bitkit/models/BackupPayloads.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package to.bitkit.models
22

33
import com.synonym.bitkitcore.Activity
4+
import com.synonym.bitkitcore.ClosedChannelDetails
45
import com.synonym.bitkitcore.IBtInfo
56
import com.synonym.bitkitcore.IBtOrder
67
import com.synonym.bitkitcore.IcJitEntry
@@ -38,4 +39,5 @@ data class ActivityBackupV1(
3839
val version: Int = 1,
3940
val createdAt: Long,
4041
val activities: List<Activity>,
42+
val closedChannels: List<ClosedChannelDetails>,
4143
)

app/src/main/java/to/bitkit/repositories/ActivityRepo.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package to.bitkit.repositories
22

33
import com.synonym.bitkitcore.Activity
44
import com.synonym.bitkitcore.ActivityFilter
5+
import com.synonym.bitkitcore.ClosedChannelDetails
56
import com.synonym.bitkitcore.IcJitEntry
67
import com.synonym.bitkitcore.LightningActivity
78
import com.synonym.bitkitcore.PaymentState
@@ -29,6 +30,7 @@ import to.bitkit.ext.amountOnClose
2930
import to.bitkit.ext.matchesPaymentId
3031
import to.bitkit.ext.nowTimestamp
3132
import to.bitkit.ext.rawId
33+
import to.bitkit.models.ActivityBackupV1
3234
import to.bitkit.services.CoreService
3335
import to.bitkit.utils.AddressChecker
3436
import to.bitkit.utils.Logger
@@ -166,9 +168,6 @@ class ActivityRepo @Inject constructor(
166168
}
167169
}
168170

169-
/**
170-
* Gets activities with specified filters
171-
*/
172171
suspend fun getActivities(
173172
filter: ActivityFilter? = null,
174173
txType: PaymentType? = null,
@@ -198,9 +197,6 @@ class ActivityRepo @Inject constructor(
198197
}
199198
}
200199

201-
/**
202-
* Gets a specific activity by ID
203-
*/
204200
suspend fun getActivity(id: String): Result<Activity?> = withContext(bgDispatcher) {
205201
return@withContext runCatching {
206202
coreService.activity.getActivity(id)
@@ -209,6 +205,16 @@ class ActivityRepo @Inject constructor(
209205
}
210206
}
211207

208+
suspend fun getClosedChannels(
209+
sortDirection: SortDirection = SortDirection.ASC,
210+
): Result<List<ClosedChannelDetails>> = withContext(bgDispatcher) {
211+
runCatching {
212+
coreService.activity.closedChannels(sortDirection)
213+
}.onFailure { e ->
214+
Logger.error("Error getting closed channels (sortDirection=${SortDirection})", e, context = TAG)
215+
}
216+
}
217+
212218
/**
213219
* Updates an activity
214220
* @param forceUpdate use it if you want update a deleted activity
@@ -643,6 +649,13 @@ class ActivityRepo @Inject constructor(
643649
}
644650
}
645651

652+
suspend fun restoreFromBackup(backup: ActivityBackupV1): Result<Unit> = withContext(bgDispatcher) {
653+
return@withContext runCatching {
654+
coreService.activity.upsert(backup.activities)
655+
coreService.activity.upsert(backup.closedChannels)
656+
}
657+
}
658+
646659
// MARK: - Development/Testing Methods
647660

648661
/**

app/src/main/java/to/bitkit/repositories/BackupRepo.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,12 @@ class BackupRepo @Inject constructor(
371371

372372
BackupCategory.ACTIVITY -> {
373373
val activities = activityRepo.getActivities().getOrDefault(emptyList())
374+
val closedChannels = activityRepo.getClosedChannels().getOrDefault(emptyList())
374375

375376
val payload = ActivityBackupV1(
376377
createdAt = currentTimeMillis(),
377378
activities = activities,
379+
closedChannels = closedChannels,
378380
)
379381

380382
json.encodeToString(payload).toByteArray()
@@ -434,11 +436,16 @@ class BackupRepo @Inject constructor(
434436
performRestore(BackupCategory.ACTIVITY) { dataBytes ->
435437
val parsed = json.decodeFromString<ActivityBackupV1>(String(dataBytes))
436438

437-
parsed.activities.forEach { activity ->
438-
activityRepo.upsertActivity(activity)
439-
}
440-
441-
Logger.debug("Restored ${parsed.activities.size} activities", context = TAG)
439+
activityRepo.restoreFromBackup(parsed)
440+
.onSuccess {
441+
Logger.debug(
442+
"Restored ${parsed.activities.size} activities and " +
443+
"${parsed.closedChannels.size} closed channels",
444+
context = TAG,
445+
)
446+
}.onFailure { e ->
447+
Logger.warn("Failed to restore activities and closed channels", e, context = TAG)
448+
}
442449
}
443450

444451
Logger.info("Full restore success", context = TAG)

app/src/main/java/to/bitkit/services/CoreService.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.synonym.bitkitcore.deleteActivityById
2727
import com.synonym.bitkitcore.estimateOrderFeeFull
2828
import com.synonym.bitkitcore.getActivities
2929
import com.synonym.bitkitcore.getActivityById
30+
import com.synonym.bitkitcore.getAllClosedChannels
3031
import com.synonym.bitkitcore.getAllUniqueTags
3132
import com.synonym.bitkitcore.getCjitEntries
3233
import com.synonym.bitkitcore.getInfo
@@ -206,10 +207,8 @@ class ActivityService(
206207
}
207208
}
208209

209-
suspend fun upsert(activity: Activity) {
210-
ServiceQueue.CORE.background {
211-
upsertActivity(activity)
212-
}
210+
suspend fun upsert(activity: Activity) = ServiceQueue.CORE.background {
211+
upsertActivity(activity)
213212
}
214213

215214
suspend fun upsert(activities: List<Activity>) = ServiceQueue.CORE.background {
@@ -286,6 +285,12 @@ class ActivityService(
286285
}
287286
}
288287

288+
suspend fun closedChannels(
289+
sortDirection: SortDirection,
290+
): List<ClosedChannelDetails> = ServiceQueue.CORE.background {
291+
getAllClosedChannels(sortDirection)
292+
}
293+
289294
/**
290295
* Maps all `PaymentDetails` from LDK Node to bitkit-core [Activity] records.
291296
*

0 commit comments

Comments
 (0)