oncall-engine/engine/apps/grafana_plugin/ui_url_builder.py
Matias Bordese 2a87bea6ed
feat: add filter affected services internal endpoint (#5415)
Related to https://github.com/grafana/oncall-private/issues/2977

e.g.

`GET
/api/plugins/grafana-oncall-app/resources/alertgroups/filter_affected_services?service=service-a&service=service-b`

```
[
  {"name": "service-a",
   "service_url": "http://localhost:3000/a/grafana-slo-app/service/service-a",
   "alert_groups_url": "http://localhost:3000/a/grafana-oncall-app/alert-groups?status=0&status=1&started_at=now-7d_now&label=service_name:service-a"}
]
```
2025-01-16 12:19:32 +00:00

61 lines
2.4 KiB
Python

import typing
from urllib.parse import urljoin
from common.constants.plugin_ids import PluginID
if typing.TYPE_CHECKING:
from apps.user_management.models import Organization
class UIURLBuilder:
"""
If `base_url` is passed into the constructor, it will override using `organization.grafana_url`
"""
def __init__(self, organization: "Organization", base_url: typing.Optional[str] = None) -> None:
self.base_url = base_url if base_url else organization.grafana_url
self.is_grafana_irm_enabled = organization.is_grafana_irm_enabled
def _build_url(self, page: str, path_extra: str = "", plugin_id: typing.Optional[str] = None) -> str:
"""
Constructs an absolute URL to a Grafana plugin page.
"""
if not plugin_id:
plugin_id = PluginID.IRM if self.is_grafana_irm_enabled else PluginID.ONCALL
return urljoin(self.base_url, f"a/{plugin_id}/{page}{path_extra}")
def home(self, path_extra: str = "") -> str:
return self._build_url("", path_extra)
def alert_groups(self, path_extra: str = "") -> str:
return self._build_url("alert-groups", path_extra)
def alert_group_detail(self, id: str, path_extra: str = "") -> str:
return self._build_url(f"alert-groups/{id}", path_extra)
def integration_detail(self, id: str, path_extra: str = "") -> str:
return self._build_url(f"integrations/{id}", path_extra)
def schedules(self, path_extra: str = "") -> str:
return self._build_url("schedules", path_extra)
def schedule_detail(self, id: str, path_extra: str = "") -> str:
return self._build_url(f"schedules/{id}", path_extra)
def users(self, path_extra: str = "") -> str:
return self._build_url("users", path_extra)
def user_profile(self, path_extra: str = "") -> str:
return self._build_url("users/me", path_extra)
def chatops(self, path_extra: str = "") -> str:
return self._build_url("chat-ops", path_extra)
def settings(self, path_extra: str = "") -> str:
return self._build_url("settings", path_extra)
def declare_incident(self, path_extra: str = "") -> str:
return self._build_url("incidents/declare", path_extra, plugin_id=PluginID.INCIDENT)
def service_page(self, service_name: str, path_extra: str = "") -> str:
return self._build_url(f"service/{service_name}", path_extra, plugin_id=PluginID.SLO)