From 59510dcb0a3fcc275d4d46e1c1154727516da25d Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Tue, 8 Apr 2025 11:22:07 +0200 Subject: [PATCH] feat: Implement token generation logic on api tokens --- .../__snapshots__/api-token.ee.test.js.snap | 3 -- packages/backend/src/models/api-token.ee.js | 12 +++++-- .../backend/src/models/api-token.ee.test.js | 31 +++++++++++++++++++ .../backend/src/models/api-token.test.ee.js | 12 ------- packages/backend/test/factories/api-token.js | 2 +- 5 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 packages/backend/src/models/api-token.ee.test.js delete mode 100644 packages/backend/src/models/api-token.test.ee.js diff --git a/packages/backend/src/models/__snapshots__/api-token.ee.test.js.snap b/packages/backend/src/models/__snapshots__/api-token.ee.test.js.snap index 6f52bfc8..4fe18729 100644 --- a/packages/backend/src/models/__snapshots__/api-token.ee.test.js.snap +++ b/packages/backend/src/models/__snapshots__/api-token.ee.test.js.snap @@ -12,9 +12,6 @@ exports[`ApiToken model > jsonSchema should have correct validations 1`] = ` "type": "string", }, }, - "required": [ - "token", - ], "type": "object", } `; diff --git a/packages/backend/src/models/api-token.ee.js b/packages/backend/src/models/api-token.ee.js index f5a520d1..aab7506f 100644 --- a/packages/backend/src/models/api-token.ee.js +++ b/packages/backend/src/models/api-token.ee.js @@ -1,17 +1,25 @@ import Base from './base.js'; - +import crypto from 'crypto'; class ApiToken extends Base { static tableName = 'api_tokens'; static jsonSchema = { type: 'object', - required: ['token'], properties: { id: { type: 'string', format: 'uuid' }, token: { type: 'string', minLength: 32 }, }, }; + + async assignToken() { + this.token = crypto.randomBytes(48).toString('hex'); + } + + async $beforeInsert(queryContext) { + await super.$beforeInsert(queryContext); + await this.assignToken(); + } } export default ApiToken; diff --git a/packages/backend/src/models/api-token.ee.test.js b/packages/backend/src/models/api-token.ee.test.js new file mode 100644 index 00000000..c28549f9 --- /dev/null +++ b/packages/backend/src/models/api-token.ee.test.js @@ -0,0 +1,31 @@ +import { describe, it, expect, vi } from 'vitest'; +import ApiToken from './api-token.ee.js'; + +describe('ApiToken model', () => { + it('tableName should return correct name', () => { + expect(ApiToken.tableName).toBe('api_tokens'); + }); + + it('jsonSchema should have correct validations', () => { + expect(ApiToken.jsonSchema).toMatchSnapshot(); + }); + + describe('assignToken', () => { + it('should assign a new token', async () => { + const apiToken = new ApiToken(); + await apiToken.assignToken(); + + expect(apiToken.token).toBeDefined(); + }); + }); + + describe('beforeInsert', () => { + it('should call assignToken method', async () => { + const apiToken = new ApiToken(); + const assignTokenSpy = vi.spyOn(apiToken, 'assignToken'); + + await apiToken.$beforeInsert(); + expect(assignTokenSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/backend/src/models/api-token.test.ee.js b/packages/backend/src/models/api-token.test.ee.js deleted file mode 100644 index 0fcbb806..00000000 --- a/packages/backend/src/models/api-token.test.ee.js +++ /dev/null @@ -1,12 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import ApiToken from './api-token.js'; - -describe('ApiToken model', () => { - it('tableName should return correct name', () => { - expect(ApiToken.tableName).toBe('api_tokens'); - }); - - it('jsonSchema should have correct validations', () => { - expect(ApiToken.jsonSchema).toMatchSnapshot(); - }); -}); diff --git a/packages/backend/test/factories/api-token.js b/packages/backend/test/factories/api-token.js index 7eaac70c..f283e0a3 100644 --- a/packages/backend/test/factories/api-token.js +++ b/packages/backend/test/factories/api-token.js @@ -1,5 +1,5 @@ import crypto from 'crypto'; -import ApiToken from '../../src/models/api-token.js'; +import ApiToken from '../../src/models/api-token.ee.js'; export const createApiToken = async (params = {}) => { params.token = params.token || crypto.randomBytes(48).toString('hex');