From d3d617239f9689dcbfc73951c8372427732d8e51 Mon Sep 17 00:00:00 2001 From: Garfield Dai Date: Mon, 29 Jan 2024 17:31:45 +0800 Subject: [PATCH] Feat/utm update (#2269) Co-authored-by: Joel --- api/controllers/console/__init__.py | 2 -- api/controllers/console/feature.py | 2 ++ api/controllers/console/operation/__init__.py | 0 .../console/operation/operation.py | 30 ------------------- api/controllers/console/wraps.py | 20 +++++++++++++ api/services/operation_service.py | 12 ++++---- web/app/components/swr-initor.tsx | 8 ----- web/context/provider-context.tsx | 20 +------------ web/models/common.ts | 8 ----- web/service/common.ts | 5 ---- 10 files changed, 29 insertions(+), 78 deletions(-) delete mode 100644 api/controllers/console/operation/__init__.py delete mode 100644 api/controllers/console/operation/operation.py diff --git a/api/controllers/console/__init__.py b/api/controllers/console/__init__.py index 662edeba13..9642849732 100644 --- a/api/controllers/console/__init__.py +++ b/api/controllers/console/__init__.py @@ -19,5 +19,3 @@ from .explore import audio, completion, conversation, installed_app, message, pa 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/feature.py b/api/controllers/console/feature.py index f1e6286b6d..40f86fc235 100644 --- a/api/controllers/console/feature.py +++ b/api/controllers/console/feature.py @@ -3,10 +3,12 @@ from flask_restful import Resource from services.feature_service import FeatureService from . import api +from .wraps import cloud_utm_record class FeatureApi(Resource): + @cloud_utm_record def get(self): return FeatureService.get_features(current_user.current_tenant_id).dict() diff --git a/api/controllers/console/operation/__init__.py b/api/controllers/console/operation/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/api/controllers/console/operation/operation.py b/api/controllers/console/operation/operation.py deleted file mode 100644 index 8d8532a770..0000000000 --- a/api/controllers/console/operation/operation.py +++ /dev/null @@ -1,30 +0,0 @@ -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/controllers/console/wraps.py b/api/controllers/console/wraps.py index 049657fc85..7e01b26846 100644 --- a/api/controllers/console/wraps.py +++ b/api/controllers/console/wraps.py @@ -1,10 +1,13 @@ # -*- coding:utf-8 -*- +import json from functools import wraps +from flask import request from controllers.console.workspace.error import AccountNotInitializedError from flask import abort, current_app from flask_login import current_user from services.feature_service import FeatureService +from services.operation_service import OperationService def account_initialization_required(view): @@ -73,3 +76,20 @@ def cloud_edition_billing_resource_check(resource: str, return decorated return interceptor + +def cloud_utm_record(view): + @wraps(view) + def decorated(*args, **kwargs): + try: + features = FeatureService.get_features(current_user.current_tenant_id) + + if features.billing.enabled: + utm_info = request.cookies.get('utm_info') + + if utm_info: + utm_info = json.loads(utm_info) + OperationService.record_utm(current_user.current_tenant_id, utm_info) + except Exception as e: + pass + return view(*args, **kwargs) + return decorated diff --git a/api/services/operation_service.py b/api/services/operation_service.py index 655e49a9d4..39f249dc24 100644 --- a/api/services/operation_service.py +++ b/api/services/operation_service.py @@ -20,13 +20,13 @@ class OperationService: return response.json() @classmethod - def record_utm(cls, tenant_id, args): + def record_utm(cls, tenant_id: str, utm_info: dict): 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'] + 'utm_source': utm_info.get('utm_source', ''), + 'utm_medium': utm_info.get('utm_medium', ''), + 'utm_campaign': utm_info.get('utm_campaign', ''), + 'utm_content': utm_info.get('utm_content', ''), + 'utm_term': utm_info.get('utm_term', '') } return cls._send_request('POST', '/tenant_utms', params=params) diff --git a/web/app/components/swr-initor.tsx b/web/app/components/swr-initor.tsx index 61a4344fc6..f5ca271d0d 100644 --- a/web/app/components/swr-initor.tsx +++ b/web/app/components/swr-initor.tsx @@ -15,14 +15,6 @@ const SwrInitor = ({ const searchParams = useSearchParams() const consoleToken = searchParams.get('console_token') const consoleTokenFromLocalStorage = localStorage?.getItem('console_token') - const utm = { - utm_source: searchParams.get('utm_source') || '', - utm_medium: searchParams.get('utm_medium') || '', - utm_campaign: searchParams.get('utm_campaign') || '', - utm_content: searchParams.get('utm_content') || '', - utm_term: searchParams.get('utm_term') || '', - } - localStorage?.setItem('utm', JSON.stringify(utm)) const [init, setInit] = useState(false) useEffect(() => { diff --git a/web/context/provider-context.tsx b/web/context/provider-context.tsx index 584fc3dcae..f58a5bd5cb 100644 --- a/web/context/provider-context.tsx +++ b/web/context/provider-context.tsx @@ -7,7 +7,6 @@ import { fetchModelList, fetchModelProviders, fetchSupportRetrievalMethods, - operationUtm, } from '@/service/common' import { ModelFeatureEnum, @@ -100,23 +99,7 @@ export const ProviderContextProvider = ({ const [isFetchedPlan, setIsFetchedPlan] = useState(false) const [enableBilling, setEnableBilling] = useState(true) const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false) - const handleOperateUtm = () => { - let utm - try { - utm = JSON.parse(localStorage?.getItem('utm') || '{}') - } - catch (e) { - utm = { - utm_source: '', - utm_medium: '', - utm_campaign: '', - utm_content: '', - utm_term: '', - } - } - if (utm.utm_source || utm.utm_medium || utm.utm_campaign || utm.utm_content || utm.utm_term) - operationUtm({ url: '/operation/utm', body: utm }) - } + const fetchPlan = async () => { const data = await fetchCurrentPlanInfo() const enabled = data.billing.enabled @@ -124,7 +107,6 @@ export const ProviderContextProvider = ({ setEnableReplaceWebAppLogo(data.can_replace_logo) if (enabled) { setPlan(parseCurrentPlan(data)) - handleOperateUtm() setIsFetchedPlan(true) } } diff --git a/web/models/common.ts b/web/models/common.ts index 5f8795688e..f8038d5d35 100644 --- a/web/models/common.ts +++ b/web/models/common.ts @@ -251,11 +251,3 @@ export type ModerationService = ( text: string } ) => Promise - -export type Utm = { - utm_source?: string - utm_medium?: string - utm_campaign?: string - utm_term?: string - utm_content?: string -} diff --git a/web/service/common.ts b/web/service/common.ts index 2ae3cf9646..a3a1c7c811 100644 --- a/web/service/common.ts +++ b/web/service/common.ts @@ -20,7 +20,6 @@ import type { ProviderAzureToken, SetupStatusResponse, UserProfileOriginResponse, - Utm, } from '@/models/common' import type { UpdateOpenAIKeyResponse, @@ -263,7 +262,3 @@ type RetrievalMethodsRes = { export const fetchSupportRetrievalMethods: Fetcher = (url) => { return get(url) } - -export const operationUtm: Fetcher = ({ url, body }) => { - return post(url, { body }) as Promise -}