diff --git a/api/controllers/console/__init__.py b/api/controllers/console/__init__.py index 651d45737a..662edeba13 100644 --- a/api/controllers/console/__init__.py +++ b/api/controllers/console/__init__.py @@ -11,10 +11,13 @@ from .app import (advanced_prompt_template, annotation, app, audio, completion, model_config, site, statistic) # Import auth controllers from .auth import activate, data_source_oauth, login, oauth -from .billing import billing # Import datasets controllers from .datasets import data_source, datasets, datasets_document, datasets_segments, file, hit_testing # Import explore controllers from .explore import audio, completion, conversation, installed_app, message, parameter, recommended_app, saved_message # Import workspace controllers from .workspace import account, members, model_providers, models, tool_providers, workspace +# Import billing controllers +from .billing import billing +# Import operation controllers +from .operation import operation diff --git a/api/controllers/console/operation/__init__.py b/api/controllers/console/operation/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/controllers/console/operation/operation.py b/api/controllers/console/operation/operation.py new file mode 100644 index 0000000000..8d8532a770 --- /dev/null +++ b/api/controllers/console/operation/operation.py @@ -0,0 +1,30 @@ +from flask_login import current_user +from flask_restful import Resource, reqparse + +from controllers.console import api +from controllers.console.setup import setup_required +from controllers.console.wraps import account_initialization_required, only_edition_cloud +from libs.login import login_required +from services.operation_service import OperationService + + +class TenantUtm(Resource): + + @setup_required + @login_required + @account_initialization_required + @only_edition_cloud + def post(self): + + parser = reqparse.RequestParser() + parser.add_argument('utm_source', type=str, required=True) + parser.add_argument('utm_medium', type=str, required=True) + parser.add_argument('utm_campaign', type=str, required=False, default='') + parser.add_argument('utm_content', type=str, required=False, default='') + parser.add_argument('utm_term', type=str, required=False, default='') + args = parser.parse_args() + + return OperationService.record_utm(current_user.current_tenant_id, args) + + +api.add_resource(TenantUtm, '/operation/utm') diff --git a/api/services/operation_service.py b/api/services/operation_service.py new file mode 100644 index 0000000000..655e49a9d4 --- /dev/null +++ b/api/services/operation_service.py @@ -0,0 +1,32 @@ +import os + +import requests + + +class OperationService: + base_url = os.environ.get('BILLING_API_URL', 'BILLING_API_URL') + secret_key = os.environ.get('BILLING_API_SECRET_KEY', 'BILLING_API_SECRET_KEY') + + @classmethod + def _send_request(cls, method, endpoint, json=None, params=None): + headers = { + "Content-Type": "application/json", + "Billing-Api-Secret-Key": cls.secret_key + } + + url = f"{cls.base_url}{endpoint}" + response = requests.request(method, url, json=json, params=params, headers=headers) + + return response.json() + + @classmethod + def record_utm(cls, tenant_id, args): + params = { + 'tenant_id': tenant_id, + 'utm_source': args['utm_source'], + 'utm_medium': args['utm_medium'], + 'utm_campaign': args['utm_campaign'], + 'utm_content': args['utm_content'], + 'utm_term': args['utm_term'] + } + return cls._send_request('POST', '/tenant_utms', params=params)