Skip to content

Commit 6e61cef

Browse files
authored
Fix: [AEA-5861] - Support child activity & baseline role codes (#1413)
## Summary - Routine Change - ⚠️ Potential issues that might be caused by this change ### Details Adds support to allow access for users with child activity or baseline role codes
1 parent ad182a3 commit 6e61cef

File tree

5 files changed

+539
-36
lines changed

5 files changed

+539
-36
lines changed

packages/common/commonTypes/src/trackerUserInfo.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
export type RoleDetails = {
2-
role_name?: string;
3-
role_id?: string;
4-
org_code?: string;
5-
org_name?: string;
6-
site_name?: string;
7-
site_address?: string;
2+
role_name?: string
3+
role_id?: string
4+
role_code?: string
5+
activity_codes?: Array<string>
6+
org_code?: string
7+
org_name?: string
8+
site_name?: string
9+
site_address?: string
810
};
911

1012
export type UserDetails = {
11-
family_name: string;
12-
given_name: string;
13-
sub?: string;
14-
name?: string;
13+
family_name: string
14+
given_name: string
15+
sub?: string
16+
name?: string
1517
};
1618

1719
export type TrackerUserInfo = {
18-
roles_with_access: Array<RoleDetails>;
19-
roles_without_access: Array<RoleDetails>;
20-
currently_selected_role?: RoleDetails;
21-
user_details: UserDetails;
22-
multiple_sessions?: boolean;
23-
is_concurrent_session?: boolean;
24-
sessionId?: string;
25-
error?: string | null;
20+
roles_with_access: Array<RoleDetails>
21+
roles_without_access: Array<RoleDetails>
22+
currently_selected_role?: RoleDetails
23+
user_details: UserDetails
24+
multiple_sessions?: boolean
25+
is_concurrent_session?: boolean
26+
sessionId?: string
27+
error?: string | null
2628
};
2729

2830
export type TrackerUserInfoResult = {
Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
interface ActivityCode {
2+
baselineRoleCodes: Array<string>
3+
childActivityCodes: Record<string, ActivityCode>
4+
}
5+
6+
export interface RBACHierarchy {
7+
[key: string]: ActivityCode
8+
}
9+
10+
//--B0570 derived codes - Perform Pharmacy Activities
11+
const B0571: ActivityCode = {
12+
baselineRoleCodes: [],
13+
childActivityCodes: {}
14+
}
15+
16+
const B0572: ActivityCode = {
17+
baselineRoleCodes: [
18+
"R8003", "R8008"
19+
],
20+
childActivityCodes: {}
21+
}
22+
23+
const B0570: ActivityCode = {
24+
baselineRoleCodes: [
25+
"R8004"
26+
],
27+
childActivityCodes: {
28+
B0571, B0572
29+
}
30+
}
31+
//--B0278 derived codes - Perform Prescription Preparation
32+
const B0058: ActivityCode = {
33+
baselineRoleCodes: ["R8008"],
34+
childActivityCodes: {}
35+
}
36+
37+
const B0420: ActivityCode = {
38+
baselineRoleCodes: [
39+
"R0260", "R0270", "R6200", "R6300", "R1547",
40+
"R8000"
41+
],
42+
childActivityCodes: {}
43+
}
44+
45+
const B0440: ActivityCode = {
46+
baselineRoleCodes: [],
47+
childActivityCodes: {}
48+
}
49+
50+
const B0278: ActivityCode = {
51+
baselineRoleCodes: [
52+
"R0260", "R0270", "R6200", "R6300", "R1547",
53+
"R8001", "R8002", "R0011", "R1560", "R1730",
54+
"R1740", "R1760"
55+
],
56+
childActivityCodes: {
57+
B0058, B0420, B0440
58+
}
59+
}
60+
61+
//--B0401 derived codes - View Patient Medication
62+
const B0055: ActivityCode = {
63+
baselineRoleCodes: [],
64+
childActivityCodes: {}
65+
}
66+
67+
const B8029: ActivityCode = {
68+
baselineRoleCodes: [
69+
"R8000"
70+
],
71+
childActivityCodes: {}
72+
}
73+
74+
const B8028: ActivityCode = {
75+
baselineRoleCodes: [
76+
"R8000", "R8002"
77+
],
78+
childActivityCodes: {
79+
B8029
80+
}
81+
}
82+
83+
const B0380: ActivityCode = {
84+
baselineRoleCodes: [
85+
"R0260", "R0270", "R6200", "R6300", "R0620",
86+
"R0630", "R0690", "R0700", "R0680", "R0018",
87+
"R0750", "R0790", "R0950", "R1110", "R0955",
88+
"R1540", "R1543", "R1547", "R1590", "R8001",
89+
"R8002", "R8003", "R8016", "R8017", "R8006",
90+
"R8008", "R8014"
91+
],
92+
childActivityCodes: {
93+
B0055, B8028
94+
}
95+
}
96+
97+
const B0800: ActivityCode = {
98+
baselineRoleCodes: [
99+
"R8007", "R1984", "R6050", "R5007", "R6020",
100+
"R6070", "R7130", "R8013"
101+
102+
],
103+
childActivityCodes: {}
104+
}
105+
106+
const B0790: ActivityCode = {
107+
baselineRoleCodes: [
108+
"R0018", "R0750", "R0760", "R0770", "R0780",
109+
"R0790", "R0800", "R0810", "R0820", "R0950",
110+
"R0960", "R0970", "R0980", "R0990", "R1000",
111+
"R1010", "R1020", "R1110", "R1120", "R1130",
112+
"R1140", "R1070", "R1080", "R1090", "R1100",
113+
"R1190", "R1200", "R1210", "R1220", "R1230",
114+
"R1240", "R1250", "R1260", "R1030", "R1040",
115+
"R1050", "R1060", "R1150", "R1160", "R1170",
116+
"R1180", "R0710", "R0720", "R0730", "R0740",
117+
"R0830", "R0840", "R0850", "R0860", "R0870",
118+
"R0880", "R0890", "R0900", "R0910", "R0920",
119+
"R0930", "R0940", "R0955", "R0965", "R0975",
120+
"R0985", "R1280", "R1290", "R1300", "R1310",
121+
"R1390", "R1500", "R1510", "R6050", "R1982",
122+
"R1985", "R6060"
123+
],
124+
childActivityCodes: {
125+
B0380, B0800
126+
}
127+
}
128+
129+
const B0064: ActivityCode = {
130+
baselineRoleCodes: [],
131+
childActivityCodes: {}
132+
}
133+
134+
const B1694: ActivityCode = {
135+
baselineRoleCodes: [
136+
"R8000", "R8001", "R8002", "R8003", "R8014"
137+
],
138+
childActivityCodes: {
139+
B0064
140+
}
141+
}
142+
143+
const B1693: ActivityCode = {
144+
baselineRoleCodes: [
145+
"R8004", "R8006", "R8007", "R8008", "R8010",
146+
"R8011", "R8013"
147+
],
148+
childActivityCodes: {
149+
B1694
150+
}
151+
}
152+
153+
const B0071: ActivityCode = {
154+
baselineRoleCodes: [],
155+
childActivityCodes: {}
156+
}
157+
158+
const B1692: ActivityCode = {
159+
baselineRoleCodes: [],
160+
childActivityCodes: {
161+
B0071
162+
}
163+
}
164+
165+
const B0066: ActivityCode = {
166+
baselineRoleCodes: [],
167+
childActivityCodes: {
168+
B1692
169+
}
170+
}
171+
172+
const B1690: ActivityCode = {
173+
baselineRoleCodes: [],
174+
childActivityCodes: {
175+
B0380
176+
}
177+
}
178+
179+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
180+
const B0360: ActivityCode = {
181+
baselineRoleCodes: [
182+
"R0330", "R0340", "R0350", "R0360", "R0370",
183+
"R0380", "R0390", "R0400", "R0410", "R0420",
184+
"R0430", "R0440", "R0450", "R0460", "R0470",
185+
"R0480", "R0490", "R0500", "R0510", "R0520",
186+
"R0530", "R0550", "R6400", "R0580", "R0630",
187+
"R1540", "R1550", "R1480", "R1590", "R1630",
188+
"R1660", "R8004", "R8005", "R8014"
189+
],
190+
childActivityCodes: {
191+
B0790, B1693, B0066, B1690
192+
}
193+
}
194+
195+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
196+
const B0069: ActivityCode = {
197+
baselineRoleCodes: [],
198+
childActivityCodes: {
199+
B0380
200+
}
201+
}
202+
203+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
204+
const B0422: ActivityCode = {
205+
baselineRoleCodes: [
206+
"R0600", "R0690", "R0700", "R1540", "R8002"
207+
],
208+
childActivityCodes: {
209+
B0278
210+
}
211+
}
212+
213+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
214+
const B0468: ActivityCode = {
215+
baselineRoleCodes: [],
216+
childActivityCodes: {
217+
B0278
218+
}
219+
}
220+
221+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
222+
const B0429: ActivityCode = {
223+
baselineRoleCodes: [
224+
"R1290"
225+
],
226+
childActivityCodes: {}
227+
}
228+
229+
const B0401: ActivityCode = {
230+
baselineRoleCodes: [
231+
"R0260", "R0270", "R6200", "R6300", "R0370",
232+
"R0380", "R0390", "R0400", "R0410", "R6400",
233+
"R0600", "R0620", "R0630", "R0690", "R0700",
234+
"R0680", "R0018", "R0750", "R0760", "R0770",
235+
"R0780", "R0790", "R0800", "R0810", "R0820",
236+
"R0950", "R0960", "R0970", "R0980", "R1110",
237+
"R1120", "R1130", "R1140", "R0955", "R0965",
238+
"R0975", "R0985", "R1290", "R1540", "R1543",
239+
"R1547", "R1720", "R1730", "R1740", "R1760",
240+
"R1770"
241+
],
242+
// Don't accept B0401 child codes until wider scope of them is ok'ed
243+
childActivityCodes: {
244+
// B0360, B0069, B0422, B0468, B0429
245+
}
246+
}
247+
248+
export const rbacHierarchy: RBACHierarchy = {B0570, B0278, B0401}
249+
250+
const extractAccessCodes = (activityCode: ActivityCode): Array<Array<string>> => {
251+
let acceptedRoleCodes: Array<string> = []
252+
let acceptedActivityCodes: Array<string> = []
253+
254+
acceptedRoleCodes.push(...activityCode.baselineRoleCodes)
255+
for (const [childActivityCode, ChildActivityCodeInfo] of Object.entries(activityCode.childActivityCodes)){
256+
const [grandChildRoleCodes, grandChildActivityCodes] = extractAccessCodes(ChildActivityCodeInfo)
257+
acceptedRoleCodes.push(...grandChildRoleCodes)
258+
acceptedActivityCodes.push(childActivityCode, ...grandChildActivityCodes)
259+
}
260+
261+
return [acceptedRoleCodes, acceptedActivityCodes]
262+
}
263+
264+
export const extractAccessCodesFromHierarchy = (rbacHierarchy: RBACHierarchy) => {
265+
let allAcceptedRoleCodes: Array<string> = []
266+
let allAcceptedActivityCodes: Array<string> = []
267+
268+
for(const [activityCode, activityCodeInfo] of Object.entries(rbacHierarchy)){
269+
const [childRoleCodes, childActivityCodes] = extractAccessCodes(activityCodeInfo)
270+
allAcceptedRoleCodes.push(...childRoleCodes)
271+
allAcceptedActivityCodes.push(activityCode, ...childActivityCodes)
272+
}
273+
274+
// dedupe lists
275+
allAcceptedRoleCodes = [...new Set(allAcceptedRoleCodes)]
276+
allAcceptedActivityCodes = [...new Set(allAcceptedActivityCodes)]
277+
278+
return [allAcceptedRoleCodes, allAcceptedActivityCodes]
279+
}

0 commit comments

Comments
 (0)