Api keys and webhook migration to core (#13011)

TODO: check Zapier trigger records work as expected

---------

Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
nitin
2025-07-09 20:33:54 +05:30
committed by GitHub
parent 18792f9f74
commit 484c267aa6
113 changed files with 4563 additions and 1060 deletions

View File

@ -0,0 +1,29 @@
import { DataSource } from 'typeorm';
const tableName = 'apiKey';
export const seedApiKeys = async (
dataSource: DataSource,
schemaName: string,
workspaceId: string,
) => {
await dataSource
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, [
'id',
'name',
'expiresAt',
'workspaceId',
])
.orIgnore()
.values([
{
id: '20202020-f401-4d8a-a731-64d007c27bad',
name: 'My api key',
expiresAt: '2025-12-31T23:59:59.000Z',
workspaceId: workspaceId,
},
])
.execute();
};

View File

@ -1,6 +1,7 @@
import { DataSource } from 'typeorm';
import { seedBillingSubscriptions } from 'src/engine/workspace-manager/dev-seeder/core/billing/utils/seed-billing-subscriptions.util';
import { seedApiKeys } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-api-keys.util';
import { seedFeatureFlags } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-feature-flags.util';
import { seedUserWorkspaces } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-user-workspaces.util';
import { seedUsers } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-users.util';
@ -32,6 +33,8 @@ export const seedCoreSchema = async ({
await seedUsers(dataSource, schemaName);
await seedUserWorkspaces(dataSource, schemaName, workspaceId);
await seedApiKeys(dataSource, schemaName, workspaceId);
if (shouldSeedFeatureFlags) {
await seedFeatureFlags(dataSource, schemaName, workspaceId);
}

View File

@ -19,7 +19,7 @@ export const API_KEY_DATA_SEEDS: ApiKeyDataSeed[] = [
id: API_KEY_DATA_SEED_IDS.ID_1,
name: 'My api key',
expiresAt: new Date(
new Date().getTime() + 1000 * 60 * 60 * 24 * 365 * 100, // In 100 years
new Date().getTime() + 1000 * 60 * 60 * 24 * 365 * 100, // 100 years from now
),
},
];

View File

@ -5,10 +5,6 @@ import { WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manager/wor
import { computeTableName } from 'src/engine/utils/compute-table-name.util';
import { shouldSeedWorkspaceFavorite } from 'src/engine/utils/should-seed-workspace-favorite';
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
import {
API_KEY_DATA_SEED_COLUMNS,
API_KEY_DATA_SEEDS,
} from 'src/engine/workspace-manager/dev-seeder/data/constants/api-key-data-seeds.constant';
import {
CALENDAR_CHANNEL_DATA_SEED_COLUMNS,
CALENDAR_CHANNEL_DATA_SEEDS,
@ -130,11 +126,6 @@ const RECORD_SEEDS_CONFIGS = [
pgColumns: OPPORTUNITY_DATA_SEED_COLUMNS,
recordSeeds: OPPORTUNITY_DATA_SEEDS,
},
{
tableName: 'apiKey',
pgColumns: API_KEY_DATA_SEED_COLUMNS,
recordSeeds: API_KEY_DATA_SEEDS,
},
{
tableName: 'connectedAccount',
pgColumns: CONNECTED_ACCOUNT_DATA_SEED_COLUMNS,

View File

@ -49,6 +49,7 @@ export class StandardFieldFactory {
isGatedAndNotEnabled(
workspaceEntityMetadataArgs.gate,
context.featureFlags,
'database',
)
) {
return acc;

View File

@ -37,6 +37,7 @@ export class StandardObjectFactory {
isGatedAndNotEnabled(
workspaceEntityMetadataArgs.gate,
context.featureFlags,
'database',
)
) {
return undefined;

View File

@ -37,7 +37,6 @@ import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/sta
// TODO: Maybe we should automate this with the DiscoverService of Nest.JS
export const standardObjectMetadataDefinitions = [
ApiKeyWorkspaceEntity,
AttachmentWorkspaceEntity,
BlocklistWorkspaceEntity,
CalendarEventWorkspaceEntity,
@ -55,7 +54,6 @@ export const standardObjectMetadataDefinitions = [
ViewFilterGroupWorkspaceEntity,
ViewSortWorkspaceEntity,
ViewWorkspaceEntity,
WebhookWorkspaceEntity,
WorkflowWorkspaceEntity,
WorkflowVersionWorkspaceEntity,
WorkflowRunWorkspaceEntity,
@ -73,4 +71,6 @@ export const standardObjectMetadataDefinitions = [
PersonWorkspaceEntity,
TaskWorkspaceEntity,
TaskTargetWorkspaceEntity,
ApiKeyWorkspaceEntity,
WebhookWorkspaceEntity,
];

View File

@ -1,11 +1,33 @@
import { Gate } from 'src/engine/twenty-orm/interfaces/gate.interface';
export type GateContext = 'database' | 'graphql';
export const isGatedAndNotEnabled = (
gate: Gate | undefined,
workspaceFeatureFlagsMap: Record<string, boolean>,
context?: GateContext,
): boolean => {
const featureFlagValue =
gate?.featureFlag && workspaceFeatureFlagsMap[gate.featureFlag];
// If no gate, not gated
if (!gate?.featureFlag) {
return false;
}
return gate?.featureFlag !== undefined && !featureFlagValue;
// Check if explicitly excluded from the specific context
switch (context) {
case 'database':
if (gate.excludeFromDatabase === false) {
return false; // Not gated for database
}
break;
case 'graphql':
if (gate.excludeFromGraphQL === false) {
return false; // Not gated for GraphQL
}
break;
}
// If context-specific exclusion is true or undefined (default behavior), check the flag
const featureFlagValue = workspaceFeatureFlagsMap[gate.featureFlag];
return !featureFlagValue;
};