fix linear connector methods to return status dicts

This commit is contained in:
CREDO23 2026-02-18 19:13:14 +02:00
parent f0e1f3419e
commit 5bb619227e
3 changed files with 132 additions and 82 deletions

View file

@ -197,7 +197,7 @@ def create_create_linear_issue_tool(
linear_client = LinearConnector( linear_client = LinearConnector(
session=db_session, connector_id=actual_connector_id session=db_session, connector_id=actual_connector_id
) )
issue = await linear_client.create_issue( result = await linear_client.create_issue(
team_id=final_team_id, team_id=final_team_id,
title=final_title, title=final_title,
description=final_description, description=final_description,
@ -207,15 +207,19 @@ def create_create_linear_issue_tool(
label_ids=final_label_ids if final_label_ids else None, label_ids=final_label_ids if final_label_ids else None,
) )
if result.get("status") == "error":
logger.error(f"Failed to create Linear issue: {result.get('message')}")
return {"status": "error", "message": result.get("message")}
logger.info( logger.info(
f"Linear issue created: {issue.get('identifier')} - {issue.get('title')}" f"Linear issue created: {result.get('identifier')} - {result.get('title')}"
) )
return { return {
"status": "success", "status": "success",
"issue_id": issue.get("id"), "issue_id": result.get("id"),
"identifier": issue.get("identifier"), "identifier": result.get("identifier"),
"url": issue.get("url"), "url": result.get("url"),
"message": f"Issue {issue.get('identifier')} created successfully.", "message": result.get("message"),
} }
except Exception as e: except Exception as e:

View file

@ -234,6 +234,16 @@ def create_update_linear_issue_tool(
if final_new_label_ids is not None if final_new_label_ids is not None
else None, else None,
) )
if updated_issue.get("status") == "error":
logger.error(
f"Failed to update Linear issue: {updated_issue.get('message')}"
)
return {
"status": "error",
"message": updated_issue.get("message"),
}
logger.info( logger.info(
f"update_issue result: {updated_issue.get('identifier')} - {updated_issue.get('title')}" f"update_issue result: {updated_issue.get('identifier')} - {updated_issue.get('title')}"
) )
@ -262,11 +272,13 @@ def create_update_linear_issue_tool(
else: else:
kb_message = "" kb_message = ""
identifier = updated_issue.get("identifier")
default_msg = f"Issue {identifier} updated successfully."
return { return {
"status": "success", "status": "success",
"identifier": updated_issue.get("identifier"), "identifier": identifier,
"url": updated_issue.get("url"), "url": updated_issue.get("url"),
"message": f"Issue {updated_issue.get('identifier')} updated successfully.{kb_message}", "message": f"{updated_issue.get('message', default_msg)}{kb_message}",
} }
except Exception as e: except Exception as e:

View file

@ -598,35 +598,49 @@ class LinearConnector:
priority: int | None = None, priority: int | None = None,
label_ids: list[str] | None = None, label_ids: list[str] | None = None,
) -> dict[str, Any]: ) -> dict[str, Any]:
mutation = """ try:
mutation IssueCreate($input: IssueCreateInput!) { mutation = """
issueCreate(input: $input) { mutation IssueCreate($input: IssueCreateInput!) {
success issueCreate(input: $input) {
issue { id identifier title url } success
issue { id identifier title url }
}
} }
} """
""" input_data: dict[str, Any] = {"teamId": team_id, "title": title}
input_data: dict[str, Any] = {"teamId": team_id, "title": title} if description is not None:
if description is not None: input_data["description"] = description
input_data["description"] = description if state_id is not None:
if state_id is not None: input_data["stateId"] = state_id
input_data["stateId"] = state_id if assignee_id is not None:
if assignee_id is not None: input_data["assigneeId"] = assignee_id
input_data["assigneeId"] = assignee_id if priority is not None:
if priority is not None: input_data["priority"] = priority
input_data["priority"] = priority if label_ids:
if label_ids: input_data["labelIds"] = label_ids
input_data["labelIds"] = label_ids
result = await self.execute_graphql_query(mutation, {"input": input_data}) result = await self.execute_graphql_query(mutation, {"input": input_data})
payload = result.get("data", {}).get("issueCreate", {}) payload = result.get("data", {}).get("issueCreate", {})
if not payload.get("success"): if not payload.get("success"):
errors = result.get("errors", []) errors = result.get("errors", [])
msg = ( msg = (
errors[0].get("message", "Unknown error") if errors else "Unknown error" errors[0].get("message", "Unknown error")
) if errors
raise Exception(f"issueCreate failed: {msg}") else "Unknown error"
return payload.get("issue", {}) )
return {"status": "error", "message": f"issueCreate failed: {msg}"}
issue = payload.get("issue", {})
return {
"status": "success",
"id": issue.get("id"),
"identifier": issue.get("identifier"),
"title": issue.get("title"),
"url": issue.get("url"),
"message": f"Issue {issue.get('identifier')} created successfully.",
}
except Exception as e:
logger.error(f"Error creating Linear issue: {e}")
return {"status": "error", "message": str(e)}
async def update_issue( async def update_issue(
self, self,
@ -638,57 +652,77 @@ class LinearConnector:
priority: int | None = None, priority: int | None = None,
label_ids: list[str] | None = None, label_ids: list[str] | None = None,
) -> dict[str, Any]: ) -> dict[str, Any]:
mutation = """ try:
mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) { mutation = """
issueUpdate(id: $id, input: $input) { mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) {
success issueUpdate(id: $id, input: $input) {
issue { id identifier title url } success
issue { id identifier title url }
}
} }
} """
""" input_data: dict[str, Any] = {}
input_data: dict[str, Any] = {} if title is not None:
if title is not None: input_data["title"] = title
input_data["title"] = title if description is not None:
if description is not None: input_data["description"] = description
input_data["description"] = description if state_id is not None:
if state_id is not None: input_data["stateId"] = state_id
input_data["stateId"] = state_id if assignee_id is not None:
if assignee_id is not None: input_data["assigneeId"] = assignee_id
input_data["assigneeId"] = assignee_id if priority is not None:
if priority is not None: input_data["priority"] = priority
input_data["priority"] = priority if label_ids is not None:
if label_ids is not None: input_data["labelIds"] = label_ids
input_data["labelIds"] = label_ids
result = await self.execute_graphql_query( result = await self.execute_graphql_query(
mutation, {"id": issue_id, "input": input_data} mutation, {"id": issue_id, "input": input_data}
)
payload = result.get("data", {}).get("issueUpdate", {})
if not payload.get("success"):
errors = result.get("errors", [])
msg = (
errors[0].get("message", "Unknown error") if errors else "Unknown error"
) )
raise Exception(f"issueUpdate failed: {msg}") payload = result.get("data", {}).get("issueUpdate", {})
return payload.get("issue", {}) if not payload.get("success"):
errors = result.get("errors", [])
async def archive_issue(self, issue_id: str) -> bool: msg = (
mutation = """ errors[0].get("message", "Unknown error")
mutation IssueArchive($id: String!) { if errors
issueArchive(id: $id) { else "Unknown error"
success )
return {"status": "error", "message": f"issueUpdate failed: {msg}"}
issue = payload.get("issue", {})
return {
"status": "success",
"id": issue.get("id"),
"identifier": issue.get("identifier"),
"title": issue.get("title"),
"url": issue.get("url"),
"message": f"Issue {issue.get('identifier')} updated successfully.",
} }
} except Exception as e:
""" logger.error(f"Error updating Linear issue: {e}")
result = await self.execute_graphql_query(mutation, {"id": issue_id}) return {"status": "error", "message": str(e)}
payload = result.get("data", {}).get("issueArchive", {})
if not payload.get("success"): async def archive_issue(self, issue_id: str) -> dict[str, Any]:
errors = result.get("errors", []) try:
msg = ( mutation = """
errors[0].get("message", "Unknown error") if errors else "Unknown error" mutation IssueArchive($id: String!) {
) issueArchive(id: $id) {
raise Exception(f"issueArchive failed: {msg}") success
return True }
}
"""
result = await self.execute_graphql_query(mutation, {"id": issue_id})
payload = result.get("data", {}).get("issueArchive", {})
if not payload.get("success"):
errors = result.get("errors", [])
msg = (
errors[0].get("message", "Unknown error")
if errors
else "Unknown error"
)
return {"status": "error", "message": f"issueArchive failed: {msg}"}
return {"status": "success", "message": "Issue archived successfully."}
except Exception as e:
logger.error(f"Error archiving Linear issue: {e}")
return {"status": "error", "message": str(e)}
def format_issue_to_markdown(self, issue: dict[str, Any]) -> str: def format_issue_to_markdown(self, issue: dict[str, Any]) -> str:
""" """