post-login.ts
2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { canAccessPageByRoles, LOGIN_PATH, normalizePagePath } from '~/utils/permission'
import { isMobileOrTablet } from '~/utils/device'
export const MOBILE_WORKBENCH_PATH = '/m/workbench'
const DEFAULT_DESKTOP_PATH = '/work-orders'
const DESKTOP_FALLBACK_PATHS = [
'/sn-management',
'/operations'
]
const MOBILE_FALLBACK_PATHS = [
MOBILE_WORKBENCH_PATH,
'/m/production/sn-query'
]
const DESKTOP_ROLE_BASED_FALLBACK_PATHS = [
DEFAULT_DESKTOP_PATH,
...DESKTOP_FALLBACK_PATHS,
'/'
]
function normalizeRedirectPath(redirect: unknown) {
if (typeof redirect !== 'string') {
return null
}
if (!redirect.startsWith('/') || redirect.startsWith('//')) {
return null
}
const normalizedRedirect = normalizePagePath(redirect)
if (normalizedRedirect === LOGIN_PATH) {
return null
}
return normalizedRedirect
}
function normalizeRoles(roles?: string[]) {
if (!Array.isArray(roles)) {
return []
}
return roles
.filter(role => typeof role === 'string' && role.trim().length > 0)
.map(role => role.trim())
}
function isOperatorOnlyRole(roles: string[]) {
if (!roles.includes('operator')) {
return false
}
const hasDesktopManagementRole = roles.includes('admin') || roles.includes('qa_manager')
return !hasDesktopManagementRole
}
function isMobilePagePath(path: string) {
return path === MOBILE_WORKBENCH_PATH || path.startsWith('/m/')
}
function findFirstAccessiblePath(paths: string[], roles: string[]) {
for (const fallbackPath of paths) {
if (canAccessPageByRoles(roles, fallbackPath)) {
return fallbackPath
}
}
return null
}
export function resolvePostLoginPath(redirect: unknown, roles?: string[]) {
const normalizedRoles = normalizeRoles(roles)
const normalizedRedirect = normalizeRedirectPath(redirect)
const canAccessRedirect = Boolean(
normalizedRedirect && canAccessPageByRoles(normalizedRoles, normalizedRedirect)
)
if (isMobileOrTablet()) {
if (normalizedRedirect && isMobilePagePath(normalizedRedirect) && canAccessRedirect) {
return normalizedRedirect
}
if (isOperatorOnlyRole(normalizedRoles)) {
return MOBILE_WORKBENCH_PATH
}
const mobileFallbackPath = findFirstAccessiblePath(MOBILE_FALLBACK_PATHS, normalizedRoles)
if (mobileFallbackPath) {
return mobileFallbackPath
}
}
if (normalizedRedirect && canAccessRedirect) {
return normalizedRedirect
}
if (isOperatorOnlyRole(normalizedRoles)) {
return MOBILE_WORKBENCH_PATH
}
const desktopFallbackPath = findFirstAccessiblePath(DESKTOP_ROLE_BASED_FALLBACK_PATHS, normalizedRoles)
if (desktopFallbackPath) {
return desktopFallbackPath
}
const mobileFallbackPath = findFirstAccessiblePath(MOBILE_FALLBACK_PATHS, normalizedRoles)
if (mobileFallbackPath) {
return mobileFallbackPath
}
return normalizedRedirect ?? DEFAULT_DESKTOP_PATH
}