From 9ea1cbf19ec7489887fe79219ad294cea133127d Mon Sep 17 00:00:00 2001 From: heheer Date: Sun, 12 Oct 2025 01:44:48 +0800 Subject: [PATCH] add user active tracks (#5754) * add user active tracks * remove console * perf: track active * perf: track active --------- Co-authored-by: archer <545436317@qq.com> --- .../global/common/middle/tracks/constants.ts | 1 + .../service/common/middle/tracks/utils.ts | 24 +++++++++++++++++++ .../api/support/user/account/tokenLogin.ts | 10 +++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/global/common/middle/tracks/constants.ts b/packages/global/common/middle/tracks/constants.ts index e2bbb2ea1..d93d42684 100644 --- a/packages/global/common/middle/tracks/constants.ts +++ b/packages/global/common/middle/tracks/constants.ts @@ -1,5 +1,6 @@ export enum TrackEnum { login = 'login', + dailyUserActive = 'dailyUserActive', createApp = 'createApp', useAppTemplate = 'useAppTemplate', createDataset = 'createDataset', diff --git a/packages/service/common/middle/tracks/utils.ts b/packages/service/common/middle/tracks/utils.ts index 146131231..900ccd23f 100644 --- a/packages/service/common/middle/tracks/utils.ts +++ b/packages/service/common/middle/tracks/utils.ts @@ -7,6 +7,7 @@ import type { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import type { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { getAppLatestVersion } from '../../../core/app/version/controller'; import { type ShortUrlParams } from '@fastgpt/global/support/marketing/type'; +import { getRedisCache, setRedisCache } from '../../redis/cache'; const createTrack = ({ event, data }: { event: TrackEnum; data: Record }) => { if (!global.feConfigs?.isPlus) return; @@ -66,8 +67,31 @@ export const pushTrack = { return createTrack({ event: TrackEnum.login, data + })?.then(() => { + pushTrack.dailyUserActive({ + uid: data.uid, + teamId: data.teamId, + tmbId: data.tmbId + }); }); }, + dailyUserActive: async (data: PushTrackCommonType) => { + try { + const today = new Date().toISOString().split('T')[0]; + const key = `dailyUserActive:${data.uid}_${today}`; + const cache = await getRedisCache(key); + if (cache) return; + + await setRedisCache(key, '1', 24 * 60 * 60); + + return createTrack({ + event: TrackEnum.dailyUserActive, + data + }); + } catch (error) { + addLog.error('Failed to track daily user active:', error); + } + }, createApp: ( data: PushTrackCommonType & ShortUrlParams & { diff --git a/projects/app/src/pages/api/support/user/account/tokenLogin.ts b/projects/app/src/pages/api/support/user/account/tokenLogin.ts index b63d9a3b4..2954c4880 100644 --- a/projects/app/src/pages/api/support/user/account/tokenLogin.ts +++ b/projects/app/src/pages/api/support/user/account/tokenLogin.ts @@ -3,6 +3,8 @@ import { getUserDetail } from '@fastgpt/service/support/user/controller'; import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next'; import { NextAPI } from '@/service/middleware/entry'; import { type UserType } from '@fastgpt/global/support/user/type'; +import { pushTrack } from '@fastgpt/service/common/middle/tracks/utils'; +import { getGlobalRedisConnection } from '@fastgpt/service/common/redis'; export type TokenLoginQuery = {}; export type TokenLoginBody = {}; @@ -12,9 +14,15 @@ async function handler( req: ApiRequestProps, _res: ApiResponseType ): Promise { - const { tmbId } = await authCert({ req, authToken: true }); + const { tmbId, userId, teamId } = await authCert({ req, authToken: true }); const user = await getUserDetail({ tmbId }); + pushTrack.dailyUserActive({ + uid: userId, + teamId: teamId, + tmbId: tmbId + }); + // Remove sensitive information // if (user.team.lafAccount) { // user.team.lafAccount = {