删除 CalDAV 账号时一并清除其系统日历镜像本
问题:在 App 里删除一个 CalDAV 账号后,之前镜像进系统日历的日历本 (synccalendar.mirror.<accId>-<hash> 账户) 仍留在系统日历里,形成幽灵账户。 真机实测确认:账号 1789564608312 已删,其名下 13 个镜像账户仍在(KEEP)。 根因: - AccountsPage.confirmDeleteAccount 只清账号配置+本地库+设置,完全不碰系统日历; - 自动兜底也失效:SystemCalendarMirror.syncNow 在解析不到任何选中本时提前 return, 删完账号后正是此状态,purgeOrphans 永不执行。 修复: - SystemCalendarMirror.removeByAccount(accId):按 'mirror.<accId>-' 前缀删除该账号全部 镜像账户(兼容历史 '<accId>_' 桶名),逐个独立 try/catch + 清空日程降级; 绝不按 displayName 匹配 —— 不同账号下的同名日历本不会误删;同步清快照与选中项设置。 - AccountsPage 删除账号时先 removeByAccount(必须在改账号配置前,否则 bookId 解析不出)。 - EditAccountPage 取消勾选日历本时删除其镜像账户(用 href 算稳定 bookId)。 - SettingsPage 账号库重置时 removeAll。 - syncNow 提前 return 前加 purgeOrphanAccountMirrors 兜底,带安全阀(账号列表为空即跳过, 防读失败误删全量)。
This commit is contained in:
@@ -242,6 +242,21 @@ struct EditAccountPage {
|
||||
const pruned: number = await EventDb.pruneByHrefs(context, target.id, removedHrefs);
|
||||
LogUtil.write(`编辑账号保存:取消勾选/已失效 ${removedHrefs.length} 个日历本,清理本地日程 ${pruned} 行`);
|
||||
}
|
||||
// ⭐ 被取消勾选的日历本,其系统日历镜像账户也要一并删掉(否则取消同步后系统日历仍有幽灵账户)。
|
||||
// 此时账号配置即将被改写、listBooks 已解析不到它,故用 href 直接算稳定 bookId(与镜像侧同算法)。
|
||||
// ⚠️ 用稳定 bookId 删 —— 不同账号下有同名日历本时,bookId 里带 accId 前缀,绝不会删错。
|
||||
for (let oi: number = 0; oi < oldHrefs.length; oi++) {
|
||||
const oh: string = oldHrefs[oi];
|
||||
if (newHrefSet.has(oh)) {
|
||||
continue;
|
||||
}
|
||||
const bookId: string = SystemCalendarMirror.bookIdOf(target.id, oh, `${target.id}_${oi}`);
|
||||
try {
|
||||
await SystemCalendarMirror.removeById(context, bookId);
|
||||
} catch (err) {
|
||||
// 镜像账户删除失败不阻断保存(下次镜像前的孤儿清理还会兜底)
|
||||
}
|
||||
}
|
||||
const remapPairs: Array<[string, string]> = [];
|
||||
for (let oi: number = 0; oi < oldHrefs.length; oi++) {
|
||||
const oldNorm: string = DavClient.normalizeHref(oldHrefs[oi]);
|
||||
|
||||
Reference in New Issue
Block a user