From 1462b192854637e2a89ff71ccba0b5344c01c1d9 Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Tue, 2 Jun 2026 15:20:15 +0000 Subject: [PATCH] feat: add createdAt timestamp to email verification and password reset entities --- .../entities/email/email-verification.entity.ts | 3 +++ ...-verification-custom-repository-extension.ts | 4 ++++ .../user/user-password/password-reset.entity.ts | 3 +++ ...user-password-custom-repository-extension.ts | 4 ++++ ...PasswordResetAndEmailVerificationEntities.ts | 17 +++++++++++++++++ 5 files changed, 31 insertions(+) create mode 100644 backend/src/migrations/1780411916141-AddCreatedAtColumnsIntoPasswordResetAndEmailVerificationEntities.ts diff --git a/backend/src/entities/email/email-verification.entity.ts b/backend/src/entities/email/email-verification.entity.ts index 072506dbb..cd9b6474b 100644 --- a/backend/src/entities/email/email-verification.entity.ts +++ b/backend/src/entities/email/email-verification.entity.ts @@ -9,6 +9,9 @@ export class EmailVerificationEntity { @Column({ default: null }) verification_string: string; + @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' }) + createdAt: Date; + @OneToOne( () => UserEntity, (user) => user.email_verification, diff --git a/backend/src/entities/email/repository/email-verification-custom-repository-extension.ts b/backend/src/entities/email/repository/email-verification-custom-repository-extension.ts index 639cb481a..9731f6d0c 100644 --- a/backend/src/entities/email/repository/email-verification-custom-repository-extension.ts +++ b/backend/src/entities/email/repository/email-verification-custom-repository-extension.ts @@ -1,3 +1,4 @@ +import { Constants } from '../../../helpers/constants/constants.js'; import { Encryptor } from '../../../helpers/encryption/encryptor.js'; import { UserEntity } from '../../user/user.entity.js'; import { EmailVerificationEntity } from '../email-verification.entity.js'; @@ -8,6 +9,9 @@ export const emailVerificationRepositoryExtension = { .leftJoinAndSelect('email_verification.user', 'user') .where('email_verification.verification_string = :ver_string', { ver_string: verificationString, + }) + .andWhere('email_verification.createdAt >= :valid_after', { + valid_after: Constants.ONE_DAY_AGO(), }); return await qb.getOne(); }, diff --git a/backend/src/entities/user/user-password/password-reset.entity.ts b/backend/src/entities/user/user-password/password-reset.entity.ts index b6e9d6a69..2ba990b51 100644 --- a/backend/src/entities/user/user-password/password-reset.entity.ts +++ b/backend/src/entities/user/user-password/password-reset.entity.ts @@ -9,6 +9,9 @@ export class PasswordResetEntity { @Column({ default: null }) verification_string: string; + @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' }) + createdAt: Date; + @OneToOne( () => UserEntity, (user) => user.password_reset, diff --git a/backend/src/entities/user/user-password/repository/user-password-custom-repository-extension.ts b/backend/src/entities/user/user-password/repository/user-password-custom-repository-extension.ts index af0c03b5f..b508ea3b0 100644 --- a/backend/src/entities/user/user-password/repository/user-password-custom-repository-extension.ts +++ b/backend/src/entities/user/user-password/repository/user-password-custom-repository-extension.ts @@ -1,3 +1,4 @@ +import { Constants } from '../../../../helpers/constants/constants.js'; import { Encryptor } from '../../../../helpers/encryption/encryptor.js'; import { UserEntity } from '../../user.entity.js'; import { PasswordResetEntity } from '../password-reset.entity.js'; @@ -8,6 +9,9 @@ export const userPasswordResetCustomRepositoryExtension = { .leftJoinAndSelect('password_reset.user', 'user') .where('password_reset.verification_string = :ver_string', { ver_string: verificationString, + }) + .andWhere('password_reset.createdAt >= :valid_after', { + valid_after: Constants.ONE_DAY_AGO(), }); return await qb.getOne(); }, diff --git a/backend/src/migrations/1780411916141-AddCreatedAtColumnsIntoPasswordResetAndEmailVerificationEntities.ts b/backend/src/migrations/1780411916141-AddCreatedAtColumnsIntoPasswordResetAndEmailVerificationEntities.ts new file mode 100644 index 000000000..028820025 --- /dev/null +++ b/backend/src/migrations/1780411916141-AddCreatedAtColumnsIntoPasswordResetAndEmailVerificationEntities.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddCreatedAtColumnsIntoPasswordResetAndEmailVerificationEntities1780411916141 + implements MigrationInterface +{ + name = 'AddCreatedAtColumnsIntoPasswordResetAndEmailVerificationEntities1780411916141'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "email_verification" ADD "createdAt" TIMESTAMP NOT NULL DEFAULT now()`); + await queryRunner.query(`ALTER TABLE "password_reset" ADD "createdAt" TIMESTAMP NOT NULL DEFAULT now()`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "password_reset" DROP COLUMN "createdAt"`); + await queryRunner.query(`ALTER TABLE "email_verification" DROP COLUMN "createdAt"`); + } +}