refactor webhookAnalytics call and enrich analytics module (#8253)
**TLDR** Refactor WebhoonAnalytics Graph to a more abstract version AnalyticsGraph (in analytics module). Thus enabling the components to be used on different instances (ex: new endpoint, new kind of graph). **In order to test:** 1. Set ANALYTICS_ENABLED to true 2. Set TINYBIRD_JWT_TOKEN to the ADMIN token from the workspace twenty_analytics_playground 3. Set TINYBIRD_JWT_TOKEN to the datasource or your admin token from the workspace twenty_analytics_playground 4. Create a Webhook in twenty and set wich events it needs to track 5. Run twenty-worker in order to make the webhooks work. 6. Do your tasks in order to populate the data 7. Enter to settings> webhook>your webhook and the statistics section should be displayed. --------- Co-authored-by: Félix Malfait <felix@twenty.com>
This commit is contained in:
committed by
GitHub
parent
f9c076df31
commit
f06cdbdfc6
@ -5,10 +5,10 @@ import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator';
|
||||
import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator';
|
||||
|
||||
import { Analytics } from './analytics.entity';
|
||||
import { AnalyticsService } from './analytics.service';
|
||||
|
||||
import { CreateAnalyticsInput } from './dtos/create-analytics.input';
|
||||
import { Analytics } from './entities/analytics.entity';
|
||||
|
||||
@Resolver(() => Analytics)
|
||||
export class AnalyticsResolver {
|
||||
|
||||
@ -3,6 +3,7 @@ import { Injectable, Logger } from '@nestjs/common';
|
||||
|
||||
import { AxiosRequestConfig } from 'axios';
|
||||
|
||||
import { AnalyticsTinybirdJwtMap } from 'src/engine/core-modules/analytics/entities/analytics-tinybird-jwts.entity';
|
||||
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
|
||||
import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
|
||||
|
||||
@ -89,24 +90,56 @@ export class AnalyticsService {
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
async generateWorkspaceJwt(workspaceId: string | undefined) {
|
||||
const pipeId = 't_b49e0fe60f9e438eae81cb31c5260df2'; // refactor this pass as params
|
||||
//perhaps a constant of name:pipeId??? better typing in this func^
|
||||
const payload = {
|
||||
name: 'my_demo_jwt',
|
||||
generateWorkspaceJwt(
|
||||
workspaceId: string | undefined,
|
||||
): AnalyticsTinybirdJwtMap | null {
|
||||
if (!this.environmentService.get('ANALYTICS_ENABLED')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const jwtPayload = {
|
||||
name: 'analytics_jwt',
|
||||
workspace_id: this.environmentService.get('TINYBIRD_WORKSPACE_UUID'),
|
||||
scopes: [
|
||||
{
|
||||
type: 'PIPES:READ',
|
||||
resource: pipeId,
|
||||
fixed_params: { workspaceId: workspaceId },
|
||||
resource: '',
|
||||
fixed_params: { workspaceId },
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
return this.jwtWrapperService.sign(payload, {
|
||||
const jwtOptions = {
|
||||
secret: this.environmentService.get('TINYBIRD_GENERATE_JWT_TOKEN'),
|
||||
expiresIn: '7d',
|
||||
});
|
||||
};
|
||||
|
||||
const analyticsProperties = [
|
||||
'getWebhookAnalytics',
|
||||
'getPageviewsAnalytics',
|
||||
'getUsersAnalytics',
|
||||
'getServerlessFunctionDuration',
|
||||
'getServerlessFunctionSuccessRate',
|
||||
'getServerlessFunctionErrorCount',
|
||||
];
|
||||
|
||||
return analyticsProperties.reduce(
|
||||
(acc, property) => ({
|
||||
...acc,
|
||||
[property]: this.jwtWrapperService.sign(
|
||||
{
|
||||
...jwtPayload,
|
||||
scopes: [
|
||||
{
|
||||
...jwtPayload.scopes[0],
|
||||
resource: property,
|
||||
},
|
||||
],
|
||||
},
|
||||
jwtOptions,
|
||||
),
|
||||
}),
|
||||
{},
|
||||
) as AnalyticsTinybirdJwtMap;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
import { Field, ObjectType } from '@nestjs/graphql';
|
||||
|
||||
@ObjectType()
|
||||
export class AnalyticsTinybirdJwtMap {
|
||||
@Field(() => String)
|
||||
getWebhookAnalytics: string;
|
||||
|
||||
@Field(() => String)
|
||||
getPageviewsAnalytics: string;
|
||||
|
||||
@Field(() => String)
|
||||
getUsersAnalytics: string;
|
||||
|
||||
@Field(() => String)
|
||||
getServerlessFunctionDuration: string;
|
||||
|
||||
@Field(() => String)
|
||||
getServerlessFunctionSuccessRate: string;
|
||||
|
||||
@Field(() => String)
|
||||
getServerlessFunctionErrorCount: string;
|
||||
}
|
||||
@ -20,6 +20,7 @@ import { SupportDriver } from 'src/engine/core-modules/environment/interfaces/su
|
||||
import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.interface';
|
||||
|
||||
import { AnalyticsService } from 'src/engine/core-modules/analytics/analytics.service';
|
||||
import { AnalyticsTinybirdJwtMap } from 'src/engine/core-modules/analytics/entities/analytics-tinybird-jwts.entity';
|
||||
import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service';
|
||||
import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service';
|
||||
import { FileService } from 'src/engine/core-modules/file/services/file.service';
|
||||
@ -156,13 +157,9 @@ export class UserResolver {
|
||||
return getHMACKey(parent.email, key);
|
||||
}
|
||||
|
||||
@ResolveField(() => String, {
|
||||
nullable: true,
|
||||
})
|
||||
async analyticsTinybirdJwt(
|
||||
@AuthWorkspace() workspace: Workspace | undefined,
|
||||
): Promise<string> {
|
||||
return await this.analyticsService.generateWorkspaceJwt(workspace?.id);
|
||||
@ResolveField(() => AnalyticsTinybirdJwtMap, { nullable: true })
|
||||
analyticsTinybirdJwts(@AuthWorkspace() workspace: Workspace | undefined) {
|
||||
return this.analyticsService.generateWorkspaceJwt(workspace?.id);
|
||||
}
|
||||
|
||||
@Mutation(() => String)
|
||||
|
||||
Reference in New Issue
Block a user