feat(rbac): role-based access control module (#14310)

This commit is contained in:
Carlos R. L. Rodrigues
2026-01-07 05:36:39 -03:00
committed by GitHub
parent d6d7d14a6a
commit 1bfde8dc57
74 changed files with 4186 additions and 3 deletions
+1
View File
@@ -21,6 +21,7 @@ export * from "./pricing"
export * from "./product"
export * from "./product-category"
export * from "./promotion"
export * from "./rbac"
export * from "./region"
export * from "./reservation"
export * from "./return-reason"
@@ -0,0 +1,2 @@
export * from "./steps"
export * from "./workflows"
@@ -0,0 +1,40 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type CreateRbacPolicyDTO = {
key: string
resource: string
operation: string
name?: string | null
description?: string | null
metadata?: Record<string, unknown> | null
}
export type CreateRbacPoliciesStepInput = {
policies: CreateRbacPolicyDTO[]
}
export const createRbacPoliciesStepId = "create-rbac-policies"
export const createRbacPoliciesStep = createStep(
createRbacPoliciesStepId,
async (data: CreateRbacPoliciesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const created = await service.createRbacPolicies(data.policies)
return new StepResponse(
created,
(created ?? []).map((p) => p.id)
)
},
async (createdIds: string[] | undefined, { container }) => {
if (!createdIds?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacPolicies(createdIds)
}
)
@@ -0,0 +1,43 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type CreateRbacRoleInheritanceDTO = {
role_id: string
inherited_role_id: string
metadata?: Record<string, unknown> | null
}
export type CreateRbacRoleInheritancesStepInput = {
role_inheritances: CreateRbacRoleInheritanceDTO[]
}
export const createRbacRoleInheritancesStepId = "create-rbac-role-inheritances"
export const createRbacRoleInheritancesStep = createStep(
createRbacRoleInheritancesStepId,
async (data: CreateRbacRoleInheritancesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
if (!data.role_inheritances || data.role_inheritances.length === 0) {
return new StepResponse([], [])
}
const created = await service.createRbacRoleInheritances(
data.role_inheritances
)
return new StepResponse(
created,
(created ?? []).map((ri) => ri.id)
)
},
async (createdIds: string[] | undefined, { container }) => {
if (!createdIds?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacRoleInheritances(createdIds)
}
)
@@ -0,0 +1,37 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type CreateRbacRolePolicyDTO = {
role_id: string
scope_id: string
metadata?: Record<string, unknown> | null
}
export type CreateRbacRolePoliciesStepInput = {
role_policies: CreateRbacRolePolicyDTO[]
}
export const createRbacRolePoliciesStepId = "create-rbac-role-policies"
export const createRbacRolePoliciesStep = createStep(
createRbacRolePoliciesStepId,
async (data: CreateRbacRolePoliciesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const created = await service.createRbacRolePolicies(data.role_policies)
return new StepResponse(
created,
(created ?? []).map((rp) => rp.id)
)
},
async (createdIds: string[] | undefined, { container }) => {
if (!createdIds?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacRolePolicies(createdIds)
}
)
@@ -0,0 +1,37 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type CreateRbacRoleDTO = {
name: string
description?: string | null
metadata?: Record<string, unknown> | null
}
export type CreateRbacRolesStepInput = {
roles: CreateRbacRoleDTO[]
}
export const createRbacRolesStepId = "create-rbac-roles"
export const createRbacRolesStep = createStep(
createRbacRolesStepId,
async (data: CreateRbacRolesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const created = await service.createRbacRoles(data.roles)
return new StepResponse(
created,
(created ?? []).map((r) => r.id)
)
},
async (createdIds: string[] | undefined, { container }) => {
if (!createdIds?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacRoles(createdIds)
}
)
@@ -0,0 +1,17 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type DeleteRbacPoliciesStepInput = string[]
export const deleteRbacPoliciesStepId = "delete-rbac-policies"
export const deleteRbacPoliciesStep = createStep(
{ name: deleteRbacPoliciesStepId, noCompensation: true },
async (ids: DeleteRbacPoliciesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacPolicies(ids)
return new StepResponse(void 0)
},
async () => {}
)
@@ -0,0 +1,17 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type DeleteRbacRolePoliciesStepInput = string[]
export const deleteRbacRolePoliciesStepId = "delete-rbac-role-policies"
export const deleteRbacRolePoliciesStep = createStep(
{ name: deleteRbacRolePoliciesStepId, noCompensation: true },
async (ids: DeleteRbacRolePoliciesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacRolePolicies(ids)
return new StepResponse(void 0)
},
async () => {}
)
@@ -0,0 +1,17 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type DeleteRbacRolesStepInput = string[]
export const deleteRbacRolesStepId = "delete-rbac-roles"
export const deleteRbacRolesStep = createStep(
{ name: deleteRbacRolesStepId, noCompensation: true },
async (ids: DeleteRbacRolesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
await service.deleteRbacRoles(ids)
return new StepResponse(void 0)
},
async () => {}
)
@@ -0,0 +1,14 @@
export * from "./create-rbac-roles"
export * from "./delete-rbac-roles"
export * from "./update-rbac-roles"
export * from "./create-rbac-policies"
export * from "./delete-rbac-policies"
export * from "./update-rbac-policies"
export * from "./create-rbac-role-policies"
export * from "./delete-rbac-role-policies"
export * from "./update-rbac-role-policies"
export * from "./create-rbac-role-inheritances"
export * from "./set-role-inheritance"
@@ -0,0 +1,122 @@
import { Modules } from "@medusajs/framework/utils"
import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService } from "@medusajs/types"
export type SetRoleInheritanceStepInput = Array<{
role_id: string
inherited_role_ids: string[]
}>
export const setRoleInheritanceStepId = "set-role-inheritance"
export const setRoleInheritanceStep = createStep(
setRoleInheritanceStepId,
async (data: SetRoleInheritanceStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const allCompensationData: Array<{
role_id: string
previousInheritedRoleIds: string[]
}> = []
if (!data || data.length === 0) {
return new StepResponse(
{ created: [], removedCount: 0 },
allCompensationData
)
}
const allToRemoveIds: string[] = []
const allToCreate: Array<{
role_id: string
inherited_role_id: string
}> = []
for (const roleData of data) {
const existingInheritance = await service.listRbacRoleInheritances({
role_id: roleData.role_id,
})
const existingInheritedRoleIds = existingInheritance.map(
(ri) => ri.inherited_role_id
)
allCompensationData.push({
role_id: roleData.role_id,
previousInheritedRoleIds: existingInheritedRoleIds,
})
const toAdd = roleData.inherited_role_ids.filter(
(id) => !existingInheritedRoleIds.includes(id)
)
const toRemove = existingInheritedRoleIds.filter(
(id) => !roleData.inherited_role_ids.includes(id)
)
if (toRemove.length > 0) {
const toRemoveRecords = existingInheritance.filter((ri) =>
toRemove.includes(ri.inherited_role_id)
)
allToRemoveIds.push(...toRemoveRecords.map((ri) => ri.id))
}
if (toAdd.length > 0) {
allToCreate.push(
...toAdd.map((inherited_role_id) => ({
role_id: roleData.role_id,
inherited_role_id,
}))
)
}
}
if (allToRemoveIds.length > 0) {
await service.deleteRbacRoleInheritances(allToRemoveIds)
}
let created: any[] = []
if (allToCreate.length > 0) {
created = await service.createRbacRoleInheritances(allToCreate)
}
return new StepResponse(
{ created, removedCount: allToRemoveIds.length },
allCompensationData
)
},
async (
compensationData:
| Array<{ role_id: string; previousInheritedRoleIds: string[] }>
| undefined,
{ container }
) => {
if (!compensationData || compensationData.length === 0) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
for (const roleCompensation of compensationData) {
const currentInheritance = await service.listRbacRoleInheritances({
role_id: roleCompensation.role_id,
})
if (currentInheritance.length > 0) {
await service.deleteRbacRoleInheritances(
currentInheritance.map((ri) => ri.id)
)
}
if (roleCompensation.previousInheritedRoleIds.length > 0) {
await service.createRbacRoleInheritances(
roleCompensation.previousInheritedRoleIds.map(
(inherited_role_id) => ({
role_id: roleCompensation.role_id,
inherited_role_id,
})
)
)
}
}
}
)
@@ -0,0 +1,61 @@
import {
getSelectsAndRelationsFromObjectArray,
Modules,
} from "@medusajs/framework/utils"
import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService, UpdateRbacPolicyDTO } from "@medusajs/types"
export type UpdateRbacPoliciesStepInput = {
selector: Record<string, any>
update: Omit<UpdateRbacPolicyDTO, "id">
}
export const updateRbacPoliciesStepId = "update-rbac-policies"
export const updateRbacPoliciesStep = createStep(
updateRbacPoliciesStepId,
async (data: UpdateRbacPoliciesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const { selects, relations } = getSelectsAndRelationsFromObjectArray([
data.update,
])
const prevData = await service.listRbacPolicies(data.selector, {
select: selects,
relations,
})
const updates = (prevData ?? []).map((p) => ({
id: p.id,
...data.update,
})) as UpdateRbacPolicyDTO[]
const updated = await service.updateRbacPolicies(updates)
return new StepResponse(updated, {
prevData,
updateKeys: Object.keys(data.update ?? {}),
})
},
async (
compensationData: { prevData: any[]; updateKeys: string[] } | undefined,
{ container }
) => {
if (!compensationData?.prevData?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const updates = compensationData.prevData.map((p) => {
const payload: Record<string, any> = { id: p.id }
for (const key of compensationData.updateKeys) {
payload[key] = p[key]
}
return payload
}) as UpdateRbacPolicyDTO[]
await service.updateRbacPolicies(updates)
}
)
@@ -0,0 +1,61 @@
import {
getSelectsAndRelationsFromObjectArray,
Modules,
} from "@medusajs/framework/utils"
import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService, UpdateRbacRolePolicyDTO } from "@medusajs/types"
export type UpdateRbacRolePoliciesStepInput = {
selector: Record<string, any>
update: Omit<UpdateRbacRolePolicyDTO, "id">
}
export const updateRbacRolePoliciesStepId = "update-rbac-role-policies"
export const updateRbacRolePoliciesStep = createStep(
updateRbacRolePoliciesStepId,
async (data: UpdateRbacRolePoliciesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const { selects, relations } = getSelectsAndRelationsFromObjectArray([
data.update,
])
const prevData = await service.listRbacRolePolicies(data.selector, {
select: selects,
relations,
})
const updates = (prevData ?? []).map((rp) => ({
id: rp.id,
...data.update,
})) as UpdateRbacRolePolicyDTO[]
const updated = await service.updateRbacRolePolicies(updates)
return new StepResponse(updated, {
prevData,
updateKeys: Object.keys(data.update ?? {}),
})
},
async (
compensationData: { prevData: any[]; updateKeys: string[] } | undefined,
{ container }
) => {
if (!compensationData?.prevData?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const updates = compensationData.prevData.map((rp) => {
const payload: Record<string, any> = { id: rp.id }
for (const key of compensationData.updateKeys) {
payload[key] = rp[key]
}
return payload
}) as UpdateRbacRolePolicyDTO[]
await service.updateRbacRolePolicies(updates)
}
)
@@ -0,0 +1,61 @@
import {
getSelectsAndRelationsFromObjectArray,
Modules,
} from "@medusajs/framework/utils"
import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk"
import { IRbacModuleService, UpdateRbacRoleDTO } from "@medusajs/types"
export type UpdateRbacRolesStepInput = {
selector: Record<string, any>
update: Omit<UpdateRbacRoleDTO, "id">
}
export const updateRbacRolesStepId = "update-rbac-roles"
export const updateRbacRolesStep = createStep(
updateRbacRolesStepId,
async (data: UpdateRbacRolesStepInput, { container }) => {
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const { selects, relations } = getSelectsAndRelationsFromObjectArray([
data.update,
])
const prevData = await service.listRbacRoles(data.selector, {
select: selects,
relations,
})
const updates = (prevData ?? []).map((r) => ({
id: r.id,
...data.update,
})) as UpdateRbacRoleDTO[]
const updated = await service.updateRbacRoles(updates)
return new StepResponse(updated, {
prevData,
updateKeys: Object.keys(data.update ?? {}),
})
},
async (
compensationData: { prevData: any[]; updateKeys: string[] } | undefined,
{ container }
) => {
if (!compensationData?.prevData?.length) {
return
}
const service = container.resolve<IRbacModuleService>(Modules.RBAC)
const updates = compensationData.prevData.map((r) => {
const payload: Record<string, any> = { id: r.id }
for (const key of compensationData.updateKeys) {
payload[key] = r[key]
}
return payload
}) as UpdateRbacRoleDTO[]
await service.updateRbacRoles(updates)
}
)
@@ -0,0 +1,19 @@
import {
WorkflowData,
WorkflowResponse,
createWorkflow,
} from "@medusajs/framework/workflows-sdk"
import { createRbacPoliciesStep } from "../steps"
export type CreateRbacPoliciesWorkflowInput = {
policies: any[]
}
export const createRbacPoliciesWorkflowId = "create-rbac-policies"
export const createRbacPoliciesWorkflow = createWorkflow(
createRbacPoliciesWorkflowId,
(input: WorkflowData<CreateRbacPoliciesWorkflowInput>) => {
return new WorkflowResponse(createRbacPoliciesStep(input))
}
)
@@ -0,0 +1,19 @@
import {
WorkflowData,
WorkflowResponse,
createWorkflow,
} from "@medusajs/framework/workflows-sdk"
import { createRbacRolePoliciesStep } from "../steps"
export type CreateRbacRolePoliciesWorkflowInput = {
role_policies: any[]
}
export const createRbacRolePoliciesWorkflowId = "create-rbac-role-policies"
export const createRbacRolePoliciesWorkflow = createWorkflow(
createRbacRolePoliciesWorkflowId,
(input: WorkflowData<CreateRbacRolePoliciesWorkflowInput>) => {
return new WorkflowResponse(createRbacRolePoliciesStep(input))
}
)
@@ -0,0 +1,80 @@
import {
WorkflowData,
WorkflowResponse,
createWorkflow,
transform,
} from "@medusajs/framework/workflows-sdk"
import {
createRbacRoleInheritancesStep,
createRbacRolePoliciesStep,
createRbacRolesStep,
} from "../steps"
export type CreateRbacRolesWorkflowInput = {
roles: {
name: string
description?: string | null
metadata?: Record<string, unknown> | null
inherited_role_ids?: string[]
policy_ids?: string[]
}[]
}
export const createRbacRolesWorkflowId = "create-rbac-roles"
export const createRbacRolesWorkflow = createWorkflow(
createRbacRolesWorkflowId,
(input: WorkflowData<CreateRbacRolesWorkflowInput>) => {
const roleData = transform({ input }, ({ input }) => ({
roles: input.roles.map((r) => ({
name: r.name,
description: r.description,
metadata: r.metadata,
})),
}))
const createdRoles = createRbacRolesStep(roleData)
const inheritanceData = transform(
{ input, createdRoles },
({ input, createdRoles }) => {
const inheritances: any[] = []
createdRoles.forEach((role, index) => {
const inheritedRoleIds = input.roles[index].inherited_role_ids || []
inheritedRoleIds.forEach((inheritedRoleId) => {
inheritances.push({
role_id: role.id,
inherited_role_id: inheritedRoleId,
})
})
})
return { role_inheritances: inheritances }
}
)
const policiesData = transform(
{ input, createdRoles },
({ input, createdRoles }) => {
const allPolicies: any[] = []
createdRoles.forEach((role, index) => {
const policyIds = input.roles[index].policy_ids || []
policyIds.forEach((policy_id) => {
allPolicies.push({
role_id: role.id,
scope_id: policy_id,
})
})
})
return { role_policies: allPolicies }
}
)
createRbacRoleInheritancesStep(inheritanceData)
createRbacRolePoliciesStep(policiesData)
return new WorkflowResponse(createdRoles)
}
)
@@ -0,0 +1,17 @@
import { WorkflowData, createWorkflow } from "@medusajs/framework/workflows-sdk"
import { deleteRbacPoliciesStep } from "../steps"
export type DeleteRbacPoliciesWorkflowInput = {
ids: string[]
}
export const deleteRbacPoliciesWorkflowId = "delete-rbac-policies"
export const deleteRbacPoliciesWorkflow = createWorkflow(
deleteRbacPoliciesWorkflowId,
(
input: WorkflowData<DeleteRbacPoliciesWorkflowInput>
): WorkflowData<void> => {
deleteRbacPoliciesStep(input.ids)
}
)
@@ -0,0 +1,17 @@
import { WorkflowData, createWorkflow } from "@medusajs/framework/workflows-sdk"
import { deleteRbacRolePoliciesStep } from "../steps"
export type DeleteRbacRolePoliciesWorkflowInput = {
ids: string[]
}
export const deleteRbacRolePoliciesWorkflowId = "delete-rbac-role-policies"
export const deleteRbacRolePoliciesWorkflow = createWorkflow(
deleteRbacRolePoliciesWorkflowId,
(
input: WorkflowData<DeleteRbacRolePoliciesWorkflowInput>
): WorkflowData<void> => {
deleteRbacRolePoliciesStep(input.ids)
}
)
@@ -0,0 +1,15 @@
import { WorkflowData, createWorkflow } from "@medusajs/framework/workflows-sdk"
import { deleteRbacRolesStep } from "../steps"
export type DeleteRbacRolesWorkflowInput = {
ids: string[]
}
export const deleteRbacRolesWorkflowId = "delete-rbac-roles"
export const deleteRbacRolesWorkflow = createWorkflow(
deleteRbacRolesWorkflowId,
(input: WorkflowData<DeleteRbacRolesWorkflowInput>): WorkflowData<void> => {
deleteRbacRolesStep(input.ids)
}
)
@@ -0,0 +1,11 @@
export * from "./create-rbac-roles"
export * from "./delete-rbac-roles"
export * from "./update-rbac-roles"
export * from "./create-rbac-policies"
export * from "./delete-rbac-policies"
export * from "./update-rbac-policies"
export * from "./create-rbac-role-policies"
export * from "./delete-rbac-role-policies"
export * from "./update-rbac-role-policies"
@@ -0,0 +1,21 @@
import {
WorkflowData,
WorkflowResponse,
createWorkflow,
} from "@medusajs/framework/workflows-sdk"
import { UpdateRbacPolicyDTO } from "@medusajs/types"
import { updateRbacPoliciesStep } from "../steps/update-rbac-policies"
export type UpdateRbacPoliciesWorkflowInput = {
selector: Record<string, any>
update: Omit<UpdateRbacPolicyDTO, "id">
}
export const updateRbacPoliciesWorkflowId = "update-rbac-policies"
export const updateRbacPoliciesWorkflow = createWorkflow(
updateRbacPoliciesWorkflowId,
(input: WorkflowData<UpdateRbacPoliciesWorkflowInput>) => {
return new WorkflowResponse(updateRbacPoliciesStep(input))
}
)
@@ -0,0 +1,21 @@
import {
WorkflowData,
WorkflowResponse,
createWorkflow,
} from "@medusajs/framework/workflows-sdk"
import { UpdateRbacRolePolicyDTO } from "@medusajs/types"
import { updateRbacRolePoliciesStep } from "../steps/update-rbac-role-policies"
export type UpdateRbacRolePoliciesWorkflowInput = {
selector: Record<string, any>
update: Omit<UpdateRbacRolePolicyDTO, "id">
}
export const updateRbacRolePoliciesWorkflowId = "update-rbac-role-policies"
export const updateRbacRolePoliciesWorkflow = createWorkflow(
updateRbacRolePoliciesWorkflowId,
(input: WorkflowData<UpdateRbacRolePoliciesWorkflowInput>) => {
return new WorkflowResponse(updateRbacRolePoliciesStep(input))
}
)
@@ -0,0 +1,77 @@
import { isDefined } from "@medusajs/framework/utils"
import {
WorkflowData,
WorkflowResponse,
createWorkflow,
transform,
} from "@medusajs/framework/workflows-sdk"
import { UpdateRbacRoleDTO } from "@medusajs/types"
import { createRbacRolePoliciesStep, setRoleInheritanceStep } from "../steps"
import { updateRbacRolesStep } from "../steps/update-rbac-roles"
export type UpdateRbacRolesWorkflowInput = {
selector: Record<string, any>
update: Omit<UpdateRbacRoleDTO, "id"> & {
inherited_role_ids?: string[]
policy_ids?: string[]
}
}
export const updateRbacRolesWorkflowId = "update-rbac-roles"
export const updateRbacRolesWorkflow = createWorkflow(
updateRbacRolesWorkflowId,
(input: WorkflowData<UpdateRbacRolesWorkflowInput>) => {
const roleUpdateData = transform({ input }, ({ input }) => ({
selector: input.selector,
update: {
name: input.update.name,
description: input.update.description,
metadata: input.update.metadata,
},
}))
const updatedRoles = updateRbacRolesStep(roleUpdateData)
const inheritanceUpdateData = transform(
{ input, updatedRoles },
({ input, updatedRoles }) => {
if (!isDefined(input.update.inherited_role_ids)) {
return []
}
return updatedRoles.map((role) => ({
role_id: role.id,
inherited_role_ids: input.update.inherited_role_ids || [],
}))
}
)
setRoleInheritanceStep(inheritanceUpdateData)
const policiesUpdateData = transform(
{ input, updatedRoles },
({ input, updatedRoles }) => {
if (!isDefined(input.update.policy_ids)) {
return { role_policies: [] }
}
const allPolicies: any[] = []
updatedRoles.forEach((role) => {
const policyIds = input.update.policy_ids || []
policyIds.forEach((policy_id) => {
allPolicies.push({
role_id: role.id,
scope_id: policy_id,
})
})
})
return { role_policies: allPolicies }
}
)
createRbacRolePoliciesStep(policiesUpdateData)
return new WorkflowResponse(updatedRoles)
}
)