diff --git a/packages/data-schemas/src/methods/token.spec.ts b/packages/data-schemas/src/methods/token.spec.ts index 9658c7976a..e6cf56d18d 100644 --- a/packages/data-schemas/src/methods/token.spec.ts +++ b/packages/data-schemas/src/methods/token.spec.ts @@ -418,6 +418,41 @@ describe('Token Methods - Detailed Tests', () => { expect(updated).toBeNull(); }); + + test('should update expiresAt when expiresIn is provided', async () => { + const beforeUpdate = Date.now(); + const newExpiresIn = 7200; + + const updated = await methods.updateToken( + { token: 'update-token' }, + { expiresIn: newExpiresIn }, + ); + + const afterUpdate = Date.now(); + + expect(updated).toBeDefined(); + expect(updated?.expiresAt).toBeDefined(); + + const expectedMinExpiry = beforeUpdate + newExpiresIn * 1000; + const expectedMaxExpiry = afterUpdate + newExpiresIn * 1000; + + expect(updated!.expiresAt.getTime()).toBeGreaterThanOrEqual(expectedMinExpiry); + expect(updated!.expiresAt.getTime()).toBeLessThanOrEqual(expectedMaxExpiry); + }); + + test('should not modify expiresAt when expiresIn is not provided', async () => { + const original = await Token.findOne({ token: 'update-token' }); + const originalExpiresAt = original!.expiresAt.getTime(); + + const updated = await methods.updateToken( + { token: 'update-token' }, + { email: 'changed@example.com' }, + ); + + expect(updated).toBeDefined(); + expect(updated?.email).toBe('changed@example.com'); + expect(updated!.expiresAt.getTime()).toBe(originalExpiresAt); + }); }); describe('deleteTokens', () => { diff --git a/packages/data-schemas/src/methods/token.ts b/packages/data-schemas/src/methods/token.ts index e595067e6e..95fb57e426 100644 --- a/packages/data-schemas/src/methods/token.ts +++ b/packages/data-schemas/src/methods/token.ts @@ -35,7 +35,13 @@ export function createTokenMethods(mongoose: typeof import('mongoose')) { ): Promise { try { const Token = mongoose.models.Token; - return await Token.findOneAndUpdate(query, updateData, { new: true }); + + const dataToUpdate = { ...updateData }; + if (updateData?.expiresIn !== undefined) { + dataToUpdate.expiresAt = new Date(Date.now() + updateData.expiresIn * 1000); + } + + return await Token.findOneAndUpdate(query, dataToUpdate, { new: true }); } catch (error) { logger.debug('An error occurred while updating token:', error); throw error; diff --git a/packages/data-schemas/src/types/token.ts b/packages/data-schemas/src/types/token.ts index 43fb808ebf..e71958a1d9 100644 --- a/packages/data-schemas/src/types/token.ts +++ b/packages/data-schemas/src/types/token.ts @@ -34,6 +34,7 @@ export interface TokenUpdateData { identifier?: string; token?: string; expiresAt?: Date; + expiresIn?: number; metadata?: Map; }