56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
|
|
"""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)
|