feat: Add AI Agent workflow action node (#12650)
https://github.com/user-attachments/assets/8593e488-cb00-4fd2-b903-5ba5766e0254 --------- Co-authored-by: Antoine Moreaux <moreaux.antoine@gmail.com> Co-authored-by: martmull <martmull@hotmail.fr> Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: Baptiste Devessier <baptiste@devessier.fr> Co-authored-by: Joseph Chiang <josephj6802@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Guillim <guillim@users.noreply.github.com> Co-authored-by: Raphaël Bosi <71827178+bosiraphael@users.noreply.github.com> Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com> Co-authored-by: Marie <51697796+ijreilly@users.noreply.github.com> Co-authored-by: Naifer <161821705+omarNaifer12@users.noreply.github.com> Co-authored-by: prastoin <paul@twenty.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions <github-actions@twenty.com> Co-authored-by: Thomas Trompette <thomas.trompette@sfr.fr> Co-authored-by: Etienne <45695613+etiennejouan@users.noreply.github.com> Co-authored-by: Ajay A Adsule <103304466+AjayAdsule@users.noreply.github.com> Co-authored-by: bosiraphael <raphael.bosi@gmail.com> Co-authored-by: Charles Bochet <charles@twenty.com> Co-authored-by: Marty <91310557+real-marty@users.noreply.github.com> Co-authored-by: Félix Malfait <felix@twenty.com> Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Co-authored-by: Weiko <corentin@twenty.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: nitin <142569587+ehconitin@users.noreply.github.com>
This commit is contained in:
@ -0,0 +1,65 @@
|
||||
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
|
||||
import { Reflector } from '@nestjs/core';
|
||||
import { GqlExecutionContext } from '@nestjs/graphql';
|
||||
|
||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
|
||||
import { TypedReflect } from 'src/utils/typed-reflect';
|
||||
|
||||
export const FEATURE_FLAG_KEY = 'feature-flag-metadata-args';
|
||||
|
||||
export function RequireFeatureFlag(featureFlag: FeatureFlagKey) {
|
||||
return (
|
||||
target: object,
|
||||
propertyKey?: string,
|
||||
descriptor?: PropertyDescriptor,
|
||||
) => {
|
||||
TypedReflect.defineMetadata(
|
||||
FEATURE_FLAG_KEY,
|
||||
featureFlag,
|
||||
descriptor?.value || target,
|
||||
);
|
||||
|
||||
return descriptor;
|
||||
};
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class FeatureFlagGuard implements CanActivate {
|
||||
constructor(
|
||||
private readonly reflector: Reflector,
|
||||
private readonly featureFlagService: FeatureFlagService,
|
||||
) {}
|
||||
|
||||
async canActivate(context: ExecutionContext): Promise<boolean> {
|
||||
const ctx = GqlExecutionContext.create(context);
|
||||
const request = ctx.getContext().req;
|
||||
const workspaceId = request.workspace?.id;
|
||||
|
||||
if (!workspaceId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const featureFlag = this.reflector.get<FeatureFlagKey>(
|
||||
FEATURE_FLAG_KEY,
|
||||
context.getHandler(),
|
||||
);
|
||||
|
||||
if (!featureFlag) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const isEnabled = await this.featureFlagService.isFeatureEnabled(
|
||||
featureFlag,
|
||||
workspaceId,
|
||||
);
|
||||
|
||||
if (!isEnabled) {
|
||||
throw new Error(
|
||||
`Feature flag "${featureFlag}" is not enabled for this workspace`,
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user