Skip to content

Commit 74177ab

Browse files
authored
fix(console-redirect): add legacy path migrations (#2619)
* test(console-redirect): add comprehensive unit tests for legacy path migrations * fix(console-redirect): enhance path migration logic with additional legacy path handling and corresponding unit tests * test(console-redirect): enhance unit tests for path migration with new constants and improved readability
1 parent 19b0f86 commit 74177ab

2 files changed

Lines changed: 225 additions & 50 deletions

File tree

libs/shared/iam/feature/src/lib/use-console-redirect-preference/use-console-redirect-preference.spec.ts

Lines changed: 164 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@ import {
55
shouldBypassLegacyConsoleRedirect,
66
} from './use-console-redirect-preference'
77

8+
const ORGANIZATION_ID = '3d542888-3d2c-474a-b1ad-712556db66da'
9+
const PROJECT_ID = 'd83a2f1f-d90b-461f-9a45-5e8aa2fe2bc0'
10+
const ENVIRONMENT_ID = '857809d7-4e6e-4fa0-8f4e-aff1d8381028'
11+
const CLUSTER_ID = '9f7691a9-40e7-48aa-b11d-749abfd4555d'
12+
const SERVICE_ID = '53a015b0-c6b3-45ce-a958-8d4975368797'
13+
const DATABASE_ID = '51f391cc-9fe0-44a0-98d7-642fd19e01f4'
14+
const DEPLOYMENT_ID = '1284100d-6209-4065-a42d-d60cf5f384cc'
15+
const EXECUTION_ID = 'a199113f-a0a3-44f9-ab6f-bb0fdf5cb4d1'
16+
17+
const ORGANIZATION_PATH = `/organization/${ORGANIZATION_ID}`
18+
const PROJECT_PATH = `${ORGANIZATION_PATH}/project/${PROJECT_ID}`
19+
const ENVIRONMENT_PATH = `${PROJECT_PATH}/environment/${ENVIRONMENT_ID}`
20+
821
describe('useConsoleRedirectPreference', () => {
922
beforeEach(() => {
1023
localStorage.clear()
@@ -22,80 +35,182 @@ describe('useConsoleRedirectPreference', () => {
2235
expect(getNewConsoleUrl('http://localhost:4200/organization/123')).toBeNull()
2336
})
2437

38+
it('should migrate legacy user settings to the organization overview fallback', () => {
39+
expect(getNewConsolePathname('/user/general')).toBe('/organization')
40+
})
41+
42+
it('should migrate legacy overview aliases to overview routes', () => {
43+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/audit-logs/general`)).toBe(`${ORGANIZATION_PATH}/audit-logs`)
44+
45+
expect(getNewConsolePathname(`${PROJECT_PATH}/environments/general`)).toBe(`${PROJECT_PATH}/overview`)
46+
47+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/environments/general`)).toBe(`${ENVIRONMENT_PATH}/overview`)
48+
49+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/general`)).toBe(`${ENVIRONMENT_PATH}/overview`)
50+
})
51+
52+
it('should migrate renamed organization sections', () => {
53+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/alerting/alert-rules`)).toBe(
54+
`${ORGANIZATION_PATH}/alerts/alert-rules`
55+
)
56+
57+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/settings/api`)).toBe(`${ORGANIZATION_PATH}/settings/api-token`)
58+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/settings/credentials`)).toBe(
59+
`${ORGANIZATION_PATH}/settings/cloud-credentials`
60+
)
61+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/settings/billing-detail`)).toBe(
62+
`${ORGANIZATION_PATH}/settings/billing-details`
63+
)
64+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/settings/webhooks`)).toBe(
65+
`${ORGANIZATION_PATH}/settings/webhook`
66+
)
67+
})
68+
69+
it('should migrate legacy project settings paths', () => {
70+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/settings/${PROJECT_ID}/project/general`)).toBe(
71+
`${PROJECT_PATH}/settings/general`
72+
)
73+
74+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/settings/${PROJECT_ID}/project/danger-zone`)).toBe(
75+
`${PROJECT_PATH}/settings/danger-zone`
76+
)
77+
})
78+
79+
it('should migrate legacy cluster paths', () => {
80+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/clusters/general`)).toBe(`${ORGANIZATION_PATH}/clusters`)
81+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/clusters/new`)).toBe(`${ORGANIZATION_PATH}/cluster/new`)
82+
83+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/clusters/create/aws/access`)).toBe(
84+
`${ORGANIZATION_PATH}/cluster/create/aws/general`
85+
)
86+
87+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/clusters/create/aws/summary`)).toBe(
88+
`${ORGANIZATION_PATH}/cluster/create/aws/summary`
89+
)
90+
91+
expect(getNewConsolePathname(`${ORGANIZATION_PATH}/cluster/${CLUSTER_ID}/logs`)).toBe(
92+
`${ORGANIZATION_PATH}/cluster/${CLUSTER_ID}/cluster-logs`
93+
)
94+
})
95+
96+
it('should migrate legacy project environment section paths', () => {
97+
expect(getNewConsolePathname(`${PROJECT_PATH}/environments/variables`)).toBe(`${PROJECT_PATH}/variables`)
98+
99+
expect(getNewConsolePathname(`${PROJECT_PATH}/environments/deployment-rules/edit/${DEPLOYMENT_ID}`)).toBe(
100+
`${PROJECT_PATH}/deployment-rules/edit/${DEPLOYMENT_ID}`
101+
)
102+
})
103+
104+
it('should migrate legacy environment services section paths', () => {
105+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/deployments`)).toBe(`${ENVIRONMENT_PATH}/deployments`)
106+
107+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/variables`)).toBe(`${ENVIRONMENT_PATH}/variables`)
108+
109+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/settings/rules`)).toBe(
110+
`${ENVIRONMENT_PATH}/settings/deployment-rules`
111+
)
112+
113+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/settings/pipeline`)).toBe(
114+
`${ENVIRONMENT_PATH}/overview/pipeline`
115+
)
116+
117+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/settings/preview-environments`)).toBe(
118+
`${ENVIRONMENT_PATH}/settings/preview-environments`
119+
)
120+
})
121+
122+
it('should migrate legacy environment logs paths', () => {
123+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/logs/${SERVICE_ID}/service-logs`)).toBe(
124+
`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/service-logs`
125+
)
126+
127+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/logs/${SERVICE_ID}/deployment-logs/${EXECUTION_ID}`)).toBe(
128+
`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/deployments/logs/${EXECUTION_ID}`
129+
)
130+
131+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/logs/pre-check-logs/${DEPLOYMENT_ID}`)).toBe(
132+
`${ENVIRONMENT_PATH}/deployment/${DEPLOYMENT_ID}/pre-check-logs`
133+
)
134+
135+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/logs/stages/${DEPLOYMENT_ID}`)).toBe(
136+
`${ENVIRONMENT_PATH}/deployments`
137+
)
138+
})
139+
25140
it('should migrate legacy application paths to new service paths', () => {
26-
expect(
27-
getNewConsolePathname('/organization/org/project/project/environment/environment/application/application/general')
28-
).toBe('/organization/org/project/project/environment/environment/service/application/overview')
141+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/application/${SERVICE_ID}/general`)).toBe(
142+
`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/overview`
143+
)
29144

30-
expect(
31-
getNewConsolePathname(
32-
'/organization/org/project/project/environment/environment/application/application/settings/resources'
33-
)
34-
).toBe('/organization/org/project/project/environment/environment/service/application/settings/resources')
145+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/application/${SERVICE_ID}/settings/resources`)).toBe(
146+
`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/settings/resources`
147+
)
35148
})
36149

37150
it('should migrate legacy database paths to new service paths', () => {
38-
expect(
39-
getNewConsolePathname('/organization/org/project/project/environment/environment/database/database/general')
40-
).toBe('/organization/org/project/project/environment/environment/service/database/overview')
151+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/database/${DATABASE_ID}/general`)).toBe(
152+
`${ENVIRONMENT_PATH}/service/${DATABASE_ID}/overview`
153+
)
41154

42-
expect(
43-
getNewConsolePathname(
44-
'/organization/org/project/project/environment/environment/database/database/settings/danger-zone'
45-
)
46-
).toBe('/organization/org/project/project/environment/environment/service/database/settings/danger-zone')
155+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/database/${DATABASE_ID}/settings/danger-zone`)).toBe(
156+
`${ENVIRONMENT_PATH}/service/${DATABASE_ID}/settings/danger-zone`
157+
)
47158
})
48159

49160
it('should migrate legacy environment services paths to singular service paths', () => {
50-
expect(getNewConsolePathname('/organization/org/project/project/environment/environment/services/new')).toBe(
51-
'/organization/org/project/project/environment/environment/service/new'
161+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/new`)).toBe(`${ENVIRONMENT_PATH}/service/new`)
162+
163+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/database/general`)).toBe(
164+
`${ENVIRONMENT_PATH}/service/create/database/general`
52165
)
166+
})
53167

54-
expect(
55-
getNewConsolePathname(
56-
'/organization/org/project/project/environment/environment/services/create/database/general'
57-
)
58-
).toBe('/organization/org/project/project/environment/environment/service/create/database/general')
168+
it('should migrate legacy service creation step aliases', () => {
169+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/cron-job/introduction`)).toBe(
170+
`${ENVIRONMENT_PATH}/service/create/cron-job/general`
171+
)
172+
173+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/cron-job/variable`)).toBe(
174+
`${ENVIRONMENT_PATH}/service/create/cron-job/variables`
175+
)
176+
177+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/database/post`)).toBe(
178+
`${ENVIRONMENT_PATH}/service/create/database/summary`
179+
)
59180
})
60181

61182
it('should migrate legacy service creation step paths', () => {
62-
expect(
63-
getNewConsolePathname(
64-
'/organization/org/project/project/environment/environment/services/create/helm/values-override/repository-and-yaml'
65-
)
66-
).toBe('/organization/org/project/project/environment/environment/service/create/helm/values-override-file')
183+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/helm/values-override/repository-and-yaml`)).toBe(
184+
`${ENVIRONMENT_PATH}/service/create/helm/values-override-file`
185+
)
67186

68-
expect(
69-
getNewConsolePathname(
70-
'/organization/org/project/project/environment/environment/services/create/helm/values-override/arguments'
71-
)
72-
).toBe('/organization/org/project/project/environment/environment/service/create/helm/values-override-arguments')
187+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/helm/values-override/arguments`)).toBe(
188+
`${ENVIRONMENT_PATH}/service/create/helm/values-override-arguments`
189+
)
73190

74-
expect(
75-
getNewConsolePathname(
76-
'/organization/org/project/project/environment/environment/services/create/terraform/basic-configuration'
77-
)
78-
).toBe('/organization/org/project/project/environment/environment/service/create/terraform/terraform-configuration')
191+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/services/create/terraform/basic-configuration`)).toBe(
192+
`${ENVIRONMENT_PATH}/service/create/terraform/terraform-configuration`
193+
)
79194
})
80195

81196
it('should migrate legacy monitoring metric creation paths', () => {
197+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/application/${SERVICE_ID}/monitoring/metric/cpu`)).toBe(
198+
`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/monitoring/alerts/create/metric/cpu`
199+
)
200+
82201
expect(
83-
getNewConsolePathname(
84-
'/organization/org/project/project/environment/environment/application/application/monitoring/metric/cpu'
85-
)
86-
).toBe(
87-
'/organization/org/project/project/environment/environment/service/application/monitoring/alerts/create/metric/cpu'
202+
getNewConsolePathname(`${ENVIRONMENT_PATH}/application/${SERVICE_ID}/monitoring/create/alerts/metric/cpu`)
203+
).toBe(`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/monitoring/alerts/create/metric/cpu`)
204+
205+
expect(getNewConsolePathname(`${ENVIRONMENT_PATH}/application/${SERVICE_ID}/monitoring/create/alerts`)).toBe(
206+
`${ENVIRONMENT_PATH}/service/${SERVICE_ID}/monitoring/alerts`
88207
)
89208
})
90209

91210
it('should migrate paths while building the new console url', () => {
92211
expect(
93-
getNewConsoleUrl(
94-
'https://console.qovery.com/organization/org/project/project/environment/environment/application/application/general?foo=bar#hash'
95-
)
96-
).toBe(
97-
'https://new-console.qovery.com/organization/org/project/project/environment/environment/service/application/overview?foo=bar#hash'
98-
)
212+
getNewConsoleUrl(`https://console.qovery.com${ENVIRONMENT_PATH}/application/${SERVICE_ID}/general?foo=bar#hash`)
213+
).toBe(`https://new-console.qovery.com${ENVIRONMENT_PATH}/service/${SERVICE_ID}/overview?foo=bar#hash`)
99214
})
100215

101216
it('should read the preference from local storage first', () => {

libs/shared/iam/feature/src/lib/use-console-redirect-preference/use-console-redirect-preference.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ const CONSOLE_PREFERENCE_STORAGE_KEY = 'qovery-console-preference'
66
const CONSOLE_PREFERENCE_COOKIE_KEY = 'qovery-console-preference'
77
const LEGACY_CONSOLE_BYPASS_QUERY_PARAM = 'legacy'
88
const ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365
9-
const ENVIRONMENT_PATH_PATTERN = '/organization/[^/]+/project/[^/]+/environment/[^/]+'
9+
const ORGANIZATION_PATH_PATTERN = '/organization/[^/]+'
10+
const PROJECT_PATH_PATTERN = `${ORGANIZATION_PATH_PATTERN}/project/[^/]+`
11+
const ENVIRONMENT_PATH_PATTERN = `${PROJECT_PATH_PATTERN}/environment/[^/]+`
1012

1113
function isConsolePreference(value: string | null): value is ConsolePreference {
1214
return value === 'legacy' || value === 'new'
@@ -66,13 +68,71 @@ export function getStoredConsolePreference(): ConsolePreference {
6668

6769
export function getNewConsolePathname(pathname: string): string {
6870
return pathname
71+
.replace(/^\/user\/general\/?$/, '/organization')
72+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/alerting(/|$)`), '$1/alerts$2')
73+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/audit-logs/general(/|$)`), '$1/audit-logs$2')
74+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/settings/api(/|$)`), '$1/settings/api-token$2')
75+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/settings/credentials(/|$)`), '$1/settings/cloud-credentials$2')
76+
.replace(
77+
new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/settings/billing-detail(/|$)`),
78+
'$1/settings/billing-details$2'
79+
)
80+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/settings/webhooks(/|$)`), '$1/settings/webhook$2')
81+
.replace(
82+
new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/settings/([^/]+)/project/(general|danger-zone)(/|$)`),
83+
'$1/project/$2/settings/$3$4'
84+
)
85+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/clusters/general(/|$)`), '$1/clusters$2')
86+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/clusters/new(/|$)`), '$1/cluster/new$2')
87+
.replace(
88+
new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/clusters/create/([^/]+)/access(/|$)`),
89+
'$1/cluster/create/$2/general$3'
90+
)
91+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN})/clusters/create(/|$)`), '$1/cluster/create$2')
92+
.replace(new RegExp(`^(${ORGANIZATION_PATH_PATTERN}/cluster/[^/]+)/logs(/|$)`), '$1/cluster-logs$2')
93+
.replace(new RegExp(`^(${PROJECT_PATH_PATTERN})/environments/general(/|$)`), '$1/overview$2')
94+
.replace(new RegExp(`^(${PROJECT_PATH_PATTERN})/environments/variables(/|$)`), '$1/variables$2')
95+
.replace(new RegExp(`^(${PROJECT_PATH_PATTERN})/environments/deployment-rules(/|$)`), '$1/deployment-rules$2')
96+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/(environments|services)/general(/|$)`), '$1/overview$3')
97+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/services/deployments(/|$)`), '$1/deployments$2')
98+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/services/variables(/|$)`), '$1/variables$2')
99+
.replace(
100+
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/services/settings/rules(/|$)`),
101+
'$1/settings/deployment-rules$2'
102+
)
103+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/services/settings/pipeline(/|$)`), '$1/overview/pipeline$2')
104+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/services/settings(/|$)`), '$1/settings$2')
105+
.replace(
106+
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/logs/([^/]+)/service-logs(/|$)`),
107+
'$1/service/$2/service-logs$3'
108+
)
109+
.replace(
110+
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/logs/([^/]+)/deployment-logs/([^/]+)(/|$)`),
111+
'$1/service/$2/deployments/logs/$3$4'
112+
)
113+
.replace(
114+
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/logs/pre-check-logs/([^/]+)(/|$)`),
115+
'$1/deployment/$2/pre-check-logs$3'
116+
)
117+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/logs(/stages/[^/]+|/stages)?(/|$)`), '$1/deployments$3')
69118
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/(application|database)/([^/]+)(/|$)`), '$1/service/$3$4')
70119
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN})/services(/|$)`), '$1/service$2')
71120
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/[^/]+)/general(/|$)`), '$1/overview$2')
121+
.replace(
122+
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/[^/]+)/monitoring/create/alerts/metric/([^/]+)(/|$)`),
123+
'$1/monitoring/alerts/create/metric/$2$3'
124+
)
125+
.replace(
126+
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/[^/]+)/monitoring/create/alerts(/|$)`),
127+
'$1/monitoring/alerts$2'
128+
)
72129
.replace(
73130
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/[^/]+)/monitoring/metric/([^/]+)(/|$)`),
74131
'$1/monitoring/alerts/create/metric/$2$3'
75132
)
133+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/create/[^/]+)/post(/|$)`), '$1/summary$2')
134+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/create/[^/]+)/variable(/|$)`), '$1/variables$2')
135+
.replace(new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/create/[^/]+)/introduction(/|$)`), '$1/general$2')
76136
.replace(
77137
new RegExp(`^(${ENVIRONMENT_PATH_PATTERN}/service/create/helm)/values-override/repository-and-yaml(/|$)`),
78138
'$1/values-override-file$2'

0 commit comments

Comments
 (0)