Skip to content

Commit 663b169

Browse files
authored
task: enabled in OSS. (#8856)
Hardcode project and environment names to filter by when OSS
1 parent a454e14 commit 663b169

22 files changed

+284
-89
lines changed

src/lib/__snapshots__/create-config.test.ts.snap

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ exports[`should create default config 1`] = `
8585
},
8686
"inlineSegmentConstraints": true,
8787
"isEnterprise": false,
88+
"isOss": false,
8889
"listen": {
8990
"host": undefined,
9091
"port": 4242,

src/lib/create-config.ts

+5
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,10 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig {
620620
Boolean(options.enterpriseVersion) &&
621621
ui.environment?.toLowerCase() !== 'pro';
622622

623+
const isTest = process.env.NODE_ENV === 'test';
624+
const isOss = isTest
625+
? options.isOss || false
626+
: !isEnterprise && ui.environment !== 'pro';
623627
const metricsRateLimiting = loadMetricsRateLimitingConfig(options);
624628

625629
const rateLimiting = loadRateLimitingConfig(options);
@@ -760,6 +764,7 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig {
760764
publicFolder: options.publicFolder,
761765
disableScheduler: options.disableScheduler,
762766
isEnterprise: isEnterprise,
767+
isOss: isOss,
763768
metricsRateLimiting,
764769
rateLimiting,
765770
feedbackUriPath,

src/lib/db/feature-environment-store.ts

+29-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import type {
33
FeatureEnvironmentKey,
44
IFeatureEnvironmentStore,
55
} from '../types/stores/feature-environment-store';
6-
import type { Logger, LogProvider } from '../logger';
6+
import type { Logger } from '../logger';
77
import metricsHelper from '../util/metrics-helper';
88
import { DB_TIME } from '../metric-events';
99
import type { IFeatureEnvironment, IVariant } from '../types/model';
1010
import NotFoundError from '../error/notfound-error';
1111
import { v4 as uuidv4 } from 'uuid';
1212
import type { Db } from './db';
13+
import type { IUnleashConfig } from '../types';
1314

1415
const T = {
1516
featureEnvs: 'feature_environments',
@@ -36,14 +37,20 @@ export class FeatureEnvironmentStore implements IFeatureEnvironmentStore {
3637

3738
private readonly timer: Function;
3839

39-
constructor(db: Db, eventBus: EventEmitter, getLogger: LogProvider) {
40+
private readonly isOss: boolean;
41+
constructor(
42+
db: Db,
43+
eventBus: EventEmitter,
44+
{ getLogger, isOss }: Pick<IUnleashConfig, 'getLogger' | 'isOss'>,
45+
) {
4046
this.db = db;
4147
this.logger = getLogger('feature-environment-store.ts');
4248
this.timer = (action) =>
4349
metricsHelper.wrapTimer(eventBus, DB_TIME, {
4450
store: 'feature-environments',
4551
action,
4652
});
53+
this.isOss = isOss;
4754
}
4855

4956
async delete({
@@ -96,11 +103,30 @@ export class FeatureEnvironmentStore implements IFeatureEnvironmentStore {
96103
);
97104
}
98105

106+
addOssFilterIfNeeded(queryBuilder) {
107+
if (this.isOss) {
108+
return queryBuilder
109+
.join(
110+
'environments',
111+
'environments.name',
112+
'=',
113+
`${T.featureEnvs}.environment`,
114+
)
115+
.whereIn('environments.name', [
116+
'default',
117+
'development',
118+
'production',
119+
]);
120+
}
121+
return queryBuilder;
122+
}
123+
99124
async getAll(query?: Object): Promise<IFeatureEnvironment[]> {
100125
let rows = this.db(T.featureEnvs);
101126
if (query) {
102127
rows = rows.where(query);
103128
}
129+
this.addOssFilterIfNeeded(rows);
104130
return (await rows).map((r) => ({
105131
enabled: r.enabled,
106132
featureName: r.feature_name,
@@ -119,6 +145,7 @@ export class FeatureEnvironmentStore implements IFeatureEnvironmentStore {
119145
if (environment) {
120146
rows = rows.where({ environment });
121147
}
148+
this.addOssFilterIfNeeded(rows);
122149
return (await rows).map((r) => ({
123150
enabled: r.enabled,
124151
featureName: r.feature_name,

src/lib/db/index.ts

+4-10
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,7 @@ export const createStores = (
9494
settingStore: new SettingStore(db, getLogger),
9595
userStore: new UserStore(db, getLogger, config.flagResolver),
9696
accountStore: new AccountStore(db, getLogger),
97-
projectStore: new ProjectStore(
98-
db,
99-
eventBus,
100-
getLogger,
101-
config.flagResolver,
102-
),
97+
projectStore: new ProjectStore(db, eventBus, config),
10398
tagStore: new TagStore(db, eventBus, getLogger),
10499
tagTypeStore: new TagTypeStore(db, eventBus, getLogger),
105100
addonStore: new AddonStore(db, eventBus, getLogger),
@@ -122,15 +117,14 @@ export const createStores = (
122117
clientFeatureToggleStore: new FeatureToggleClientStore(
123118
db,
124119
eventBus,
125-
getLogger,
126-
config.flagResolver,
120+
config,
127121
),
128-
environmentStore: new EnvironmentStore(db, eventBus, getLogger),
122+
environmentStore: new EnvironmentStore(db, eventBus, config),
129123
featureTagStore: new FeatureTagStore(db, eventBus, getLogger),
130124
featureEnvironmentStore: new FeatureEnvironmentStore(
131125
db,
132126
eventBus,
133-
getLogger,
127+
config,
134128
),
135129
userSplashStore: new UserSplashStore(db, eventBus, getLogger),
136130
roleStore: new RoleStore(db, eventBus, getLogger),

src/lib/features/access/createAccessService.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export const createAccessService = (
2525
const groupStore = new GroupStore(db);
2626
const accountStore = new AccountStore(db, getLogger);
2727
const roleStore = new RoleStore(db, eventBus, getLogger);
28-
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
28+
const environmentStore = new EnvironmentStore(db, eventBus, config);
2929
const accessStore = new AccessStore(db, eventBus, getLogger);
3030
const eventService = createEventsService(db, config);
3131
const groupService = new GroupService(

src/lib/features/api-tokens/createApiTokenService.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const createApiTokenService = (
2121
getLogger,
2222
config.flagResolver,
2323
);
24-
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
24+
const environmentStore = new EnvironmentStore(db, eventBus, config);
2525
const eventService = createEventsService(db, config);
2626

2727
return new ApiTokenService(

src/lib/features/client-feature-toggles/client-feature-toggle-store.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { Knex } from 'knex';
22
import metricsHelper from '../../util/metrics-helper';
33
import { DB_TIME } from '../../metric-events';
4-
import type { Logger, LogProvider } from '../../logger';
4+
import type { Logger } from '../../logger';
55
import type {
66
IFeatureToggleClient,
77
IFeatureToggleClientStore,
88
IFeatureToggleQuery,
99
IFlagResolver,
1010
IStrategyConfig,
1111
ITag,
12+
IUnleashConfig,
1213
PartialDeep,
1314
} from '../../types';
1415
import {
@@ -46,11 +47,16 @@ export default class FeatureToggleClientStore
4647

4748
private flagResolver: IFlagResolver;
4849

50+
private readonly isOss: boolean;
51+
4952
constructor(
5053
db: Db,
5154
eventBus: EventEmitter,
52-
getLogger: LogProvider,
53-
flagResolver: IFlagResolver,
55+
{
56+
getLogger,
57+
flagResolver,
58+
isOss,
59+
}: Pick<IUnleashConfig, 'getLogger' | 'flagResolver' | 'isOss'>,
5460
) {
5561
this.db = db;
5662
this.logger = getLogger('feature-toggle-client-store.ts');
@@ -60,6 +66,7 @@ export default class FeatureToggleClientStore
6066
action,
6167
});
6268
this.flagResolver = flagResolver;
69+
this.isOss = isOss;
6370
}
6471

6572
private async getAll({
@@ -72,7 +79,6 @@ export default class FeatureToggleClientStore
7279
const isPlayground = requestType === 'playground';
7380
const environment = featureQuery?.environment || DEFAULT_ENV;
7481
const stopTimer = this.timer(`getAllBy${requestType}`);
75-
7682
let selectColumns = [
7783
'features.name as name',
7884
'features.description as description',
@@ -103,6 +109,10 @@ export default class FeatureToggleClientStore
103109

104110
let query = this.db('features')
105111
.modify(FeatureToggleStore.filterByArchived, archived)
112+
.modify(
113+
FeatureToggleStore.filterByProjectsAccessibleByOss,
114+
this.isOss,
115+
)
106116
.leftJoin(
107117
this.db('feature_strategies')
108118
.select('*')

src/lib/features/client-feature-toggles/createClientFeatureToggleService.ts

+4-9
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@ export const createClientFeatureToggleService = (
1010
db: Db,
1111
config: IUnleashConfig,
1212
): ClientFeatureToggleService => {
13-
const { getLogger, eventBus, flagResolver } = config;
14-
1513
const featureToggleClientStore = new FeatureToggleClientStore(
1614
db,
17-
eventBus,
18-
getLogger,
19-
flagResolver,
15+
config.eventBus,
16+
config,
2017
);
2118

2219
const segmentReadModel = new SegmentReadModel(db);
@@ -26,7 +23,7 @@ export const createClientFeatureToggleService = (
2623
clientFeatureToggleStore: featureToggleClientStore,
2724
},
2825
segmentReadModel,
29-
{ getLogger, flagResolver },
26+
config,
3027
);
3128

3229
return clientFeatureToggleService;
@@ -35,8 +32,6 @@ export const createClientFeatureToggleService = (
3532
export const createFakeClientFeatureToggleService = (
3633
config: IUnleashConfig,
3734
): ClientFeatureToggleService => {
38-
const { getLogger, flagResolver } = config;
39-
4035
const fakeClientFeatureToggleStore = new FakeClientFeatureToggleStore();
4136

4237
const fakeSegmentReadModel = new FakeSegmentReadModel();
@@ -46,7 +41,7 @@ export const createFakeClientFeatureToggleService = (
4641
clientFeatureToggleStore: fakeClientFeatureToggleStore,
4742
},
4843
fakeSegmentReadModel,
49-
{ getLogger, flagResolver },
44+
config,
5045
);
5146

5247
return clientFeatureToggleService;

src/lib/features/export-import-toggles/createExportImportService.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,7 @@ export const deferredExportImportTogglesService = (
150150
);
151151
const tagStore = new TagStore(db, eventBus, getLogger);
152152
const tagTypeStore = new TagTypeStore(db, eventBus, getLogger);
153-
const projectStore = new ProjectStore(
154-
db,
155-
eventBus,
156-
getLogger,
157-
flagResolver,
158-
);
153+
const projectStore = new ProjectStore(db, eventBus, config);
159154
const featureTagStore = new FeatureTagStore(db, eventBus, getLogger);
160155
const strategyStore = new StrategyStore(db, getLogger);
161156
const contextFieldStore = new ContextFieldStore(
@@ -172,7 +167,7 @@ export const deferredExportImportTogglesService = (
172167
const featureEnvironmentStore = new FeatureEnvironmentStore(
173168
db,
174169
eventBus,
175-
getLogger,
170+
config,
176171
);
177172
const eventStore = new EventStore(db, getLogger);
178173
const accessService = createAccessService(db, config);

src/lib/features/feature-lifecycle/createFeatureLifecycle.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ export const createFeatureLifecycleService =
1919
const { eventBus, getLogger } = config;
2020
const eventStore = new EventStore(db, getLogger);
2121
const featureLifecycleStore = new FeatureLifecycleStore(db);
22-
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
22+
const environmentStore = new EnvironmentStore(db, eventBus, config);
2323
const featureEnvironmentStore = new FeatureEnvironmentStore(
2424
db,
2525
eventBus,
26-
getLogger,
26+
config,
2727
);
2828
const eventService = createEventsService(db, config);
2929
const featureLifecycleService = new FeatureLifecycleService(

src/lib/features/feature-toggle/createFeatureToggleService.ts

+4-10
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,13 @@ export const createFeatureToggleService = (
8080
const featureToggleClientStore = new FeatureToggleClientStore(
8181
db,
8282
eventBus,
83-
getLogger,
84-
flagResolver,
85-
);
86-
const projectStore = new ProjectStore(
87-
db,
88-
eventBus,
89-
getLogger,
90-
flagResolver,
83+
config,
9184
);
85+
const projectStore = new ProjectStore(db, eventBus, config);
9286
const featureEnvironmentStore = new FeatureEnvironmentStore(
9387
db,
9488
eventBus,
95-
getLogger,
89+
config,
9690
);
9791
const contextFieldStore = new ContextFieldStore(
9892
db,
@@ -105,7 +99,7 @@ export const createFeatureToggleService = (
10599
const accessStore = new AccessStore(db, eventBus, getLogger);
106100
const featureTagStore = new FeatureTagStore(db, eventBus, getLogger);
107101
const roleStore = new RoleStore(db, eventBus, getLogger);
108-
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
102+
const environmentStore = new EnvironmentStore(db, eventBus, config);
109103
const eventService = createEventsService(db, config);
110104
const groupService = new GroupService(
111105
{ groupStore, accountStore },

src/lib/features/feature-toggle/feature-toggle-store.ts

+10
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,16 @@ export default class FeatureToggleStore implements IFeatureToggleStore {
439439
: queryBuilder.whereNull('archived_at');
440440
};
441441

442+
static filterByProjectsAccessibleByOss: Knex.QueryCallbackWithArgs = (
443+
queryBuilder: Knex.QueryBuilder,
444+
isOss: boolean,
445+
) => {
446+
if (isOss) {
447+
return queryBuilder.andWhere('project', '=', 'default');
448+
}
449+
return queryBuilder;
450+
};
451+
442452
rowToFeature(row: FeaturesTable): FeatureToggle {
443453
if (!row) {
444454
throw new NotFoundError('No feature flag found');

src/lib/features/instance-stats/createInstanceStatsService.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,8 @@ export const createInstanceStatsService = (db: Db, config: IUnleashConfig) => {
5858
flagResolver,
5959
);
6060
const userStore = new UserStore(db, getLogger, flagResolver);
61-
const projectStore = new ProjectStore(
62-
db,
63-
eventBus,
64-
getLogger,
65-
flagResolver,
66-
);
67-
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
61+
const projectStore = new ProjectStore(db, eventBus, config);
62+
const environmentStore = new EnvironmentStore(db, eventBus, config);
6863
const strategyStore = new StrategyStore(db, getLogger);
6964
const contextFieldStore = new ContextFieldStore(
7065
db,

src/lib/features/project-environments/createEnvironmentService.ts

+3-8
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,16 @@ export const createEnvironmentService =
2121
const featureEnvironmentStore = new FeatureEnvironmentStore(
2222
db,
2323
eventBus,
24-
getLogger,
25-
);
26-
const projectStore = new ProjectStore(
27-
db,
28-
eventBus,
29-
getLogger,
30-
flagResolver,
24+
config,
3125
);
26+
const projectStore = new ProjectStore(db, eventBus, config);
3227
const featureStrategiesStore = new FeatureStrategiesStore(
3328
db,
3429
eventBus,
3530
getLogger,
3631
flagResolver,
3732
);
38-
const environmentStore = new EnvironmentStore(db, eventBus, getLogger);
33+
const environmentStore = new EnvironmentStore(db, eventBus, config);
3934
const eventService = createEventsService(db, config);
4035
return new EnvironmentService(
4136
{

0 commit comments

Comments
 (0)