From 8707c2f7d9c25eb2c93c99e7c35ec80f2decbd75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20G=C3=B3is?= Date: Wed, 5 Jul 2023 10:49:18 +0100 Subject: [PATCH] fix: ensure userId context exists when running demo (#4144) https://linear.app/unleash/issue/2-1168/demo-ensure-userid-context-field-in-setup-steps This ensures that the `userId` context field exists when we reach specific demo topics that require it in order to be successfully completed. This uses the `setup` property on those topics, where we'll check for the existence of this context field and create it if it's not found. --- frontend/src/component/demo/demo-setup.ts | 29 +++++++++++++++++++++ frontend/src/component/demo/demo-topics.tsx | 3 ++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/frontend/src/component/demo/demo-setup.ts b/frontend/src/component/demo/demo-setup.ts index 6a01c152cb..05609fe93d 100644 --- a/frontend/src/component/demo/demo-setup.ts +++ b/frontend/src/component/demo/demo-setup.ts @@ -1,9 +1,36 @@ +import { IUnleashContextDefinition } from 'interfaces/context'; import { IFeatureToggle } from 'interfaces/featureToggle'; import { formatApiPath } from 'utils/formatPath'; const PROJECT = 'demo-app'; const ENVIRONMENT = 'dev'; +const ensureUserIdContextExists = async () => { + const contextFields: IUnleashContextDefinition[] = + (await fetch(formatApiPath('api/admin/context')).then(res => + res.json() + )) || []; + + if (!contextFields.find(({ name }) => name === 'userId')) { + await fetch(formatApiPath('api/admin/context'), { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: 'userId', + description: 'Allows you to constrain on userId', + legalValues: [], + stickiness: true, + }), + }); + } +}; + +export const specificUser = async () => { + await ensureUserIdContextExists(); +}; + export const gradualRollout = async () => { const featureId = 'demoApp.step3'; @@ -43,6 +70,8 @@ export const gradualRollout = async () => { export const variants = async () => { const featureId = 'demoApp.step4'; + await ensureUserIdContextExists(); + const { variants }: IFeatureToggle = await fetch( formatApiPath( `api/admin/projects/${PROJECT}/features/${featureId}?variantEnvironments=true` diff --git a/frontend/src/component/demo/demo-topics.tsx b/frontend/src/component/demo/demo-topics.tsx index a0918e5ef3..a45f74724c 100644 --- a/frontend/src/component/demo/demo-topics.tsx +++ b/frontend/src/component/demo/demo-topics.tsx @@ -2,7 +2,7 @@ import { Typography, TypographyProps, styled } from '@mui/material'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; import { Badge } from 'component/common/Badge/Badge'; import { Step } from 'react-joyride'; -import { gradualRollout, variants } from './demo-setup'; +import { specificUser, gradualRollout, variants } from './demo-setup'; import { basePath, formatAssetPath } from 'utils/formatPath'; import demoUserId from 'assets/img/demo-userid.png'; @@ -90,6 +90,7 @@ export const TOPICS: ITutorialTopic[] = [ }, { title: 'Enable for a specific user', + setup: specificUser, steps: [ { href: `/projects/${PROJECT}?sort=name`,