mirror of
https://github.com/Unleash/unleash.git
synced 2025-07-26 13:48:33 +02:00
refactor: introduce countProjectTokens
method on ApiTokenStore (#8674)
This change introduces a new method `countProjectTokens` on the `IApiTokenStore` interface. It also swaps out the manual filtering for api tokens belonging to a project in the project status service.
This commit is contained in:
parent
7c28d247d8
commit
c70c023143
@ -326,4 +326,12 @@ export class ApiTokenStore implements IApiTokenStore {
|
||||
activeLegacyTokens,
|
||||
};
|
||||
}
|
||||
|
||||
async countProjectTokens(projectId: string): Promise<number> {
|
||||
const count = await this.db(API_LINK_TABLE)
|
||||
.where({ project: projectId })
|
||||
.count()
|
||||
.first();
|
||||
return Number(count?.count ?? 0);
|
||||
}
|
||||
}
|
||||
|
@ -38,17 +38,7 @@ export class ProjectStatusService {
|
||||
] = await Promise.all([
|
||||
this.projectStore.getConnectedEnvironmentCountForProject(projectId),
|
||||
this.projectStore.getMembersCountByProject(projectId),
|
||||
this.apiTokenStore
|
||||
.getAll()
|
||||
.then(
|
||||
(tokens) =>
|
||||
tokens.filter(
|
||||
(token) =>
|
||||
token.project === projectId ||
|
||||
token.projects.includes(projectId),
|
||||
).length,
|
||||
),
|
||||
|
||||
this.apiTokenStore.countProjectTokens(projectId),
|
||||
this.segmentStore.getProjectSegmentCount(projectId),
|
||||
this.eventStore.getProjectRecentEventActivity(projectId),
|
||||
]);
|
||||
|
@ -14,4 +14,5 @@ export interface IApiTokenStore extends Store<IApiToken, string> {
|
||||
legacyTokens: number;
|
||||
activeLegacyTokens: number;
|
||||
}>;
|
||||
countProjectTokens(projectId: string): Promise<number>;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ import dbInit, { type ITestDb } from '../helpers/database-init';
|
||||
import getLogger from '../../fixtures/no-logger';
|
||||
import type { IUnleashStores } from '../../../lib/types';
|
||||
import { ApiTokenType } from '../../../lib/types/models/api-token';
|
||||
import { randomId } from '../../../lib/util';
|
||||
|
||||
let stores: IUnleashStores;
|
||||
let db: ITestDb;
|
||||
@ -182,3 +183,46 @@ describe('count deprecated tokens', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('count project tokens', () => {
|
||||
test('counts only tokens belonging to the specified project', async () => {
|
||||
const project = await stores.projectStore.create({
|
||||
id: randomId(),
|
||||
name: 'project A',
|
||||
});
|
||||
|
||||
const store = stores.apiTokenStore;
|
||||
await store.insert({
|
||||
secret: `default:default.${randomId()}`,
|
||||
environment: 'default',
|
||||
type: ApiTokenType.CLIENT,
|
||||
projects: ['default'],
|
||||
tokenName: 'token1',
|
||||
});
|
||||
await store.insert({
|
||||
secret: `*:*.${randomId()}`,
|
||||
environment: 'default',
|
||||
type: ApiTokenType.CLIENT,
|
||||
projects: ['*'],
|
||||
tokenName: 'token2',
|
||||
});
|
||||
|
||||
await store.insert({
|
||||
secret: `${project.id}:default.${randomId()}`,
|
||||
environment: 'default',
|
||||
type: ApiTokenType.CLIENT,
|
||||
projects: [project.id],
|
||||
tokenName: 'token3',
|
||||
});
|
||||
|
||||
await store.insert({
|
||||
secret: `[]:default.${randomId()}`,
|
||||
environment: 'default',
|
||||
type: ApiTokenType.CLIENT,
|
||||
projects: [project.id, 'default'],
|
||||
tokenName: 'token4',
|
||||
});
|
||||
|
||||
expect(await store.countProjectTokens(project.id)).toBe(2);
|
||||
});
|
||||
});
|
||||
|
4
src/test/fixtures/fake-api-token-store.ts
vendored
4
src/test/fixtures/fake-api-token-store.ts
vendored
@ -92,4 +92,8 @@ export default class FakeApiTokenStore
|
||||
activeLegacyTokens: 0,
|
||||
};
|
||||
}
|
||||
|
||||
async countProjectTokens(): Promise<number> {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user