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:
parent
5bec8ea508
commit
1f2d47bd91
@ -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,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -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,
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user