Skip to content

Commit f082e6e

Browse files
authored
Merge pull request #36 from PropelAuth/feat/multi-role
multi role support
2 parents 3ff8a71 + 3d18d8e commit f082e6e

File tree

7 files changed

+162
-14
lines changed

7 files changed

+162
-14
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api/org.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ export type AddUserToOrgRequest = {
152152
userId: string
153153
orgId: string
154154
role: string
155+
additionalRoles?: string[]
155156
}
156157

157158
export function addUserToOrg(
@@ -163,6 +164,7 @@ export function addUserToOrg(
163164
user_id: addUserToOrgRequest.userId,
164165
org_id: addUserToOrgRequest.orgId,
165166
role: addUserToOrgRequest.role,
167+
additional_roles: addUserToOrgRequest.additionalRoles ?? [],
166168
}
167169
return httpRequest(authUrl, integrationApiKey, `${ENDPOINT_PATH}/add_user`, "POST", JSON.stringify(request)).then(
168170
(httpResponse) => {
@@ -185,6 +187,7 @@ export type ChangeUserRoleInOrgRequest = {
185187
userId: string
186188
orgId: string
187189
role: string
190+
additionalRoles?: string[]
188191
}
189192

190193
export function changeUserRoleInOrg(
@@ -196,6 +199,7 @@ export function changeUserRoleInOrg(
196199
user_id: changeUserRoleInOrgRequest.userId,
197200
org_id: changeUserRoleInOrgRequest.orgId,
198201
role: changeUserRoleInOrgRequest.role,
202+
additional_roles: changeUserRoleInOrgRequest.additionalRoles ?? [],
199203
}
200204
return httpRequest(
201205
authUrl,

src/api/user.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ export type InviteUserToOrgRequest = {
278278
orgId: string
279279
email: string
280280
role: string
281+
additionalRoles?: string[]
281282
}
282283

283284
export function inviteUserToOrg(
@@ -289,6 +290,7 @@ export function inviteUserToOrg(
289290
org_id: inviteUserToOrgRequest.orgId,
290291
email: inviteUserToOrgRequest.email,
291292
role: inviteUserToOrgRequest.role,
293+
additional_roles: inviteUserToOrgRequest.additionalRoles ?? [],
292294
}
293295

294296
return httpRequest(authUrl, integrationApiKey, `/api/backend/v1/invite_user`, "POST", JSON.stringify(body)).then(

src/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
export { AccessToken, CreateAccessTokenRequest } from "./api/accessToken"
22
export { CreateMagicLinkRequest, MagicLink } from "./api/magicLink"
3-
export { OrgQuery, OrgQueryResponse } from "./api/org"
3+
export {
4+
OrgQuery,
5+
OrgQueryResponse,
6+
AddUserToOrgRequest,
7+
ChangeUserRoleInOrgRequest,
8+
} from "./api/org"
49
export { TokenVerificationMetadata } from "./api/tokenVerificationMetadata"
510
export {
611
CreateUserRequest,
@@ -50,6 +55,7 @@ export {
5055
Organization,
5156
OrgIdToOrgMemberInfo,
5257
OrgMemberInfo,
58+
OrgRoleStructure,
5359
toOrgIdToOrgMemberInfo,
5460
toUser,
5561
User,

src/user.ts

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,22 @@ export type UserMetadata = {
212212
properties?: { [key: string]: unknown }
213213
}
214214

215+
export enum OrgRoleStructure {
216+
SingleRole = "single_role_in_hierarchy",
217+
MultiRole = "multi_role",
218+
}
219+
215220
export class OrgMemberInfo {
216221
public readonly orgId: string
217222
public readonly orgName: string
218223
public readonly orgMetadata: { [key: string]: unknown }
219224
public readonly urlSafeOrgName: string
225+
public readonly orgRoleStructure: OrgRoleStructure
220226

221227
private readonly userAssignedRole: string
222228
private readonly userInheritedRolesPlusCurrentRole: string[]
223229
private readonly userPermissions: string[]
230+
private readonly userAssignedAdditionalRoles: string[]
224231

225232
constructor(
226233
orgId: string,
@@ -229,7 +236,9 @@ export class OrgMemberInfo {
229236
urlSafeOrgName: string,
230237
userAssignedRole: string,
231238
userInheritedRolesPlusCurrentRole: string[],
232-
userPermissions: string[]
239+
userPermissions: string[],
240+
orgRoleStructure?: OrgRoleStructure,
241+
userAssignedAdditionalRoles?: string[]
233242
) {
234243
this.orgId = orgId
235244
this.orgName = orgName
@@ -239,6 +248,8 @@ export class OrgMemberInfo {
239248
this.userAssignedRole = userAssignedRole
240249
this.userInheritedRolesPlusCurrentRole = userInheritedRolesPlusCurrentRole
241250
this.userPermissions = userPermissions
251+
this.orgRoleStructure = orgRoleStructure ?? OrgRoleStructure.SingleRole
252+
this.userAssignedAdditionalRoles = userAssignedAdditionalRoles ?? []
242253
}
243254

244255
// getters
@@ -251,16 +262,28 @@ export class OrgMemberInfo {
251262
}
252263

253264
get inheritedRolesPlusCurrentRole(): string[] {
254-
return this.userInheritedRolesPlusCurrentRole
265+
if (this.orgRoleStructure === OrgRoleStructure.MultiRole) {
266+
return this.userAssignedAdditionalRoles.concat(this.userAssignedRole)
267+
} else {
268+
return this.userInheritedRolesPlusCurrentRole
269+
}
255270
}
256271

257272
// validation methods
258273
public isRole(role: string): boolean {
259-
return this.userAssignedRole === role
274+
if (this.orgRoleStructure === OrgRoleStructure.MultiRole) {
275+
return this.userAssignedRole === role || this.userAssignedAdditionalRoles.includes(role)
276+
} else {
277+
return this.userAssignedRole === role
278+
}
260279
}
261280

262281
public isAtLeastRole(role: string): boolean {
263-
return this.userInheritedRolesPlusCurrentRole.includes(role)
282+
if (this.orgRoleStructure === OrgRoleStructure.MultiRole) {
283+
return this.userAssignedRole === role || this.userAssignedAdditionalRoles.includes(role)
284+
} else {
285+
return this.userInheritedRolesPlusCurrentRole.includes(role)
286+
}
264287
}
265288

266289
public hasPermission(permission: string): boolean {
@@ -281,7 +304,9 @@ export class OrgMemberInfo {
281304
obj.urlSafeOrgName,
282305
obj.userAssignedRole,
283306
obj.userInheritedRolesPlusCurrentRole,
284-
obj.userPermissions
307+
obj.userPermissions,
308+
obj.orgRoleStructure,
309+
obj.userAssignedAdditionalRoles
285310
)
286311
} catch (e) {
287312
console.error(
@@ -309,9 +334,11 @@ export type InternalOrgMemberInfo = {
309334
org_name: string
310335
org_metadata: { [key: string]: any }
311336
url_safe_org_name: string
337+
org_role_structure: OrgRoleStructure
312338
user_role: string
313339
inherited_user_roles_plus_current_role: string[]
314340
user_permissions: string[]
341+
additional_roles: string[]
315342
}
316343

317344
// This type is used to represent the user returned from the refresh token.
@@ -382,7 +409,9 @@ export function toOrgIdToOrgMemberInfo(snake_case?: {
382409
snakeCaseValue.url_safe_org_name,
383410
snakeCaseValue.user_role,
384411
snakeCaseValue.inherited_user_roles_plus_current_role,
385-
snakeCaseValue.user_permissions
412+
snakeCaseValue.user_permissions,
413+
snakeCaseValue.org_role_structure,
414+
snakeCaseValue.additional_roles
386415
)
387416
}
388417
}

src/utils.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ function isOrgMemberInfo(value: any) {
4747
value.hasOwnProperty("urlSafeOrgName") &&
4848
value.hasOwnProperty("orgMetadata") &&
4949
value.hasOwnProperty("userAssignedRole") &&
50-
value.hasOwnProperty("userRoles") &&
50+
value.hasOwnProperty("userInheritedRoles") &&
5151
value.hasOwnProperty("userPermissions")
5252
)
5353
}
@@ -72,16 +72,18 @@ function processKeys(obj: any): any {
7272
value["orgMetadata"],
7373
value["urlSafeOrgName"],
7474
value["userAssignedRole"],
75-
value["userRoles"],
76-
value["userPermissions"]
75+
value["userInheritedRoles"],
76+
value["userPermissions"],
77+
value["orgRoleStructure"],
78+
value["additionalRoles"]
7779
)
7880
}
7981

8082
let newKey
8183
if (key === "user_role") {
8284
newKey = "userAssignedRole"
8385
} else if (key === "inherited_user_roles_plus_current_role") {
84-
newKey = "userRoles"
86+
newKey = "userInheritedRoles"
8587
} else {
8688
newKey = camelCase(key)
8789
}

0 commit comments

Comments
 (0)