diff --git a/examples/get_test_entities.py b/examples/get_test_entities.py index 96f206f..b61d889 100644 --- a/examples/get_test_entities.py +++ b/examples/get_test_entities.py @@ -33,6 +33,8 @@ async def main() -> None: await client.get_attachments_list('TRACKER-1') await client.get_issue_comments('TRACKER-1') await client.get_projects_list(expand='queues') + await client.get_external_applications() + await client.get_external_links("TRACKER-1") await client.stop() diff --git a/ya_tracker_client/domain/entities/external_application.py b/ya_tracker_client/domain/entities/external_application.py new file mode 100644 index 0000000..c9edee4 --- /dev/null +++ b/ya_tracker_client/domain/entities/external_application.py @@ -0,0 +1,8 @@ +from ya_tracker_client.domain.entities.base import AbstractEntity + + +class ExternalApplication(AbstractEntity): + url: str + id: str + type: str + name: str diff --git a/ya_tracker_client/domain/entities/external_link.py b/ya_tracker_client/domain/entities/external_link.py new file mode 100644 index 0000000..2f39f84 --- /dev/null +++ b/ya_tracker_client/domain/entities/external_link.py @@ -0,0 +1,20 @@ +from datetime import datetime + +from pydantic import Field + +from ya_tracker_client.domain.entities.base import AbstractEntity +from ya_tracker_client.domain.entities.external_object import ExternalObject +from ya_tracker_client.domain.entities.issue_relationship import IssueRelationshipType +from ya_tracker_client.domain.entities.user import UserShort + + +class ExternalLink(AbstractEntity): + url: str + id: int + type: IssueRelationshipType + direction: str = Field(examples=["outward", "inward"]) + object: ExternalObject + created_by: UserShort + updated_by: UserShort + created_at: datetime + updated_at: datetime diff --git a/ya_tracker_client/domain/entities/external_object.py b/ya_tracker_client/domain/entities/external_object.py new file mode 100644 index 0000000..c7d079e --- /dev/null +++ b/ya_tracker_client/domain/entities/external_object.py @@ -0,0 +1,9 @@ +from ya_tracker_client.domain.entities.base import AbstractEntity +from ya_tracker_client.domain.entities.external_application import ExternalApplication + + +class ExternalObject(AbstractEntity): + url: str + id: str + key: str + application: ExternalApplication diff --git a/ya_tracker_client/domain/repositories/external_link.py b/ya_tracker_client/domain/repositories/external_link.py index 052956f..6b75aa5 100644 --- a/ya_tracker_client/domain/repositories/external_link.py +++ b/ya_tracker_client/domain/repositories/external_link.py @@ -1,5 +1,57 @@ +from ya_tracker_client.domain.entities.external_application import ExternalApplication +from ya_tracker_client.domain.entities.external_link import ExternalLink from ya_tracker_client.domain.repositories.base import EntityRepository class ExternalLinkRepository(EntityRepository): - ... + async def get_external_applications(self) -> list[ExternalApplication]: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/get-applications + """ + raw_response = await self._client.request( + method="GET", + uri="/applications", + ) + return self._decode(raw_response, ExternalApplication, plural=True) + + async def get_external_links(self, issue_id: str) -> list[ExternalLink]: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/get-external-links + """ + raw_response = await self._client.request( + method="GET", + uri=f"/issues/{issue_id}/remotelinks", + ) + return self._decode(raw_response, ExternalLink, plural=True) + + async def add_external_link( + self, + issue_id: str, + key: str, + origin: str, + relationship: str = "RELATES", + backlink: bool | None = None, + ) -> ExternalLink: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/add-external-link + """ + raw_response = await self._client.request( + method="POST", + uri=f"/issues/{issue_id}/remotelinks", + payload={ + "key": key, + "origin": origin, + "relationship": relationship, + }, + params={"backlink": backlink} if backlink is not None else None, + ) + return self._decode(raw_response, ExternalLink) + + async def delete_external_link(self, issue_id: str, external_link_id: str | int) -> None: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/issues/delete-external-link + """ + await self._client.request( + method="DELETE", + uri=f"/issues/{issue_id}/remotelinks/{external_link_id}", + )