1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-04 00:18:01 +01:00

fix: on project delete with tokens put token deleted in audit log (#7675)

Use service with audit tracking instead of store directly.
This commit is contained in:
Tymoteusz Czech 2024-07-26 14:06:15 +02:00 committed by GitHub
parent 5bec8ea508
commit 1f2d47bd91
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 24 additions and 24 deletions

View File

@ -5,6 +5,7 @@ import { AccountStore } from '../../db/account-store';
import EnvironmentStore from '../project-environments/environment-store'; import EnvironmentStore from '../project-environments/environment-store';
import { import {
type AccessService, type AccessService,
ApiTokenService,
EventService, EventService,
FavoritesService, FavoritesService,
GroupService, GroupService,
@ -39,8 +40,6 @@ import {
createPrivateProjectChecker, createPrivateProjectChecker,
} from '../private-project/createPrivateProjectChecker'; } from '../private-project/createPrivateProjectChecker';
import FakeFeatureTagStore from '../../../test/fixtures/fake-feature-tag-store'; import FakeFeatureTagStore from '../../../test/fixtures/fake-feature-tag-store';
import FeatureTypeStore from '../../db/feature-type-store';
import FakeFeatureTypeStore from '../../../test/fixtures/fake-feature-type-store';
import { ProjectOwnersReadModel } from './project-owners-read-model'; import { ProjectOwnersReadModel } from './project-owners-read-model';
import { FakeProjectOwnersReadModel } from './fake-project-owners-read-model'; import { FakeProjectOwnersReadModel } from './fake-project-owners-read-model';
import { FakeProjectFlagCreatorsReadModel } from './fake-project-flag-creators-read-model'; import { FakeProjectFlagCreatorsReadModel } from './fake-project-flag-creators-read-model';
@ -76,7 +75,6 @@ export const createProjectService = (
eventBus, eventBus,
getLogger, getLogger,
); );
const featureTypeStore = new FeatureTypeStore(db, getLogger);
const projectStatsStore = new ProjectStatsStore(db, eventBus, getLogger); const projectStatsStore = new ProjectStatsStore(db, eventBus, getLogger);
const accessService: AccessService = createAccessService(db, config); const accessService: AccessService = createAccessService(db, config);
const featureToggleService = createFeatureToggleService(db, config); const featureToggleService = createFeatureToggleService(db, config);
@ -120,6 +118,12 @@ export const createProjectService = (
const privateProjectChecker = createPrivateProjectChecker(db, config); const privateProjectChecker = createPrivateProjectChecker(db, config);
const apiTokenService = new ApiTokenService(
{ apiTokenStore, environmentStore },
config,
eventService,
);
return new ProjectService( return new ProjectService(
{ {
projectStore, projectStore,
@ -127,12 +131,10 @@ export const createProjectService = (
featureToggleStore, featureToggleStore,
environmentStore, environmentStore,
featureEnvironmentStore, featureEnvironmentStore,
featureTypeStore,
accountStore, accountStore,
projectStatsStore, projectStatsStore,
projectOwnersReadModel, projectOwnersReadModel,
projectFlagCreatorsReadModel, projectFlagCreatorsReadModel,
apiTokenStore,
}, },
config, config,
accessService, accessService,
@ -141,6 +143,7 @@ export const createProjectService = (
favoriteService, favoriteService,
eventService, eventService,
privateProjectChecker, privateProjectChecker,
apiTokenService,
); );
}; };
@ -157,7 +160,6 @@ export const createFakeProjectService = (
const accountStore = new FakeAccountStore(); const accountStore = new FakeAccountStore();
const environmentStore = new FakeEnvironmentStore(); const environmentStore = new FakeEnvironmentStore();
const featureEnvironmentStore = new FakeFeatureEnvironmentStore(); const featureEnvironmentStore = new FakeFeatureEnvironmentStore();
const featureTypeStore = new FakeFeatureTypeStore();
const projectStatsStore = new FakeProjectStatsStore(); const projectStatsStore = new FakeProjectStatsStore();
const { accessService } = createFakeAccessService(config); const { accessService } = createFakeAccessService(config);
const { featureToggleService } = createFakeFeatureToggleService(config); const { featureToggleService } = createFakeFeatureToggleService(config);
@ -187,6 +189,12 @@ export const createFakeProjectService = (
const privateProjectChecker = createFakePrivateProjectChecker(); const privateProjectChecker = createFakePrivateProjectChecker();
const apiTokenService = new ApiTokenService(
{ apiTokenStore, environmentStore },
config,
eventService,
);
return new ProjectService( return new ProjectService(
{ {
projectStore, projectStore,
@ -196,10 +204,8 @@ export const createFakeProjectService = (
featureToggleStore, featureToggleStore,
environmentStore, environmentStore,
featureEnvironmentStore, featureEnvironmentStore,
featureTypeStore,
accountStore, accountStore,
projectStatsStore, projectStatsStore,
apiTokenStore,
}, },
config, config,
accessService, accessService,
@ -208,5 +214,6 @@ export const createFakeProjectService = (
favoriteService, favoriteService,
eventService, eventService,
privateProjectChecker, privateProjectChecker,
apiTokenService,
); );
}; };

View File

@ -1,7 +1,7 @@
import type { IAuditUser, IFlagResolver, IUnleashConfig } from '../../types'; import type { IAuditUser, IFlagResolver, IUnleashConfig } from '../../types';
import getLogger from '../../../test/fixtures/no-logger';
import { createFakeProjectService } from './createProjectService'; import { createFakeProjectService } from './createProjectService';
import type { IUser } from '../../types'; import type { IUser } from '../../types';
import { createTestConfig } from '../../../test/config/test-config';
const alwaysOnFlagResolver = { const alwaysOnFlagResolver = {
isEnabled() { isEnabled() {
@ -12,7 +12,7 @@ const alwaysOnFlagResolver = {
test('Should not allow to exceed project limit', async () => { test('Should not allow to exceed project limit', async () => {
const LIMIT = 1; const LIMIT = 1;
const projectService = createFakeProjectService({ const projectService = createFakeProjectService({
getLogger, ...createTestConfig(),
flagResolver: alwaysOnFlagResolver, flagResolver: alwaysOnFlagResolver,
resourceLimits: { resourceLimits: {
projects: LIMIT, projects: LIMIT,

View File

@ -22,7 +22,6 @@ import {
type IFeatureEnvironmentStore, type IFeatureEnvironmentStore,
type IFeatureNaming, type IFeatureNaming,
type IFeatureToggleStore, type IFeatureToggleStore,
type IFeatureTypeStore,
type IFlagResolver, type IFlagResolver,
type IProject, type IProject,
type IProjectApplications, type IProjectApplications,
@ -53,7 +52,6 @@ import {
type ProjectCreated, type ProjectCreated,
type IProjectOwnersReadModel, type IProjectOwnersReadModel,
ADMIN, ADMIN,
type IApiTokenStore,
} from '../../types'; } from '../../types';
import type { import type {
IProjectAccessModel, IProjectAccessModel,
@ -86,6 +84,7 @@ import type {
import type { IProjectFlagCreatorsReadModel } from './project-flag-creators-read-model.type'; import type { IProjectFlagCreatorsReadModel } from './project-flag-creators-read-model.type';
import { throwExceedsLimitError } from '../../error/exceeds-limit-error'; import { throwExceedsLimitError } from '../../error/exceeds-limit-error';
import type EventEmitter from 'events'; import type EventEmitter from 'events';
import type { ApiTokenService } from '../../services/api-token-service';
type Days = number; type Days = number;
type Count = number; type Count = number;
@ -132,8 +131,6 @@ export default class ProjectService {
private featureEnvironmentStore: IFeatureEnvironmentStore; private featureEnvironmentStore: IFeatureEnvironmentStore;
private featureTypeStore: IFeatureTypeStore;
private environmentStore: IEnvironmentStore; private environmentStore: IEnvironmentStore;
private groupService: GroupService; private groupService: GroupService;
@ -146,7 +143,7 @@ export default class ProjectService {
private accountStore: IAccountStore; private accountStore: IAccountStore;
private apiTokenStore: IApiTokenStore; private apiTokenService: ApiTokenService;
private favoritesService: FavoritesService; private favoritesService: FavoritesService;
@ -171,10 +168,8 @@ export default class ProjectService {
featureToggleStore, featureToggleStore,
environmentStore, environmentStore,
featureEnvironmentStore, featureEnvironmentStore,
featureTypeStore,
accountStore, accountStore,
projectStatsStore, projectStatsStore,
apiTokenStore,
}: Pick< }: Pick<
IUnleashStores, IUnleashStores,
| 'projectStore' | 'projectStore'
@ -186,8 +181,6 @@ export default class ProjectService {
| 'featureEnvironmentStore' | 'featureEnvironmentStore'
| 'accountStore' | 'accountStore'
| 'projectStatsStore' | 'projectStatsStore'
| 'featureTypeStore'
| 'apiTokenStore'
>, >,
config: IUnleashConfig, config: IUnleashConfig,
accessService: AccessService, accessService: AccessService,
@ -196,6 +189,7 @@ export default class ProjectService {
favoriteService: FavoritesService, favoriteService: FavoritesService,
eventService: EventService, eventService: EventService,
privateProjectChecker: IPrivateProjectChecker, privateProjectChecker: IPrivateProjectChecker,
apiTokenService: ApiTokenService,
) { ) {
this.projectStore = projectStore; this.projectStore = projectStore;
this.projectOwnersReadModel = projectOwnersReadModel; this.projectOwnersReadModel = projectOwnersReadModel;
@ -205,8 +199,7 @@ export default class ProjectService {
this.accessService = accessService; this.accessService = accessService;
this.eventStore = eventStore; this.eventStore = eventStore;
this.featureToggleStore = featureToggleStore; this.featureToggleStore = featureToggleStore;
this.featureTypeStore = featureTypeStore; this.apiTokenService = apiTokenService;
this.apiTokenStore = apiTokenStore;
this.featureToggleService = featureToggleService; this.featureToggleService = featureToggleService;
this.favoritesService = favoriteService; this.favoritesService = favoriteService;
this.privateProjectChecker = privateProjectChecker; this.privateProjectChecker = privateProjectChecker;
@ -565,14 +558,14 @@ export default class ProjectService {
archived: true, archived: true,
}); });
this.featureToggleService.deleteFeatures( await this.featureToggleService.deleteFeatures(
archivedFlags.map((flag) => flag.name), archivedFlags.map((flag) => flag.name),
id, id,
auditUser, auditUser,
); );
if (this.flagResolver.isEnabled('cleanApiTokenWhenOrphaned')) { if (this.flagResolver.isEnabled('cleanApiTokenWhenOrphaned')) {
const allTokens = await this.apiTokenStore.getAll(); const allTokens = await this.apiTokenService.getAllTokens();
const projectTokens = allTokens.filter( const projectTokens = allTokens.filter(
(token) => (token) =>
(token.projects && (token.projects &&
@ -585,7 +578,7 @@ export default class ProjectService {
await Promise.all( await Promise.all(
projectTokens.map((token) => projectTokens.map((token) =>
this.apiTokenStore.delete(token.secret), this.apiTokenService.delete(token.secret, auditUser),
), ),
); );
} else { } else {