diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/1711624086253-updateRefreshTokenTable.ts b/packages/twenty-server/src/database/typeorm/core/migrations/1711624086253-updateRefreshTokenTable.ts new file mode 100644 index 000000000..efb9a3dd3 --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/core/migrations/1711624086253-updateRefreshTokenTable.ts @@ -0,0 +1,39 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class UpdateRefreshTokenTable1711624086253 + implements MigrationInterface +{ + name = 'UpdateRefreshTokenTable1711624086253'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."refreshToken" RENAME TO "appToken"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."appToken" ADD "workspaceId" uuid`, + ); + await queryRunner.query( + `ALTER TABLE "core"."appToken" ADD "type" text NOT NULL DEFAULT 'REFRESH_TOKEN'`, + ); + await queryRunner.query(`ALTER TABLE "core"."appToken" ADD "value" text`); + await queryRunner.query( + `ALTER TABLE "core"."appToken" ADD CONSTRAINT "FK_d6ae19a7aa2bbd4919053257772" FOREIGN KEY ("workspaceId") REFERENCES "core"."workspace"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."appToken" DROP CONSTRAINT "FK_d6ae19a7aa2bbd4919053257772"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."appToken" DROP COLUMN "value"`, + ); + await queryRunner.query(`ALTER TABLE "core"."appToken" DROP COLUMN "type"`); + await queryRunner.query( + `ALTER TABLE "core"."appToken" DROP COLUMN "workspaceId"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."appToken" RENAME TO "refreshToken"`, + ); + } +} diff --git a/packages/twenty-server/src/database/typeorm/typeorm.service.ts b/packages/twenty-server/src/database/typeorm/typeorm.service.ts index 675c7c1f1..7d51820de 100644 --- a/packages/twenty-server/src/database/typeorm/typeorm.service.ts +++ b/packages/twenty-server/src/database/typeorm/typeorm.service.ts @@ -6,7 +6,7 @@ import { EnvironmentService } from 'src/engine/integrations/environment/environm import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { User } from 'src/engine/core-modules/user/user.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { BillingSubscriptionItem } from 'src/engine/core-modules/billing/entities/billing-subscription-item.entity'; @@ -28,7 +28,7 @@ export class TypeORMService implements OnModuleInit, OnModuleDestroy { User, Workspace, UserWorkspace, - RefreshToken, + AppToken, FeatureFlagEntity, BillingSubscription, BillingSubscriptionItem, diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.auto-resolver-opts.ts b/packages/twenty-server/src/engine/core-modules/app-token/app-token.auto-resolver-opts.ts similarity index 66% rename from packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.auto-resolver-opts.ts rename to packages/twenty-server/src/engine/core-modules/app-token/app-token.auto-resolver-opts.ts index 254b80e98..651fc08c6 100644 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.auto-resolver-opts.ts +++ b/packages/twenty-server/src/engine/core-modules/app-token/app-token.auto-resolver-opts.ts @@ -4,13 +4,11 @@ import { ReadResolverOpts, } from '@ptc-org/nestjs-query-graphql'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; +import { CreateAppTokenInput } from 'src/engine/core-modules/app-token/dtos/create-app-token.input'; import { JwtAuthGuard } from 'src/engine/guards/jwt.auth.guard'; -import { RefreshToken } from './refresh-token.entity'; - -import { CreateRefreshTokenInput } from './dtos/create-refresh-token.input'; - -export const refreshTokenAutoResolverOpts: AutoResolverOpts< +export const appTokenAutoResolverOpts: AutoResolverOpts< any, any, unknown, @@ -19,9 +17,9 @@ export const refreshTokenAutoResolverOpts: AutoResolverOpts< PagingStrategies >[] = [ { - EntityClass: RefreshToken, - DTOClass: RefreshToken, - CreateDTOClass: CreateRefreshTokenInput, + EntityClass: AppToken, + DTOClass: AppToken, + CreateDTOClass: CreateAppTokenInput, enableTotalCount: true, pagingStrategy: PagingStrategies.CURSOR, read: { diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.entity.ts b/packages/twenty-server/src/engine/core-modules/app-token/app-token.entity.ts similarity index 52% rename from packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.entity.ts rename to packages/twenty-server/src/engine/core-modules/app-token/app-token.entity.ts index d133aa8f9..9f960ba22 100644 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/app-token/app-token.entity.ts @@ -11,19 +11,22 @@ import { } from 'typeorm'; import { BeforeCreateOne, IDField } from '@ptc-org/nestjs-query-graphql'; +import { BeforeCreateOneAppToken } from 'src/engine/core-modules/app-token/hooks/before-create-one-app-token.hook'; import { User } from 'src/engine/core-modules/user/user.entity'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +export enum AppTokenType { + RefreshToken = 'REFRESH_TOKEN', +} -import { BeforeCreateOneRefreshToken } from './hooks/before-create-one-refresh-token.hook'; - -@Entity({ name: 'refreshToken', schema: 'core' }) -@ObjectType('RefreshToken') -@BeforeCreateOne(BeforeCreateOneRefreshToken) -export class RefreshToken { +@Entity({ name: 'appToken', schema: 'core' }) +@ObjectType('AppToken') +@BeforeCreateOne(BeforeCreateOneAppToken) +export class AppToken { @IDField(() => ID) @PrimaryGeneratedColumn('uuid') id: string; - @ManyToOne(() => User, (user) => user.refreshTokens, { + @ManyToOne(() => User, (user) => user.appTokens, { onDelete: 'CASCADE', }) @JoinColumn({ name: 'userId' }) @@ -32,6 +35,22 @@ export class RefreshToken { @Column() userId: string; + @ManyToOne(() => Workspace, (workspace) => workspace.appTokens, { + onDelete: 'CASCADE', + }) + @JoinColumn({ name: 'workspaceId' }) + workspace: Workspace; + + @Column({ nullable: true }) + workspaceId: string; + + @Field() + @Column({ nullable: false, type: 'text', default: AppTokenType.RefreshToken }) + type: AppTokenType; + + @Column({ nullable: true, type: 'text' }) + value: string; + @Field() @Column('timestamp with time zone') expiresAt: Date; diff --git a/packages/twenty-server/src/engine/core-modules/app-token/app-token.module.ts b/packages/twenty-server/src/engine/core-modules/app-token/app-token.module.ts new file mode 100644 index 000000000..ade8e7cb6 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/app-token/app-token.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; + +import { NestjsQueryGraphQLModule } from '@ptc-org/nestjs-query-graphql'; +import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; + +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; +import { appTokenAutoResolverOpts } from 'src/engine/core-modules/app-token/app-token.auto-resolver-opts'; +import { AppTokenService } from 'src/engine/core-modules/app-token/services/app-token.service'; + +@Module({ + imports: [ + NestjsQueryGraphQLModule.forFeature({ + imports: [NestjsQueryTypeOrmModule.forFeature([AppToken], 'core')], + services: [AppTokenService], + resolvers: appTokenAutoResolverOpts, + }), + ], +}) +export class AppTokenModule {} diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/dtos/create-refresh-token.input.ts b/packages/twenty-server/src/engine/core-modules/app-token/dtos/create-app-token.input.ts similarity index 82% rename from packages/twenty-server/src/engine/core-modules/refresh-token/dtos/create-refresh-token.input.ts rename to packages/twenty-server/src/engine/core-modules/app-token/dtos/create-app-token.input.ts index a31883037..5d2385ee7 100644 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/dtos/create-refresh-token.input.ts +++ b/packages/twenty-server/src/engine/core-modules/app-token/dtos/create-app-token.input.ts @@ -3,7 +3,7 @@ import { Field, InputType } from '@nestjs/graphql'; import { IsDate, IsNotEmpty } from 'class-validator'; @InputType() -export class CreateRefreshTokenInput { +export class CreateAppTokenInput { @IsDate() @IsNotEmpty() @Field() diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/hooks/before-create-one-refresh-token.hook.ts b/packages/twenty-server/src/engine/core-modules/app-token/hooks/before-create-one-app-token.hook.ts similarity index 78% rename from packages/twenty-server/src/engine/core-modules/refresh-token/hooks/before-create-one-refresh-token.hook.ts rename to packages/twenty-server/src/engine/core-modules/app-token/hooks/before-create-one-app-token.hook.ts index f9e0f219c..9face2a59 100644 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/hooks/before-create-one-refresh-token.hook.ts +++ b/packages/twenty-server/src/engine/core-modules/app-token/hooks/before-create-one-app-token.hook.ts @@ -4,9 +4,9 @@ import { } from '@ptc-org/nestjs-query-graphql'; import { v4 as uuidv4 } from 'uuid'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; -export class BeforeCreateOneRefreshToken +export class BeforeCreateOneAppToken implements BeforeCreateOneHook { async run( diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/services/refresh-token.service.spec.ts b/packages/twenty-server/src/engine/core-modules/app-token/services/app-token.service.spec.ts similarity index 50% rename from packages/twenty-server/src/engine/core-modules/refresh-token/services/refresh-token.service.spec.ts rename to packages/twenty-server/src/engine/core-modules/app-token/services/app-token.service.spec.ts index cbf7110f6..c17ceca4a 100644 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/services/refresh-token.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/app-token/services/app-token.service.spec.ts @@ -1,25 +1,24 @@ import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { AppTokenService } from 'src/engine/core-modules/app-token/services/app-token.service'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; -import { RefreshTokenService } from './refresh-token.service'; - -describe('RefreshTokenService', () => { - let service: RefreshTokenService; +describe('AppTokenService', () => { + let service: AppTokenService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ - RefreshTokenService, + AppTokenService, { - provide: getRepositoryToken(RefreshToken), + provide: getRepositoryToken(AppToken), useValue: {}, }, ], }).compile(); - service = module.get(RefreshTokenService); + service = module.get(AppTokenService); }); it('should be defined', () => { diff --git a/packages/twenty-server/src/engine/core-modules/app-token/services/app-token.service.ts b/packages/twenty-server/src/engine/core-modules/app-token/services/app-token.service.ts new file mode 100644 index 000000000..3f42cdfdc --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/app-token/services/app-token.service.ts @@ -0,0 +1,5 @@ +import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; + +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; + +export class AppTokenService extends TypeOrmQueryService {} diff --git a/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts b/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts index ded002b07..3f051e92c 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/auth.module.ts @@ -7,7 +7,7 @@ import { HttpModule } from '@nestjs/axios'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; import { UserModule } from 'src/engine/core-modules/user/user.module'; import { WorkspaceManagerModule } from 'src/engine/workspace-manager/workspace-manager.module'; @@ -48,7 +48,7 @@ const jwtModule = JwtModule.registerAsync({ WorkspaceManagerModule, TypeORMModule, TypeOrmModule.forFeature( - [Workspace, User, RefreshToken, FeatureFlagEntity], + [Workspace, User, AppToken, FeatureFlagEntity], 'core', ), HttpModule, diff --git a/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts b/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts index 32cfeb057..ad6676c5b 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/auth.resolver.ts @@ -10,6 +10,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { AppTokenInput } from 'src/engine/core-modules/auth/dto/app-token.input'; import { JwtAuthGuard } from 'src/engine/guards/jwt.auth.guard'; import { AuthUser } from 'src/engine/decorators/auth/auth-user.decorator'; import { assert } from 'src/utils/assert'; @@ -34,7 +35,6 @@ import { ExchangeAuthCode } from 'src/engine/core-modules/auth/dto/exchange-auth import { ApiKeyToken, AuthTokens } from './dto/token.entity'; import { TokenService } from './services/token.service'; -import { RefreshTokenInput } from './dto/refresh-token.input'; import { Verify } from './dto/verify.entity'; import { VerifyInput } from './dto/verify.input'; import { AuthService } from './services/auth.service'; @@ -170,13 +170,13 @@ export class AuthResolver { } @Mutation(() => AuthTokens) - async renewToken(@Args() args: RefreshTokenInput): Promise { - if (!args.refreshToken) { + async renewToken(@Args() args: AppTokenInput): Promise { + if (!args.appToken) { throw new BadRequestException('Refresh token is mendatory'); } const tokens = await this.tokenService.generateTokensFromRefreshToken( - args.refreshToken, + args.appToken, ); return { tokens: tokens }; diff --git a/packages/twenty-server/src/engine/core-modules/auth/dto/refresh-token.input.ts b/packages/twenty-server/src/engine/core-modules/auth/dto/app-token.input.ts similarity index 75% rename from packages/twenty-server/src/engine/core-modules/auth/dto/refresh-token.input.ts rename to packages/twenty-server/src/engine/core-modules/auth/dto/app-token.input.ts index efc69d2b2..9345d9e3b 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/dto/refresh-token.input.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/dto/app-token.input.ts @@ -3,9 +3,9 @@ import { ArgsType, Field } from '@nestjs/graphql'; import { IsNotEmpty, IsString } from 'class-validator'; @ArgsType() -export class RefreshTokenInput { +export class AppTokenInput { @Field(() => String) @IsNotEmpty() @IsString() - refreshToken: string; + appToken: string; } diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/token.service.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/services/token.service.spec.ts index fdcad03f6..721c4fa66 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/token.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/token.service.spec.ts @@ -3,7 +3,7 @@ import { JwtService } from '@nestjs/jwt'; import { getRepositoryToken } from '@nestjs/typeorm'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { User } from 'src/engine/core-modules/user/user.entity'; import { JwtAuthStrategy } from 'src/engine/core-modules/auth/strategies/jwt.auth.strategy'; import { EmailService } from 'src/engine/integrations/email/email.service'; @@ -39,7 +39,7 @@ describe('TokenService', () => { useValue: {}, }, { - provide: getRepositoryToken(RefreshToken, 'core'), + provide: getRepositoryToken(AppToken, 'core'), useValue: {}, }, { diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/token.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/token.service.ts index f922380ad..241dcee94 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/token.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/token.service.ts @@ -34,7 +34,10 @@ import { } from 'src/engine/core-modules/auth/dto/token.entity'; import { EnvironmentService } from 'src/engine/integrations/environment/environment.service'; import { User } from 'src/engine/core-modules/user/user.entity'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { + AppToken, + AppTokenType, +} from 'src/engine/core-modules/app-token/app-token.entity'; import { ValidatePasswordResetToken } from 'src/engine/core-modules/auth/dto/validate-password-reset-token.entity'; import { EmailService } from 'src/engine/integrations/email/email.service'; import { InvalidatePassword } from 'src/engine/core-modules/auth/dto/invalidate-password.entity'; @@ -53,8 +56,8 @@ export class TokenService { private readonly environmentService: EnvironmentService, @InjectRepository(User, 'core') private readonly userRepository: Repository, - @InjectRepository(RefreshToken, 'core') - private readonly refreshTokenRepository: Repository, + @InjectRepository(AppToken, 'core') + private readonly appTokenRepository: Repository, @InjectRepository(Workspace, 'core') private readonly workspaceRepository: Repository, private readonly emailService: EmailService, @@ -103,15 +106,15 @@ export class TokenService { const refreshTokenPayload = { userId, expiresAt, + type: AppTokenType.RefreshToken, }; const jwtPayload = { sub: userId, }; - const refreshToken = - this.refreshTokenRepository.create(refreshTokenPayload); + const refreshToken = this.appTokenRepository.create(refreshTokenPayload); - await this.refreshTokenRepository.save(refreshToken); + await this.appTokenRepository.save(refreshToken); return { token: this.jwtService.sign(jwtPayload, { @@ -360,7 +363,7 @@ export class TokenService { UnprocessableEntityException, ); - const token = await this.refreshTokenRepository.findOneBy({ + const token = await this.appTokenRepository.findOneBy({ id: jwtPayload.jti, }); @@ -379,15 +382,16 @@ export class TokenService { ) { // Revoke all user refresh tokens await Promise.all( - user.refreshTokens.map( - async ({ id }) => - await this.refreshTokenRepository.update( + user.appTokens.map(async ({ id, type }) => { + if (type === AppTokenType.RefreshToken) { + await this.appTokenRepository.update( { id }, { revokedAt: new Date(), }, - ), - ), + ); + } + }), ); throw new ForbiddenException( @@ -408,7 +412,7 @@ export class TokenService { } = await this.verifyRefreshToken(token); // Revoke old refresh token - await this.refreshTokenRepository.update( + await this.appTokenRepository.update( { id, }, diff --git a/packages/twenty-server/src/engine/core-modules/core-engine.module.ts b/packages/twenty-server/src/engine/core-modules/core-engine.module.ts index c61f55b2f..4fa846753 100644 --- a/packages/twenty-server/src/engine/core-modules/core-engine.module.ts +++ b/packages/twenty-server/src/engine/core-modules/core-engine.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module'; import { UserModule } from 'src/engine/core-modules/user/user.module'; -import { RefreshTokenModule } from 'src/engine/core-modules/refresh-token/refresh-token.module'; +import { AppTokenModule } from 'src/engine/core-modules/app-token/app-token.module'; import { AuthModule } from 'src/engine/core-modules/auth/auth.module'; import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module'; import { OpenApiModule } from 'src/engine/core-modules/open-api/open-api.module'; @@ -25,7 +25,7 @@ import { ClientConfigModule } from './client-config/client-config.module'; FeatureFlagModule, FileModule, OpenApiModule, - RefreshTokenModule, + AppTokenModule, TimelineMessagingModule, TimelineCalendarEventModule, UserModule, diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.module.ts b/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.module.ts deleted file mode 100644 index 0e2321895..000000000 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/refresh-token.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { NestjsQueryGraphQLModule } from '@ptc-org/nestjs-query-graphql'; -import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm'; - -import { RefreshToken } from './refresh-token.entity'; -import { refreshTokenAutoResolverOpts } from './refresh-token.auto-resolver-opts'; - -import { RefreshTokenService } from './services/refresh-token.service'; - -@Module({ - imports: [ - NestjsQueryGraphQLModule.forFeature({ - imports: [NestjsQueryTypeOrmModule.forFeature([RefreshToken], 'core')], - services: [RefreshTokenService], - resolvers: refreshTokenAutoResolverOpts, - }), - ], -}) -export class RefreshTokenModule {} diff --git a/packages/twenty-server/src/engine/core-modules/refresh-token/services/refresh-token.service.ts b/packages/twenty-server/src/engine/core-modules/refresh-token/services/refresh-token.service.ts deleted file mode 100644 index 825a33ab5..000000000 --- a/packages/twenty-server/src/engine/core-modules/refresh-token/services/refresh-token.service.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; - -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; - -export class RefreshTokenService extends TypeOrmQueryService {} diff --git a/packages/twenty-server/src/engine/core-modules/user/user.entity.ts b/packages/twenty-server/src/engine/core-modules/user/user.entity.ts index 043c8a191..31ea7c810 100644 --- a/packages/twenty-server/src/engine/core-modules/user/user.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/user/user.entity.ts @@ -11,7 +11,7 @@ import { } from 'typeorm'; import { IDField } from '@ptc-org/nestjs-query-graphql'; -import { RefreshToken } from 'src/engine/core-modules/refresh-token/refresh-token.entity'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceMember } from 'src/engine/core-modules/user/dtos/workspace-member.dto'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; @@ -85,10 +85,10 @@ export class User { @Column({ nullable: true }) passwordResetTokenExpiresAt: Date; - @OneToMany(() => RefreshToken, (refreshToken) => refreshToken.user, { + @OneToMany(() => AppToken, (appToken) => appToken.user, { cascade: true, }) - refreshTokens: RefreshToken[]; + appTokens: AppToken[]; @Field(() => WorkspaceMember, { nullable: true }) workspaceMember: WorkspaceMember; diff --git a/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts b/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts index e560fcf41..dd9f4bc3c 100644 --- a/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts +++ b/packages/twenty-server/src/engine/core-modules/workspace/workspace.entity.ts @@ -15,6 +15,7 @@ import { User } from 'src/engine/core-modules/user/user.entity'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; import { BillingSubscription } from 'src/engine/core-modules/billing/entities/billing-subscription.entity'; import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; +import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; @Entity({ name: 'workspace', schema: 'core' }) @ObjectType('Workspace') @@ -55,6 +56,11 @@ export class Workspace { @UpdateDateColumn({ type: 'timestamp with time zone' }) updatedAt: Date; + @OneToMany(() => AppToken, (appToken) => appToken.workspace, { + cascade: true, + }) + appTokens: AppToken[]; + @OneToMany(() => User, (user) => user.defaultWorkspace) users: User[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/hooks/before-create-one-object.hook.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/hooks/before-create-one-object.hook.ts index 5d9960f27..48f3ec23e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/hooks/before-create-one-object.hook.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/hooks/before-create-one-object.hook.ts @@ -13,7 +13,7 @@ import { CreateObjectInput } from 'src/engine/metadata-modules/object-metadata/d const coreObjectNames = [ 'featureFlag', - 'refreshToken', + 'appToken', 'workspace', 'user', 'event',