copied from internal repo

This commit is contained in:
Dragroth
2026-01-22 12:37:26 +01:00
parent a475364582
commit 7451b63f62
118 changed files with 17182 additions and 0 deletions

0
api/__init__.py Normal file
View File

78
api/base_api.py Normal file
View File

@@ -0,0 +1,78 @@
import os
import time
import requests
class BaseAPI:
CONNECTION_TEST_INTERVAL = 10
CONNECTION_TEST_ATTEMPTS = 10
def __init__(self, app_domain, **kwargs):
self.app_domain = app_domain
self.token = None
self.api_tenant_login_url = f"https://tenant-login-api.{self.app_domain}"
self.url = None
self.params = {**kwargs}
def __get_connection_test_url(self):
return f"{self.url}/check_connection"
def wait_for_start(self, url=None):
i = 0
if not url:
url = self.__get_connection_test_url()
for i in range(self.CONNECTION_TEST_ATTEMPTS):
try:
self._get(url)
except Exception:
time.sleep(self.CONNECTION_TEST_INTERVAL)
continue
break
if i == self.CONNECTION_TEST_ATTEMPTS - 1:
raise Exception(f"Connection to {url} failed.")
def _headers(self, content_type='application/json'):
headers = {'Content-Type': content_type}
if self.token:
headers['Authorization'] = self.token
return headers
def _get(self, endpoint):
try:
response = requests.get(endpoint, headers=self._headers())
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
raise requests.exceptions.HTTPError(e.response.text)
def _post(self, endpoint, payload):
try:
response = requests.post(endpoint, json=payload, headers=self._headers())
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
raise requests.exceptions.HTTPError(e.response.text)
def _put(self, endpoint, payload):
try:
response = requests.put(endpoint, json=payload, headers=self._headers())
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
raise requests.exceptions.HTTPError(e.response.text)
def _delete(self, endpoint):
response = requests.delete(endpoint, headers=self._headers())
response.raise_for_status()
return response.status_code
def _upload_file(self, endpoint, file_path, params=None):
try:
with open(file_path, 'rb') as file:
files = {'file': (os.path.basename(file_path), file, 'application/octet-stream')}
response = requests.post(endpoint, files=files, data=params, headers=self._headers(content_type=None))
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
raise requests.exceptions.HTTPError(e.response.text)

115
api/operator_api.py Normal file
View File

@@ -0,0 +1,115 @@
import base64
import hashlib
import json
from .base_api import BaseAPI
class OperatorAPI(BaseAPI):
def login(self, operator_user, operator_password):
endpoint = f"{self.api_tenant_login_url}/operator/login"
nonce = self._post(endpoint, {
"login": operator_user
}).get('nonce')
# get token
salted_password = str(hashlib.sha256(hashlib.sha256(operator_password.encode()).hexdigest().encode() + nonce.encode()).hexdigest())
self.token = self._post(endpoint, {
"login": operator_user,
"password": salted_password
}).get('token')
aa = base64.b64decode(self.token.split(".")[1] + "===")
decoded_token = json.loads(aa.decode("utf-8"))
self.url = decoded_token["url"]["api"]
def login_as_user(self, tenant_id, tenant_user_id):
endpoint = f"{self.api_tenant_login_url}/operator/tenant/{tenant_id}/user/{tenant_user_id}/login"
return self._get(endpoint)
def create_user(self, tenant_id, params):
endpoint = f"{self.url}/tenant/{tenant_id}/user"
return self._post(endpoint, params).get('data')
def get_user(self, tenant_id, tenant_user_id):
endpoint = f"{self.url}/tenant/{tenant_id}/user/{tenant_user_id}"
return self._get(endpoint).get('data')
def get_users(self, tenant_id):
endpoint = f"{self.url}/tenant/{tenant_id}/user"
return self._get(endpoint).get('data')
def get_license_packages(self, tenant_id):
endpoint = f"{self.url}/tenant/{tenant_id}/operator_license_package"
return self._get(endpoint).get('data')
def get_package_agreements(self, tenant_id):
endpoint = f"{self.url}/tenant/{tenant_id}/tenant_package_agreement"
return self._get(endpoint).get('data')
def create_package_activation_request(self, tenant_id, params):
endpoint = f"{self.url}/tenant/{tenant_id}/package_activation_request"
return self._post(endpoint, params).get('data')
def create_tenant(self, params):
endpoint = f"{self.url}/tenant"
return self._post(endpoint, params).get('data')[0]
def get_tenants(self):
endpoint = f"{self.url}/tenant"
return self._get(endpoint).get('data')
def get_ddi(self, tenant_id):
endpoint = f"{self.url}/tenant/{tenant_id}/ddi"
return self._get(endpoint).get('data')
def create_ddi(self, tenant_id, params):
endpoint = f"{self.url}/tenant/{tenant_id}/ddi"
return self._post(endpoint, params).get('data')[0]
def get_tenant_telco_networks(self, tenant_id):
endpoint = f"{self.url}/tenant/{tenant_id}/telco_network"
return self._get(endpoint).get('data')
def create_tenant_telco_network(self, tenant_id, params):
endpoint = f"{self.url}/tenant/{tenant_id}/telco_network"
return self._post(endpoint, params).get('data')
def get_operator_routing(self):
endpoint = f"{self.url}/operator_routing"
return self._get(endpoint).get('data')
def create_operator_routing(self, params):
endpoint = f"{self.url}/operator_routing"
return self._post(endpoint, params).get('data')
def create_operator_gateway(self, params):
endpoint = f"{self.url}/operator_gateway"
return self._post(endpoint, params).get('data')
def get_operator_gateways(self):
endpoint = f"{self.url}/operator_gateway"
return self._get(endpoint).get('data')
def create_operator_gateway_normalization(self, operator_gateway_id, params):
endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization"
return self._post(endpoint, params).get('data')
def get_operator_gateway_normalization(self, operator_gateway_id):
endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization"
return self._get(endpoint).get('data')
def delete_operator_gateway_normalization(self, operator_gateway_id, normalization_id):
endpoint = f"{self.url}/operator_gateway/{operator_gateway_id}/normalization/{normalization_id}"
return self._delete(endpoint)
def get_speech_integrations(self):
endpoint = f"{self.url}/text_to_speech/integration"
return self._get(endpoint).get('data')
def add_speech_integration(self, params):
endpoint = f"{self.url}/tenant/speech/integration"
return self._post(endpoint, params).get('data')

148
api/tenant_api.py Normal file
View File

@@ -0,0 +1,148 @@
from .base_api import BaseAPI
class TenantAPI(BaseAPI):
def initialize_user_login(self, params):
self.token = params.get('token')
self.url = params.get('urls').get('api')
self.file_server_url = params.get('urls').get('fileserver')
# USER
def update_feature_tenant_user_call(self, tenant_user_id, params):
endpoint = f"{self.url}/user/{tenant_user_id}/feature/call"
return self._put(endpoint, params).get('data')
def update_feature_tenant_user_consultant(self, tenant_user_id, params):
endpoint = f"{self.url}/user/{tenant_user_id}/feature/consultant"
return self._put(endpoint, params).get('data')
def update_feature_tenant_user_recording(self, tenant_user_id, params):
endpoint = f"{self.url}/user/{tenant_user_id}/feature/recording"
return self._put(endpoint, params).get('data')
def update_feature_tenant_user_hotdesk(self, tenant_user_id, params):
endpoint = f"{self.url}/user/{tenant_user_id}/feature/hotdesk"
return self._put(endpoint, params).get('data')
def create_web_link(self, params):
endpoint = f"{self.url}/weblink"
return self._post(endpoint, params).get('data')
# PROJECT
def create_project(self, params):
endpoint = f"{self.url}/project"
return self._post(endpoint, params).get('data')
def get_projects(self):
endpoint = f"{self.url}/project"
return self._get(endpoint).get('data')
def update_project(self, project_id, params):
endpoint = f"{self.url}/project/{project_id}"
return self._put(endpoint, params).get('data')
def add_user_to_project(self, project_id, params):
endpoint = f"{self.url}/project/{project_id}/user"
return self._post(endpoint, params).get('data')
def update_feature_project_recording(self, project_id, params):
endpoint = f"{self.url}/project/{project_id}/feature/recording"
return self._put(endpoint, params).get('data')
def update_feature_project_aaa(self, project_id, params):
endpoint = f"{self.url}/project/{project_id}/feature/aaa"
return self._put(endpoint, params).get('data')
def add_target_to_project(self, project_id, params):
endpoint = f"{self.url}/project/{project_id}/target"
return self._post(endpoint, params).get('data')
def add_target_to_user(self, tenant_user_id, params):
endpoint = f"{self.url}/user/{tenant_user_id}/target"
return self._post(endpoint, params).get('data')
# FILES
def get_announcements(self):
endpoint = f"{self.file_server_url}/announcement"
return self._get(endpoint).get('data')
def add_announcement(self, file_path, params):
endpoint = f"{self.file_server_url}/announcement"
return self._upload_file(endpoint, file_path, params=params).get('data')
# IVR
def get_ivrs(self):
endpoint = f"{self.url}/ivr"
return self._get(endpoint).get('data')
def create_ivr(self, params):
endpoint = f"{self.url}/ivr"
return self._post(endpoint, params).get('data')
def update_ivr(self, ivr_id, params):
endpoint = f"{self.url}/ivr/{ivr_id}"
return self._put(endpoint, params).get('data')
def add_target_to_ivr(self, ivr_id, params):
endpoint = f"{self.url}/ivr/{ivr_id}/target"
return self._post(endpoint, params).get('data')
# IWRS
def get_iwrss(self):
endpoint = f"{self.url}/iwrs"
return self._get(endpoint).get('data')
def create_iwrs(self, params):
endpoint = f"{self.url}/iwrs"
return self._post(endpoint, params).get('data')
def update_iwrs(self, iwrs_id, params):
endpoint = f"{self.url}/iwrs/{iwrs_id}"
return self._put(endpoint, params).get('data')
# TENANT
def update_feature_tenant_api(self, params):
endpoint = f"{self.url}/tenant/feature/api"
return self._put(endpoint, params).get('data')
def update_feature_tenant_crm(self, params):
endpoint = f"{self.url}/tenant/feature/crm"
return self._put(endpoint, params).get('data')
def update_feature_tenant_ticketing(self, params):
endpoint = f"{self.url}/tenant/feature/ticketing"
return self._put(endpoint, params).get('data')
def get_bss_apis(self):
endpoint = f"{self.url}/tenant/bss_api"
return self._get(endpoint).get('data')
def get_tenant_applications(self):
endpoint = f"{self.url}/tenant/application"
return self._get(endpoint).get('data')
def create_tenant_application(self, params):
endpoint = f"{self.url}/tenant/application"
return self._post(endpoint, params).get('data')
def get_plugin_templates(self):
endpoint = f"{self.url}/tenant/plugin/template"
return self._get(endpoint).get('data')
def create_plugin_template(self, params):
endpoint = f"{self.url}/tenant/plugin/template"
return self._post(endpoint, params).get('data')
def get_plugin_url_configurations(self):
endpoint = f"{self.url}/tenant/plugin/url_configuration"
return self._get(endpoint).get('data')
def create_plugin_url_configuration(self, params):
endpoint = f"{self.url}/tenant/plugin/url_configuration"
return self._post(endpoint, params).get('data')