1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-18 13:48:58 +02:00

Fix/default strategy permission cherry pick (#8144)

Cherry pick #8113, #8114 and #8112

---------

Co-authored-by: Thomas Heartman <thomas@getunleash.io>
This commit is contained in:
Fredrik Strand Oseberg 2024-09-16 11:13:18 +02:00 committed by GitHub
parent 446e123c1a
commit ccc63446c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 41 additions and 9 deletions

View File

@ -27,7 +27,15 @@ export const StrategyVariants: FC<{
projectId: string; projectId: string;
environment: string; environment: string;
editable?: boolean; editable?: boolean;
}> = ({ strategy, setStrategy, projectId, environment, editable }) => { permission?: string | string[];
}> = ({
strategy,
setStrategy,
projectId,
environment,
editable,
permission = UPDATE_FEATURE_ENVIRONMENT_VARIANTS,
}) => {
const { trackEvent } = usePlausibleTracker(); const { trackEvent } = usePlausibleTracker();
const [variantsEdit, setVariantsEdit] = useState<IFeatureVariantEdit[]>([]); const [variantsEdit, setVariantsEdit] = useState<IFeatureVariantEdit[]>([]);
const theme = useTheme(); const theme = useTheme();
@ -153,7 +161,7 @@ export const StrategyVariants: FC<{
<PermissionButton <PermissionButton
onClick={addVariant} onClick={addVariant}
variant='outlined' variant='outlined'
permission={UPDATE_FEATURE_ENVIRONMENT_VARIANTS} permission={permission}
projectId={projectId} projectId={projectId}
environmentId={environment} environmentId={environment}
data-testid='ADD_STRATEGY_VARIANT_BUTTON' data-testid='ADD_STRATEGY_VARIANT_BUTTON'

View File

@ -6,6 +6,7 @@ import { PageContent } from 'component/common/PageContent/PageContent';
import { PageHeader } from 'component/common/PageHeader/PageHeader'; import { PageHeader } from 'component/common/PageHeader/PageHeader';
import { import {
PROJECT_DEFAULT_STRATEGY_READ, PROJECT_DEFAULT_STRATEGY_READ,
PROJECT_DEFAULT_STRATEGY_WRITE,
UPDATE_PROJECT, UPDATE_PROJECT,
} from 'component/providers/AccessProvider/permissions'; } from 'component/providers/AccessProvider/permissions';
import { Alert, styled } from '@mui/material'; import { Alert, styled } from '@mui/material';
@ -29,7 +30,14 @@ export const ProjectDefaultStrategySettings = () => {
usePageTitle(`Project default strategy configuration ${projectName}`); usePageTitle(`Project default strategy configuration ${projectName}`);
if ( if (
!hasAccess([UPDATE_PROJECT, PROJECT_DEFAULT_STRATEGY_READ], projectId) !hasAccess(
[
UPDATE_PROJECT,
PROJECT_DEFAULT_STRATEGY_READ,
PROJECT_DEFAULT_STRATEGY_WRITE,
],
projectId,
)
) { ) {
return ( return (
<PageContent <PageContent

View File

@ -6,7 +6,7 @@ import { useStrategy } from 'hooks/api/getters/useStrategy/useStrategy';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { formatUnknownError } from 'utils/formatUnknownError'; import { formatUnknownError } from 'utils/formatUnknownError';
import FormTemplate from 'component/common/FormTemplate/FormTemplate'; import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import { UPDATE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions'; import { PROJECT_DEFAULT_STRATEGY_WRITE } from 'component/providers/AccessProvider/permissions';
import type { IStrategy } from 'interfaces/strategy'; import type { IStrategy } from 'interfaces/strategy';
import { useRequiredQueryParam } from 'hooks/useRequiredQueryParam'; import { useRequiredQueryParam } from 'hooks/useRequiredQueryParam';
import type { ISegment } from 'interfaces/segment'; import type { ISegment } from 'interfaces/segment';
@ -19,6 +19,7 @@ import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
import { ProjectDefaultStrategyForm } from './ProjectDefaultStrategyForm'; import { ProjectDefaultStrategyForm } from './ProjectDefaultStrategyForm';
import type { CreateFeatureStrategySchema } from 'openapi'; import type { CreateFeatureStrategySchema } from 'openapi';
import useProjectOverview from 'hooks/api/getters/useProjectOverview/useProjectOverview'; import useProjectOverview from 'hooks/api/getters/useProjectOverview/useProjectOverview';
import { UPDATE_PROJECT } from '@server/types/permissions';
export const useDefaultStrategy = ( export const useDefaultStrategy = (
projectId: string, projectId: string,
@ -154,7 +155,7 @@ const EditDefaultStrategy = () => {
environmentId={environmentId} environmentId={environmentId}
onSubmit={onSubmit} onSubmit={onSubmit}
loading={loading} loading={loading}
permission={UPDATE_FEATURE_STRATEGY} permission={[PROJECT_DEFAULT_STRATEGY_WRITE, UPDATE_PROJECT]}
errors={errors} errors={errors}
isChangeRequest={false} isChangeRequest={false}
/> />

View File

@ -21,11 +21,15 @@ import { FeatureStrategyConstraints } from 'component/feature/FeatureStrategy/Fe
import { FeatureStrategyType } from 'component/feature/FeatureStrategy/FeatureStrategyType/FeatureStrategyType'; import { FeatureStrategyType } from 'component/feature/FeatureStrategy/FeatureStrategyType/FeatureStrategyType';
import { FeatureStrategyTitle } from 'component/feature/FeatureStrategy/FeatureStrategyForm/FeatureStrategyTitle/FeatureStrategyTitle'; import { FeatureStrategyTitle } from 'component/feature/FeatureStrategy/FeatureStrategyForm/FeatureStrategyTitle/FeatureStrategyTitle';
import { StrategyVariants } from 'component/feature/StrategyTypes/StrategyVariants'; import { StrategyVariants } from 'component/feature/StrategyTypes/StrategyVariants';
import {
PROJECT_DEFAULT_STRATEGY_WRITE,
UPDATE_PROJECT,
} from '@server/types/permissions';
interface IProjectDefaultStrategyFormProps { interface IProjectDefaultStrategyFormProps {
projectId: string; projectId: string;
environmentId: string; environmentId: string;
permission: string; permission: string | string[];
onSubmit: () => void; onSubmit: () => void;
onCancel?: () => void; onCancel?: () => void;
loading: boolean; loading: boolean;
@ -186,6 +190,10 @@ export const ProjectDefaultStrategyForm = ({
setStrategy={setStrategy} setStrategy={setStrategy}
environment={environmentId} environment={environmentId}
projectId={projectId} projectId={projectId}
permission={[
PROJECT_DEFAULT_STRATEGY_WRITE,
UPDATE_PROJECT,
]}
/> />
} }
/> />

View File

@ -1,13 +1,16 @@
import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
import { StrategyItemContainer } from 'component/common/StrategyItemContainer/StrategyItemContainer'; import { StrategyItemContainer } from 'component/common/StrategyItemContainer/StrategyItemContainer';
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton'; import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
import { UPDATE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import Edit from '@mui/icons-material/Edit'; import Edit from '@mui/icons-material/Edit';
import { StrategyExecution } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution'; import { StrategyExecution } from 'component/feature/FeatureView/FeatureOverview/FeatureOverviewEnvironments/FeatureOverviewEnvironment/EnvironmentAccordionBody/StrategyDraggableItem/StrategyItem/StrategyExecution/StrategyExecution';
import type { ProjectEnvironmentType } from 'interfaces/environments'; import type { ProjectEnvironmentType } from 'interfaces/environments';
import { useMemo } from 'react'; import { useMemo } from 'react';
import type { CreateFeatureStrategySchema } from 'openapi'; import type { CreateFeatureStrategySchema } from 'openapi';
import {
PROJECT_DEFAULT_STRATEGY_WRITE,
UPDATE_PROJECT,
} from '@server/types/permissions';
interface ProjectEnvironmentDefaultStrategyProps { interface ProjectEnvironmentDefaultStrategyProps {
environment: ProjectEnvironmentType; environment: ProjectEnvironmentType;
@ -59,7 +62,10 @@ const ProjectEnvironmentDefaultStrategy = ({
actions={ actions={
<> <>
<PermissionIconButton <PermissionIconButton
permission={UPDATE_FEATURE_STRATEGY} permission={[
PROJECT_DEFAULT_STRATEGY_WRITE,
UPDATE_PROJECT,
]}
environmentId={environmentId} environmentId={environmentId}
projectId={projectId} projectId={projectId}
component={Link} component={Link}

View File

@ -5,6 +5,7 @@ import {
type IUnleashServices, type IUnleashServices,
serializeDates, serializeDates,
UPDATE_PROJECT, UPDATE_PROJECT,
PROJECT_DEFAULT_STRATEGY_WRITE,
} from '../../types'; } from '../../types';
import type { Logger } from '../../logger'; import type { Logger } from '../../logger';
import type EnvironmentService from './environment-service'; import type EnvironmentService from './environment-service';
@ -105,7 +106,7 @@ export default class EnvironmentsController extends Controller {
method: 'post', method: 'post',
path: `${PREFIX}/:environment/default-strategy`, path: `${PREFIX}/:environment/default-strategy`,
handler: this.updateDefaultStrategyForProjectEnvironment, handler: this.updateDefaultStrategyForProjectEnvironment,
permission: UPDATE_PROJECT, permission: [UPDATE_PROJECT, PROJECT_DEFAULT_STRATEGY_WRITE],
middleware: [ middleware: [
openApiService.validPath({ openApiService.validPath({
tags: ['Projects'], tags: ['Projects'],