mirror of
https://github.com/MODSetter/SurfSense.git
synced 2025-09-02 18:49:09 +00:00
feat: add a starter implementation of JIRA connector module
This commit is contained in:
parent
505a005bac
commit
f488c106fa
2 changed files with 92 additions and 2 deletions
|
@ -67,7 +67,7 @@ repos:
|
||||||
hooks:
|
hooks:
|
||||||
- id: mypy
|
- id: mypy
|
||||||
files: ^surfsense_backend/
|
files: ^surfsense_backend/
|
||||||
additional_dependencies: []
|
additional_dependencies: ['types-requests']
|
||||||
args: [--ignore-missing-imports, --disallow-untyped-defs]
|
args: [--ignore-missing-imports, --disallow-untyped-defs]
|
||||||
|
|
||||||
- repo: https://github.com/PyCQA/bandit
|
- repo: https://github.com/PyCQA/bandit
|
||||||
|
@ -75,7 +75,7 @@ repos:
|
||||||
hooks:
|
hooks:
|
||||||
- id: bandit
|
- id: bandit
|
||||||
files: ^surfsense_backend/
|
files: ^surfsense_backend/
|
||||||
args: ['-r', '.', '-f', 'json']
|
args: ['-r', '-f', 'json']
|
||||||
exclude: ^surfsense_backend/(tests/|alembic/)
|
exclude: ^surfsense_backend/(tests/|alembic/)
|
||||||
|
|
||||||
# Frontend/Extension Hooks (TypeScript/JavaScript)
|
# Frontend/Extension Hooks (TypeScript/JavaScript)
|
||||||
|
|
90
surfsense_backend/app/connectors/jira_connector.py
Normal file
90
surfsense_backend/app/connectors/jira_connector.py
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
"""
|
||||||
|
Jira Connector Module
|
||||||
|
|
||||||
|
A module for retrieving data from Jira.
|
||||||
|
Allows fetching issue lists and their comments, projects and more.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import Any, Dict, Optional
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
class JiraConnector:
|
||||||
|
"""Class for retrieving data from Jira."""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
base_url: Optional[str] = None,
|
||||||
|
personal_access_token: Optional[str] = None,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Initialize the JiraConnector class.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
base_url: Jira instance base URL (e.g., 'https://yourcompany.atlassian.net') (optional)
|
||||||
|
personal_access_token: Jira personal access token (optional)
|
||||||
|
"""
|
||||||
|
self.base_url = base_url
|
||||||
|
self.personal_access_token = personal_access_token
|
||||||
|
self.api_version = "3" # Jira Cloud API version
|
||||||
|
|
||||||
|
def set_personal_access_token(self, personal_access_token: str) -> None:
|
||||||
|
"""
|
||||||
|
Set the Jira personal access token.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
personal_access_token: Jira personal access token
|
||||||
|
"""
|
||||||
|
self.personal_access_token = personal_access_token
|
||||||
|
|
||||||
|
def get_headers(self) -> Dict[str, str]:
|
||||||
|
"""
|
||||||
|
Get headers for Jira API requests.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionary of headers
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: If personal_access_token or base_url have not been set
|
||||||
|
"""
|
||||||
|
if not all([self.base_url, self.personal_access_token]):
|
||||||
|
raise ValueError("Jira personal access token or base URL not initialized.")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": f"Bearer {self.personal_access_token}",
|
||||||
|
"Accept": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
def make_api_request(
|
||||||
|
self, endpoint: str, params: Optional[Dict[str, Any]] = None
|
||||||
|
) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Make a request to the Jira API.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
endpoint: API endpoint (without base URL)
|
||||||
|
params: Query parameters for the request (optional)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Response data from the API
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: If personal_access_token or base_url have not been set
|
||||||
|
Exception: If the API request fails
|
||||||
|
"""
|
||||||
|
if not all([self.base_url, self.personal_access_token]):
|
||||||
|
raise ValueError("Jira personal access token or base URL not initialized.")
|
||||||
|
|
||||||
|
url = f"{self.base_url}/rest/api/{self.api_version}/{endpoint}"
|
||||||
|
headers = self.get_headers()
|
||||||
|
|
||||||
|
response = requests.get(url, headers=headers, params=params, timeout=500)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
return response.json()
|
||||||
|
else:
|
||||||
|
raise Exception(
|
||||||
|
f"API request failed with status code {response.status_code}: {response.text}"
|
||||||
|
)
|
Loading…
Add table
Reference in a new issue