1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-13 13:48:59 +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;
environment: string;
editable?: boolean;
}> = ({ strategy, setStrategy, projectId, environment, editable }) => {
permission?: string | string[];
}> = ({
strategy,
setStrategy,
projectId,
environment,
editable,
permission = UPDATE_FEATURE_ENVIRONMENT_VARIANTS,
}) => {
const { trackEvent } = usePlausibleTracker();
const [variantsEdit, setVariantsEdit] = useState<IFeatureVariantEdit[]>([]);
const theme = useTheme();
@ -153,7 +161,7 @@ export const StrategyVariants: FC<{
<PermissionButton
onClick={addVariant}
variant='outlined'
permission={UPDATE_FEATURE_ENVIRONMENT_VARIANTS}
permission={permission}
projectId={projectId}
environmentId={environment}
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 {
PROJECT_DEFAULT_STRATEGY_READ,
PROJECT_DEFAULT_STRATEGY_WRITE,
UPDATE_PROJECT,
} from 'component/providers/AccessProvider/permissions';
import { Alert, styled } from '@mui/material';
@ -29,7 +30,14 @@ export const ProjectDefaultStrategySettings = () => {
usePageTitle(`Project default strategy configuration ${projectName}`);
if (
!hasAccess([UPDATE_PROJECT, PROJECT_DEFAULT_STRATEGY_READ], projectId)
!hasAccess(
[
UPDATE_PROJECT,
PROJECT_DEFAULT_STRATEGY_READ,
PROJECT_DEFAULT_STRATEGY_WRITE,
],
projectId,
)
) {
return (
<PageContent

View File

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

View File

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

View File

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

View File

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