fix: 유령 워크스페이스 삭제 대신 이름 변경으로 보존

- cleanup_orphans: 삭제 -> _orphan_YYYYMMDD 접미사 추가
- Git/Vikunja 설정 등 모든 데이터 보존됨
- 이름 충돌 없이 같은 이름으로 새 채널 등록 가능
This commit is contained in:
2026-03-06 21:22:39 +09:00
parent b9e4a94e9a
commit 1e8e8c324f
2 changed files with 36 additions and 9 deletions

View File

@@ -128,7 +128,7 @@ async def on_ready():
orphans = ws_manager.cleanup_orphans(all_channel_ids) orphans = ws_manager.cleanup_orphans(all_channel_ids)
if orphans: if orphans:
names = ", ".join(ws.name for ws in orphans) names = ", ".join(ws.name for ws in orphans)
logger.info(f"유령 워크스페이스 {len(orphans)}정리: {names}") logger.info(f"유령 워크스페이스 {len(orphans)}보존(이름 변경): {names}")
# 등록된 워크스페이스 표시 # 등록된 워크스페이스 표시
ws_list = ws_manager.list_all() ws_list = ws_manager.list_all()

View File

@@ -160,21 +160,48 @@ class WorkspaceManager:
] ]
def cleanup_orphans(self, valid_channel_ids: set[int]) -> list[Workspace]: def cleanup_orphans(self, valid_channel_ids: set[int]) -> list[Workspace]:
"""존재하지 않는 채널의 워크스페이스 정리. """존재하지 않는 채널의 워크스페이스를 이름 변경하여 보존.
Returns: 제거된 워크스페이스 목록 (알림용) 삭제하지 않고 이름에 _orphan_날짜 접미사를 붙여 보존합니다.
기존 설정(Git, Vikunja)은 그대로 유지됩니다.
Returns: 이름 변경된 워크스페이스 목록 (알림용)
""" """
orphans = [] from datetime import datetime
renamed = []
suffix = f"_orphan_{datetime.now().strftime('%Y%m%d')}"
for ch_id, ws in list(self.workspaces.items()): for ch_id, ws in list(self.workspaces.items()):
if ch_id not in valid_channel_ids: if ch_id not in valid_channel_ids:
orphans.append(ws) old_name = ws.name
del self.workspaces[ch_id] # 이미 orphan 접미사가 있으면 스킵
logger.info(f"유령 워크스페이스 제거: {ws.name} (채널 {ch_id} 없음)") if "_orphan_" in ws.name:
continue
ws.name = f"{ws.name}{suffix}"
ws.channel_id = 0 # 채널 바인딩 해제
renamed.append(ws)
logger.info(
f"유령 워크스페이스 보존: {old_name} -> {ws.name} "
f"(채널 {ch_id} 없음, 설정 유지)"
)
if orphans: if renamed:
# 유령 항목은 channel_id=0 으로 이동
to_remove = [
ch_id for ch_id in self.workspaces
if ch_id not in valid_channel_ids and "_orphan_" not in self.workspaces[ch_id].name
]
# 이미 이름 변경됐으므로 키만 정리
for ch_id in list(self.workspaces.keys()):
if self.workspaces[ch_id].channel_id == 0 and ch_id != 0:
ws = self.workspaces.pop(ch_id)
# orphan은 이름을 키로 저장 (음수 해시)
orphan_key = -abs(hash(ws.name)) % (10**10)
self.workspaces[orphan_key] = ws
self._save() self._save()
return orphans return renamed
def set_git(self, channel_id: int, url: str, token: str, def set_git(self, channel_id: int, url: str, token: str,
repo: str = "", branch: str = "main") -> bool: repo: str = "", branch: str = "main") -> bool: