Skip to content

Commit 51bdb83

Browse files
authored
fix(subs): drop configs for removed group keys on update (#1290)
1 parent 159d4ba commit 51bdb83

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

app/src/main/kotlin/li/songe/gkd/util/SubsState.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,19 @@ fun updateSubscription(subscription: RawSubscription) {
126126
val subsId = subscription.id
127127
val subsName = subscription.name
128128
val newMap = subsMapFlow.value.toMutableMap()
129+
val nextSubsRaw: RawSubscription
129130
if (subsId < 0 && newMap[subsId]?.version == subscription.version) {
130-
newMap[subsId] = subscription.run {
131+
nextSubsRaw = subscription.run {
131132
copy(
132133
version = version + 1,
133134
apps = apps.filterIfNotAll { it.groups.isNotEmpty() }
134135
.distinctByIfAny { it.id },
135136
)
136137
}
137138
} else {
138-
newMap[subsId] = subscription
139+
nextSubsRaw = subscription
139140
}
141+
newMap[subsId] = nextSubsRaw
140142
subsMapFlow.value = newMap
141143
if (subsLoadErrorsFlow.value.contains(subsId)) {
142144
subsLoadErrorsFlow.update {
@@ -146,9 +148,10 @@ fun updateSubscription(subscription: RawSubscription) {
146148
}
147149
}
148150
withContext(Dispatchers.IO) {
151+
cleanupSubsConfig(subsId, nextSubsRaw)
149152
DbSet.subsItemDao.updateMtime(subsId, System.currentTimeMillis())
150153
subsFolder.resolve("${subsId}.json")
151-
.writeText(json.encodeToString(newMap[subsId]))
154+
.writeText(json.encodeToString(nextSubsRaw))
152155
}
153156
LogUtils.d("更新订阅文件:id=${subsId},name=${subsName}")
154157
}
@@ -433,6 +436,29 @@ fun initSubsState() {
433436
}
434437
}
435438

439+
private suspend fun cleanupSubsConfig(subsId: Long, subsRaw: RawSubscription): Int {
440+
val globalGroupKeys = subsRaw.globalGroups.map { it.key }.toHashSet()
441+
val appIdToGroupKeys = subsRaw.apps.associate { a ->
442+
a.id to a.groups.map { g -> g.key }.toHashSet()
443+
}
444+
val configs = DbSet.subsConfigDao.querySubsItemConfig(listOf(subsId))
445+
val deleteList = configs.filter { c ->
446+
when (c.type) {
447+
SubsConfig.AppGroupType -> {
448+
val groupKeys = appIdToGroupKeys[c.appId]
449+
groupKeys == null || !groupKeys.contains(c.groupKey)
450+
}
451+
452+
SubsConfig.GlobalGroupType -> !globalGroupKeys.contains(c.groupKey)
453+
else -> false
454+
}
455+
}
456+
if (deleteList.isEmpty()) return 0
457+
DbSet.subsConfigDao.delete(*deleteList.toTypedArray())
458+
LogUtils.d("清理已移除规则配置", "subsId=$subsId, delete=${deleteList.size}")
459+
return deleteList.size
460+
}
461+
436462
val updateSubsMutex = MutexState()
437463

438464
private suspend fun updateSubs(subsEntry: SubsEntry): RawSubscription? {

0 commit comments

Comments
 (0)