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

chore: remove private projects flag (#5743)

This commit is contained in:
Jaanus Sellin 2024-01-02 15:53:26 +02:00 committed by GitHub
parent 049c5b9afa
commit dc0df235dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 89 additions and 143 deletions

View File

@ -14,7 +14,6 @@ const StyledDescription = styled(Typography)(({ theme }) => ({
})); }));
export const CollaborationModeTooltip: FC = () => { export const CollaborationModeTooltip: FC = () => {
const privateProjects = useUiFlag('privateProjects');
return ( return (
<HelpIcon <HelpIcon
htmlTooltip htmlTooltip
@ -33,19 +32,13 @@ export const CollaborationModeTooltip: FC = () => {
requests requests
</StyledDescription> </StyledDescription>
</Box> </Box>
<ConditionallyRender
condition={Boolean(privateProjects)}
show={
<Box sx={{ mt: 2 }}> <Box sx={{ mt: 2 }}>
<StyledTitle>private: </StyledTitle> <StyledTitle>private: </StyledTitle>
<StyledDescription> <StyledDescription>
Only admins, editors and project members can Only admins, editors and project members can see and
see and access the project and associated access the project and associated feature toggles
feature toggles
</StyledDescription> </StyledDescription>
</Box> </Box>
}
/>
</> </>
} }
/> />

View File

@ -133,22 +133,14 @@ const ProjectEnterpriseSettingsForm: React.FC<IProjectEnterpriseSettingsForm> =
setFeatureNamingDescription, setFeatureNamingDescription,
setProjectMode, setProjectMode,
errors, errors,
clearErrors,
}) => { }) => {
const privateProjects = useUiFlag('privateProjects');
const { setPreviousPattern, trackPattern } = const { setPreviousPattern, trackPattern } =
useFeatureNamePatternTracking(); useFeatureNamePatternTracking();
const projectModeOptions = privateProjects const projectModeOptions = [
? [
{ key: 'open', label: 'open' }, { key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' }, { key: 'protected', label: 'protected' },
{ key: 'private', label: 'private' }, { key: 'private', label: 'private' },
]
: [
{ key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' },
]; ];
useEffect(() => { useEffect(() => {

View File

@ -103,17 +103,11 @@ const ProjectForm: React.FC<IProjectForm> = ({
clearErrors, clearErrors,
}) => { }) => {
const { isEnterprise } = useUiConfig(); const { isEnterprise } = useUiConfig();
const privateProjects = useUiFlag('privateProjects');
const projectModeOptions = privateProjects const projectModeOptions = [
? [
{ key: 'open', label: 'open' }, { key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' }, { key: 'protected', label: 'protected' },
{ key: 'private', label: 'private' }, { key: 'private', label: 'private' },
]
: [
{ key: 'open', label: 'open' },
{ key: 'protected', label: 'protected' },
]; ];
return ( return (

View File

@ -62,7 +62,6 @@ export type UiFlags = {
customRootRolesKillSwitch?: boolean; customRootRolesKillSwitch?: boolean;
strategyVariant?: boolean; strategyVariant?: boolean;
doraMetrics?: boolean; doraMetrics?: boolean;
privateProjects?: boolean;
dependentFeatures?: boolean; dependentFeatures?: boolean;
scheduledConfigurationChanges?: boolean; scheduledConfigurationChanges?: boolean;
featureSearchAPI?: boolean; featureSearchAPI?: boolean;

View File

@ -104,7 +104,6 @@ exports[`should create default config 1`] = `
"migrationLock": true, "migrationLock": true,
"newStrategyConfiguration": false, "newStrategyConfiguration": false,
"personalAccessTokensKillSwitch": false, "personalAccessTokensKillSwitch": false,
"privateProjects": false,
"proPlanAutoCharge": false, "proPlanAutoCharge": false,
"responseTimeWithAppNameKillSwitch": false, "responseTimeWithAppNameKillSwitch": false,
"scheduledConfigurationChanges": false, "scheduledConfigurationChanges": false,

View File

@ -1095,7 +1095,7 @@ class FeatureToggleService {
archived, archived,
); );
if (this.flagResolver.isEnabled('privateProjects') && userId) { if (userId) {
const projectAccess = const projectAccess =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(
userId, userId,
@ -2053,11 +2053,8 @@ class FeatureToggleService {
): Promise<FeatureToggle[]> { ): Promise<FeatureToggle[]> {
const features = await this.featureToggleStore.getArchivedFeatures(); const features = await this.featureToggleStore.getArchivedFeatures();
if (this.flagResolver.isEnabled('privateProjects')) {
const projectAccess = const projectAccess =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(userId);
userId,
);
if (projectAccess.mode === 'all') { if (projectAccess.mode === 'all') {
return features; return features;
} else { } else {
@ -2066,8 +2063,6 @@ class FeatureToggleService {
); );
} }
} }
return features;
}
async getArchivedFeaturesByProjectId( async getArchivedFeaturesByProjectId(
archived: boolean, archived: boolean,

View File

@ -19,7 +19,6 @@ beforeAll(async () => {
advancedPlayground: true, advancedPlayground: true,
strictSchemaValidation: true, strictSchemaValidation: true,
strategyVariant: true, strategyVariant: true,
privateProjects: true,
}, },
}, },
}, },

View File

@ -102,11 +102,9 @@ export class PlaygroundService {
const segments = await this.segmentService.getActive(); const segments = await this.segmentService.getActive();
let filteredProjects: typeof projects = projects; let filteredProjects: typeof projects = projects;
if (this.flagResolver.isEnabled('privateProjects')) {
const projectAccess = const projectAccess =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(userId);
userId,
);
if (projectAccess.mode === 'all') { if (projectAccess.mode === 'all') {
filteredProjects = projects; filteredProjects = projects;
} else if (projects === ALL) { } else if (projects === ALL) {
@ -116,7 +114,6 @@ export class PlaygroundService {
projectAccess.projects.includes(project), projectAccess.projects.includes(project),
); );
} }
}
const environmentFeatures = await Promise.all( const environmentFeatures = await Promise.all(
environments.map((env) => environments.map((env) =>

View File

@ -1,10 +1,10 @@
import { IPrivateProjectChecker } from './privateProjectCheckerType'; import { IPrivateProjectChecker } from './privateProjectCheckerType';
import { ProjectAccess } from './privateProjectStore'; import { ALL_PROJECT_ACCESS, ProjectAccess } from './privateProjectStore';
export class FakePrivateProjectChecker implements IPrivateProjectChecker { export class FakePrivateProjectChecker implements IPrivateProjectChecker {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
async getUserAccessibleProjects(userId: number): Promise<ProjectAccess> { async getUserAccessibleProjects(userId: number): Promise<ProjectAccess> {
throw new Error('Method not implemented.'); return ALL_PROJECT_ACCESS;
} }
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars

View File

@ -160,11 +160,8 @@ export default class ClientInstanceService {
): Promise<IClientApplication[]> { ): Promise<IClientApplication[]> {
const applications = const applications =
await this.clientApplicationsStore.getAppsForStrategy(query); await this.clientApplicationsStore.getAppsForStrategy(query);
if (this.flagResolver.isEnabled('privateProjects')) {
const accessibleProjects = const accessibleProjects =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(userId);
userId,
);
if (accessibleProjects.mode === 'all') { if (accessibleProjects.mode === 'all') {
return applications; return applications;
} else { } else {
@ -182,8 +179,6 @@ export default class ClientInstanceService {
}); });
} }
} }
return applications;
}
async getApplication(appName: string): Promise<IApplication> { async getApplication(appName: string): Promise<IApplication> {
const [seenToggles, application, instances, strategies, features] = const [seenToggles, application, instances, strategies, features] =

View File

@ -75,25 +75,18 @@ class ContextService {
): Promise<ContextFieldStrategiesSchema> { ): Promise<ContextFieldStrategiesSchema> {
const strategies = const strategies =
await this.featureStrategiesStore.getStrategiesByContextField(name); await this.featureStrategiesStore.getStrategiesByContextField(name);
if (this.flagResolver.isEnabled('privateProjects')) {
const accessibleProjects = const accessibleProjects =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(userId);
userId,
);
if (accessibleProjects.mode === 'all') { if (accessibleProjects.mode === 'all') {
return this.mapStrategies(strategies); return this.mapStrategies(strategies);
} else { } else {
return this.mapStrategies( return this.mapStrategies(
strategies.filter((strategy) => strategies.filter((strategy) =>
accessibleProjects.projects.includes( accessibleProjects.projects.includes(strategy.projectId),
strategy.projectId,
),
), ),
); );
} }
} }
return this.mapStrategies(strategies);
}
private mapStrategies(strategies: IFeatureStrategy[]) { private mapStrategies(strategies: IFeatureStrategy[]) {
return { return {

View File

@ -180,7 +180,7 @@ export default class ProjectService {
userId, userId,
); );
if (this.flagResolver.isEnabled('privateProjects') && userId) { if (userId) {
const projectAccess = const projectAccess =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(
userId, userId,

View File

@ -96,11 +96,8 @@ export class SegmentService implements ISegmentService {
userId: number, userId: number,
): Promise<StrategiesUsingSegment> { ): Promise<StrategiesUsingSegment> {
const allStrategies = await this.getAllStrategies(id); const allStrategies = await this.getAllStrategies(id);
if (this.flagResolver.isEnabled('privateProjects')) {
const accessibleProjects = const accessibleProjects =
await this.privateProjectChecker.getUserAccessibleProjects( await this.privateProjectChecker.getUserAccessibleProjects(userId);
userId,
);
if (accessibleProjects.mode === 'all') { if (accessibleProjects.mode === 'all') {
return allStrategies; return allStrategies;
} else { } else {
@ -113,8 +110,6 @@ export class SegmentService implements ISegmentService {
}; };
} }
} }
return allStrategies;
}
async getAllStrategies(id: number): Promise<StrategiesUsingSegment> { async getAllStrategies(id: number): Promise<StrategiesUsingSegment> {
const strategies = const strategies =

View File

@ -23,7 +23,6 @@ export type IFlagKey =
| 'advancedPlayground' | 'advancedPlayground'
| 'filterInvalidClientMetrics' | 'filterInvalidClientMetrics'
| 'customRootRolesKillSwitch' | 'customRootRolesKillSwitch'
| 'privateProjects'
| 'disableMetrics' | 'disableMetrics'
| 'featureSearchAPI' | 'featureSearchAPI'
| 'featureSearchFrontend' | 'featureSearchFrontend'
@ -112,10 +111,6 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_CUSTOM_ROOT_ROLES_KILL_SWITCH, process.env.UNLEASH_EXPERIMENTAL_CUSTOM_ROOT_ROLES_KILL_SWITCH,
false, false,
), ),
privateProjects: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_PRIVATE_PROJECTS,
false,
),
disableMetrics: parseEnvVarBoolean( disableMetrics: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_DISABLE_METRICS, process.env.UNLEASH_EXPERIMENTAL_DISABLE_METRICS,
false, false,

View File

@ -40,7 +40,6 @@ process.nextTick(async () => {
embedProxyFrontend: true, embedProxyFrontend: true,
anonymiseEventLog: false, anonymiseEventLog: false,
responseTimeWithAppNameKillSwitch: false, responseTimeWithAppNameKillSwitch: false,
privateProjects: true,
featureSearchAPI: true, featureSearchAPI: true,
featureSearchFrontend: true, featureSearchFrontend: true,
stripClientHeadersOn304: true, stripClientHeadersOn304: true,

View File

@ -10,13 +10,17 @@ let app: IUnleashTest;
beforeAll(async () => { beforeAll(async () => {
db = await dbInit('context_api_serial', getLogger); db = await dbInit('context_api_serial', getLogger);
app = await setupAppWithCustomConfig(db.stores, { app = await setupAppWithCustomConfig(
db.stores,
{
experimental: { experimental: {
flags: { flags: {
strictSchemaValidation: true, strictSchemaValidation: true,
}, },
}, },
}); },
db.rawDatabase,
);
}); });
afterAll(async () => { afterAll(async () => {

View File

@ -10,7 +10,7 @@ let db: ITestDb;
beforeAll(async () => { beforeAll(async () => {
db = await dbInit('metrics_serial', getLogger, {}); db = await dbInit('metrics_serial', getLogger, {});
app = await setupAppWithCustomConfig(db.stores, {}); app = await setupAppWithCustomConfig(db.stores, {}, db.rawDatabase);
}); });
beforeEach(async () => { beforeEach(async () => {

View File

@ -61,9 +61,6 @@ beforeAll(async () => {
}); });
const config = createTestConfig({ const config = createTestConfig({
getLogger, getLogger,
experimental: {
flags: { privateProjects: true },
},
}); });
eventService = new EventService(stores, config); eventService = new EventService(stores, config);
accessService = createAccessService(db.rawDatabase, config); accessService = createAccessService(db.rawDatabase, config);