diff --git a/packages/twenty-server/src/core/auth/controllers/google-gmail-auth.controller.ts b/packages/twenty-server/src/core/auth/controllers/google-gmail-auth.controller.ts index 56ce61161..997bf504e 100644 --- a/packages/twenty-server/src/core/auth/controllers/google-gmail-auth.controller.ts +++ b/packages/twenty-server/src/core/auth/controllers/google-gmail-auth.controller.ts @@ -36,7 +36,7 @@ export class GoogleGmailAuthController { await this.tokenService.verifyTransientToken(transientToken); this.googleGmailService.saveConnectedAccount({ - email, + handle: email, workspaceMemberId: workspaceMemberId, workspaceId: workspaceId, provider: 'gmail', diff --git a/packages/twenty-server/src/core/auth/dto/save-connected-account.ts b/packages/twenty-server/src/core/auth/dto/save-connected-account.ts index 32b53313f..f4f5f389a 100644 --- a/packages/twenty-server/src/core/auth/dto/save-connected-account.ts +++ b/packages/twenty-server/src/core/auth/dto/save-connected-account.ts @@ -1,13 +1,13 @@ import { ArgsType, Field } from '@nestjs/graphql'; -import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; +import { IsNotEmpty, IsString } from 'class-validator'; @ArgsType() export class SaveConnectedAccountInput { @Field(() => String) @IsNotEmpty() - @IsEmail() - email: string; + @IsString() + handle: string; @Field(() => String) @IsNotEmpty() diff --git a/packages/twenty-server/src/core/auth/services/google-gmail.service.ts b/packages/twenty-server/src/core/auth/services/google-gmail.service.ts index 3fd3d5265..11422a13b 100644 --- a/packages/twenty-server/src/core/auth/services/google-gmail.service.ts +++ b/packages/twenty-server/src/core/auth/services/google-gmail.service.ts @@ -15,7 +15,7 @@ export class GoogleGmailService { saveConnectedAccountInput: SaveConnectedAccountInput, ) { const { - email, + handle, workspaceId, provider, accessToken, @@ -33,8 +33,8 @@ export class GoogleGmailService { ); const connectedAccount = await workspaceDataSource?.query( - `SELECT * FROM ${dataSourceMetadata.schema}."connectedAccount" WHERE "email" = $1 AND "provider" = $2 AND "accountOwnerId" = $3`, - [email, provider, workspaceMemberId], + `SELECT * FROM ${dataSourceMetadata.schema}."connectedAccount" WHERE "handle" = $1 AND "provider" = $2 AND "accountOwnerId" = $3`, + [handle, provider, workspaceMemberId], ); if (connectedAccount.length > 0) { @@ -44,8 +44,8 @@ export class GoogleGmailService { } await workspaceDataSource?.query( - `INSERT INTO ${dataSourceMetadata.schema}."connectedAccount" ("email", "provider", "accessToken", "refreshToken", "accountOwnerId") VALUES ($1, $2, $3, $4, $5)`, - [email, provider, accessToken, refreshToken, workspaceMemberId], + `INSERT INTO ${dataSourceMetadata.schema}."connectedAccount" ("handle", "provider", "accessToken", "refreshToken", "accountOwnerId") VALUES ($1, $2, $3, $4, $5)`, + [handle, provider, accessToken, refreshToken, workspaceMemberId], ); return; diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/comment.object-metadata.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/comment.object-metadata.ts index 06df486ba..4326b454c 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/comment.object-metadata.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/comment.object-metadata.ts @@ -3,7 +3,6 @@ import { ObjectMetadata, IsSystem, FieldMetadata, - IsNullable, } from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator'; import { ActivityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity.object-metadata'; import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata'; diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/connected-account.object-metadata.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/connected-account.object-metadata.ts index 3e22239db..e21a5f25e 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/connected-account.object-metadata.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/connected-account.object-metadata.ts @@ -1,10 +1,14 @@ import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; +import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity'; import { ObjectMetadata, IsSystem, FieldMetadata, + IsNullable, + RelationMetadata, } from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator'; import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata'; +import { MessageChannelObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/message-channel.object-metadata'; import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata'; @ObjectMetadata({ @@ -18,11 +22,11 @@ import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-meta export class ConnectedAccountObjectMetadata extends BaseObjectMetadata { @FieldMetadata({ type: FieldMetadataType.TEXT, - label: 'email', - description: 'The account email', + label: 'handle', + description: 'The account handle (email, username, phone number, etc.)', icon: 'IconMail', }) - email: string; + handle: string; @FieldMetadata({ type: FieldMetadataType.TEXT, @@ -34,7 +38,7 @@ export class ConnectedAccountObjectMetadata extends BaseObjectMetadata { @FieldMetadata({ type: FieldMetadataType.TEXT, - label: 'accessToken', + label: 'Access Token', description: 'Messaging provider access token', icon: 'IconKey', }) @@ -42,7 +46,7 @@ export class ConnectedAccountObjectMetadata extends BaseObjectMetadata { @FieldMetadata({ type: FieldMetadataType.TEXT, - label: 'refreshToken', + label: 'Refresh Token', description: 'Messaging provider refresh token', icon: 'IconKey', }) @@ -56,4 +60,17 @@ export class ConnectedAccountObjectMetadata extends BaseObjectMetadata { joinColumn: 'accountOwnerId', }) accountOwner: WorkspaceMemberObjectMetadata; + + @FieldMetadata({ + type: FieldMetadataType.RELATION, + label: 'Message Channel', + description: 'Message Channel', + icon: 'IconMessage', + }) + @RelationMetadata({ + type: RelationMetadataType.ONE_TO_MANY, + objectName: 'messageChannel', + }) + @IsNullable() + messageChannels: MessageChannelObjectMetadata[]; } diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/index.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/index.ts index 56ab4f5b3..00cdbef46 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/index.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/index.ts @@ -6,6 +6,7 @@ import { CommentObjectMetadata } from 'src/workspace/workspace-sync-metadata/sta import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata'; import { ConnectedAccountObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/connected-account.object-metadata'; import { FavoriteObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/favorite.object-metadata'; +import { MessageChannelObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/message-channel.object-metadata'; import { OpportunityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata'; import { PersonObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/person.object-metadata'; import { PipelineStepObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/pipeline-step.object-metadata'; @@ -34,4 +35,5 @@ export const standardObjectMetadata = [ ViewObjectMetadata, WebhookObjectMetadata, WorkspaceMemberObjectMetadata, + MessageChannelObjectMetadata, ]; diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/message-channel.object-metadata.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/message-channel.object-metadata.ts new file mode 100644 index 000000000..513d6a602 --- /dev/null +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/message-channel.object-metadata.ts @@ -0,0 +1,55 @@ +import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; +import { + ObjectMetadata, + IsSystem, + FieldMetadata, + IsNullable, +} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator'; +import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata'; +import { ConnectedAccountObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/connected-account.object-metadata'; + +@ObjectMetadata({ + namePlural: 'messageChannels', + labelSingular: 'Message Channel', + labelPlural: 'Message Channels', + description: 'Message Channels', + icon: 'IconMessage', +}) +@IsSystem() +export class MessageChannelObjectMetadata extends BaseObjectMetadata { + @FieldMetadata({ + // This will be a type select later + type: FieldMetadataType.TEXT, + label: 'Visibility', + description: 'Visibility', + icon: 'IconEyeglass', + defaultValue: { value: 'metadata' }, + }) + visibility: string; + + @FieldMetadata({ + type: FieldMetadataType.TEXT, + label: 'Handle', + description: 'Handle', + icon: 'IconAt', + }) + handle: string; + + @FieldMetadata({ + type: FieldMetadataType.RELATION, + label: 'Connected Account', + description: 'Connected Account', + icon: 'IconUserCircle', + joinColumn: 'connectedAccountId', + }) + connectedAccount: ConnectedAccountObjectMetadata; + + @FieldMetadata({ + type: FieldMetadataType.TEXT, + label: 'Type', + description: 'Type', + icon: 'IconMessage', + }) + @IsNullable() + type: string; +} diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts index 601e2b627..2d4ad4440 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts @@ -2,7 +2,6 @@ import { CurrencyMetadata } from 'src/metadata/field-metadata/composite-types/cu import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity'; import { ObjectMetadata, - IsSystem, FieldMetadata, IsNullable, } from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';