2026-09-09 21:55:37 +08:00
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
|
|
|
|
|
|
from app.core.contracts import RequestContext
|
2026-09-10 15:55:54 +08:00
|
|
|
from app.core.errors import InvalidStateError
|
2026-09-09 21:55:37 +08:00
|
|
|
from app.service.authorization_service import AuthorizationService
|
|
|
|
|
from app.service.config_release_service import ConfigReleaseError, ConfigReleaseService
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConfigApplicationService:
|
|
|
|
|
def __init__(self, session: AsyncSession) -> None:
|
|
|
|
|
self.session = session
|
|
|
|
|
|
|
|
|
|
async def transition(
|
|
|
|
|
self, release_id: int, action: str, context: RequestContext
|
|
|
|
|
) -> dict[str, object]:
|
|
|
|
|
permission = {"submit_for_review": "config:write", "approve": "config:review",
|
|
|
|
|
"activate": "config:activate", "rollback": "config:activate"}[action]
|
|
|
|
|
await AuthorizationService.require(context, permission, admin=True)
|
|
|
|
|
service = ConfigReleaseService(self.session)
|
|
|
|
|
try:
|
|
|
|
|
async with self.session.begin():
|
|
|
|
|
release = await getattr(service, action)(release_id, int(context.user_id))
|
|
|
|
|
except ConfigReleaseError as exc:
|
2026-09-10 15:55:54 +08:00
|
|
|
raise InvalidStateError(str(exc)) from exc
|
2026-09-09 21:55:37 +08:00
|
|
|
return {"data": {"release_id": str(release.id), "release_no": release.release_no,
|
|
|
|
|
"status": release.status}}
|