Pipeline/backend/app/services/forgejo_cleanup.py

56 lines
1.9 KiB
Python
Raw Normal View History

2026-05-20 01:22:16 -05:00
"""Explicit cleanup helpers for Forgejo connection/repository deletes."""
from __future__ import annotations
from typing import TYPE_CHECKING
from sqlmodel import select
from app.models.board_repository_links import BoardRepositoryLink
from app.models.forgejo_connections import ForgejoConnection
from app.models.forgejo_issues import ForgejoIssue
from app.models.forgejo_repositories import ForgejoRepository
if TYPE_CHECKING:
from sqlmodel.ext.asyncio.session import AsyncSession
async def delete_repository_with_dependents(
session: AsyncSession,
repository: ForgejoRepository,
) -> None:
"""Delete a tracked repository and rows that reference it."""
link_statement = select(BoardRepositoryLink).where(
BoardRepositoryLink.repository_id == repository.id,
BoardRepositoryLink.organization_id == repository.organization_id,
)
links = (await session.exec(link_statement)).all()
for link in links:
await session.delete(link)
issue_statement = select(ForgejoIssue).where(
ForgejoIssue.repository_id == repository.id,
ForgejoIssue.organization_id == repository.organization_id,
)
issues = (await session.exec(issue_statement)).all()
for issue in issues:
await session.delete(issue)
await session.delete(repository)
async def delete_connection_with_repositories(
session: AsyncSession,
connection: ForgejoConnection,
) -> None:
"""Delete a Forgejo connection and all tracked repositories under it."""
repository_statement = select(ForgejoRepository).where(
ForgejoRepository.connection_id == connection.id,
ForgejoRepository.organization_id == connection.organization_id,
)
repositories = (await session.exec(repository_statement)).all()
for repository in repositories:
await delete_repository_with_dependents(session, repository)
await session.delete(connection)