Skip to content

Commit

Permalink
feature: added integration removal endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
david-montano-metalab committed Aug 30, 2024
1 parent e6d951b commit 2ea1c5a
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 4 deletions.
18 changes: 17 additions & 1 deletion src/apps/integrations/api/integrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@
from infrastructure.database import atomic
from infrastructure.database.deps import get_session

__all__ = ["enable_integration", "disable_integration", "create_integration", "retrieve_integration"]
__all__ = [
"enable_integration",
"disable_integration",
"create_integration",
"retrieve_integration",
"delete_integration"
]


async def enable_integration(
Expand Down Expand Up @@ -55,3 +61,13 @@ async def retrieve_integration(
await CheckAccessService(session, user.id).check_integrations_retrieve_access(applet_id, type)
async with atomic(session):
return await IntegrationService(session, user).retrieve_integration(applet_id, type)

async def delete_integration(
type: str,
applet_id: uuid.UUID,
session=Depends(get_session),
user: User = Depends(get_current_user),
):
await CheckAccessService(session, user.id).check_integrations_delete_access(applet_id, type)
async with atomic(session):
return await IntegrationService(session, user).delete_integration(applet_id, type)
13 changes: 12 additions & 1 deletion src/apps/integrations/crud/integrations.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from sqlalchemy import select
import uuid

from sqlalchemy import select, update
from sqlalchemy.engine import Result
from sqlalchemy.exc import IntegrityError

Expand Down Expand Up @@ -30,3 +32,12 @@ async def retrieve(self, schema: IntegrationsSchema) -> IntegrationsSchema:
query = query.limit(1)
result: Result = await self._execute(query)
return result.scalars().first()


async def delete_by_id(self, id_: uuid.UUID):
"""Delete integrations by id."""

query = update(IntegrationsSchema)
query = query.where(IntegrationsSchema.id == id_)
query = query.values(is_deleted=True)
await self._execute(query)
14 changes: 12 additions & 2 deletions src/apps/integrations/router.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from fastapi.routing import APIRouter
from starlette import status

from apps.integrations.api import create_integration, retrieve_integration
from apps.integrations.api import create_integration, retrieve_integration, delete_integration
from apps.integrations.domain import Integration
from apps.shared.domain import Response
from apps.shared.domain.response import AUTHENTICATION_ERROR_RESPONSES, DEFAULT_OPENAPI_RESPONSE
from apps.shared.domain.response import AUTHENTICATION_ERROR_RESPONSES, DEFAULT_OPENAPI_RESPONSE, NO_CONTENT_ERROR_RESPONSES

router = APIRouter(prefix="/integrations", tags=["Integration"])

Expand All @@ -30,3 +30,13 @@
**AUTHENTICATION_ERROR_RESPONSES,
},
)(retrieve_integration)

router.delete(
"/",
description="This endpoint is used to delete integrations",
status_code=status.HTTP_204_NO_CONTENT,
responses={
**DEFAULT_OPENAPI_RESPONSE,
**AUTHENTICATION_ERROR_RESPONSES,
},
)(delete_integration)
9 changes: 9 additions & 0 deletions src/apps/integrations/service/integrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,3 +108,12 @@ async def retrieve_integration(self, applet_id, integration_type) -> Integration
)
case _:
raise UnsupportedIntegrationError(type=integration_type)

async def delete_integration(self, applet_id, integration_type) -> Integration:
elem = await IntegrationsCRUD(self.session).retrieve(
IntegrationsSchema(
applet_id=applet_id,
type=integration_type,
)
)
await IntegrationsCRUD(self.session).delete_by_id(elem.id)
4 changes: 4 additions & 0 deletions src/apps/workspaces/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ class IntegrationsRetrieveAccessDenied(ValidationError):
message = _("Access denied to retrieve integrations of type `{type}` on applet `{applet_id}`")


class IntegrationsDeleteAccessDenied(ValidationError):
message = _("Access denied to delete integration of type `{type}` on applet `{applet_id}`")


class WorkspaceNotFoundError(Exception):
...

Expand Down
8 changes: 8 additions & 0 deletions src/apps/workspaces/service/check_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
AppletInviteAccessDenied,
AppletSetScheduleAccessDenied,
IntegrationsCreateAccessDenied,
IntegrationsDeleteAccessDenied,
IntegrationsRetrieveAccessDenied,
PublishConcealAccessDenied,
TransferOwnershipAccessDenied,
Expand Down Expand Up @@ -264,3 +265,10 @@ async def check_integrations_retrieve_access(self, applet_id: uuid.UUID, type: s
)
if not access:
raise IntegrationsRetrieveAccessDenied(type=type, applet_id=applet_id)

async def check_integrations_delete_access(self, applet_id: uuid.UUID, type: str):
access = await UserAppletAccessCRUD(self.session).get_by_roles(
self.user_id, applet_id, [Role.MANAGER, Role.OWNER]
)
if not access:
raise IntegrationsDeleteAccessDenied(type=type, applet_id=applet_id)

0 comments on commit 2ea1c5a

Please sign in to comment.