Compare commits

...
Author SHA1 Message Date
neo773 568c562a25 fix sendVerificationEmail 2026-05-07 12:44:11 +05:30
3 changed files with 21 additions and 4 deletions
@@ -17,6 +17,7 @@ import {
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { BeforeCreateOneAppToken } from 'src/engine/core-modules/app-token/hooks/before-create-one-app-token.hook';
import { EmailVerificationTrigger } from 'src/engine/core-modules/email-verification/email-verification.constants';
import { UserEntity } from 'src/engine/core-modules/user/user.entity';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
@@ -97,5 +98,6 @@ export class AppTokenEntity {
clientId?: string;
codeChallenge?: string;
scope?: string;
verificationTrigger?: EmailVerificationTrigger;
} | null;
}
@@ -17,6 +17,7 @@ import {
EmailVerificationException,
EmailVerificationExceptionCode,
} from 'src/engine/core-modules/email-verification/email-verification.exception';
import { EmailVerificationTrigger } from 'src/engine/core-modules/email-verification/email-verification.constants';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { UserEntity } from 'src/engine/core-modules/user/user.entity';
@@ -30,7 +31,11 @@ export class EmailVerificationTokenService {
private readonly twentyConfigService: TwentyConfigService,
) {}
async generateToken(userId: string, email: string): Promise<AuthToken> {
async generateToken(
userId: string,
email: string,
verificationTrigger: EmailVerificationTrigger = EmailVerificationTrigger.SIGN_UP,
): Promise<AuthToken> {
const expiresIn = this.twentyConfigService.get(
'EMAIL_VERIFICATION_TOKEN_EXPIRES_IN',
);
@@ -47,7 +52,7 @@ export class EmailVerificationTokenService {
expiresAt,
type: AppTokenType.EmailVerificationToken,
value: hashedToken,
context: { email },
context: { email, verificationTrigger },
});
await this.appTokenRepository.save(verificationToken);
@@ -64,7 +64,11 @@ export class EmailVerificationService {
}
const { token: emailVerificationToken } =
await this.emailVerificationTokenService.generateToken(userId, email);
await this.emailVerificationTokenService.generateToken(
userId,
email,
verificationTrigger,
);
const linkPathnameAndSearchParams = {
pathname: AppPath.VerifyEmail,
@@ -167,7 +171,13 @@ export class EmailVerificationService {
EmailVerificationExceptionCode.RATE_LIMIT_EXCEEDED,
);
}
}
const verificationTrigger =
existingToken?.context?.verificationTrigger ??
EmailVerificationTrigger.SIGN_UP;
if (existingToken) {
await this.appTokenRepository.delete(existingToken.id);
}
@@ -176,7 +186,7 @@ export class EmailVerificationService {
email,
workspace,
locale,
verificationTrigger: EmailVerificationTrigger.SIGN_UP,
verificationTrigger,
});
return { success: true };