grafana/public/app/api/clients/roles/index.ts
Yudintsev George (Egor) e124ee79f4
Chore: RBAC: Migrate role picker to rtkq (#116571)
What is this feature?

This PR introduce refactoring for role picker for teams and users. It uses RTK Query.
The related task: grafana/identity-access-team#1821

The previous PR with related logic: #113783

Why do we need this feature?

This refactoring is a cleaner way for handing refetching.
2026-02-03 13:46:41 +00:00

75 lines
2.5 KiB
TypeScript

import { FetchBaseQueryError } from '@reduxjs/toolkit/query';
import { generatedAPI, RoleDto } from '@grafana/api-clients/rtkq/legacy';
import { isFetchError } from '@grafana/runtime';
import { addDisplayNameForFixedRole, addFilteredDisplayName } from 'app/core/utils/roles';
import { Role } from 'app/types/accessControl';
const transformRolesResponse = (response: RoleDto[]): Role[] => {
if (!response?.length) {
return [];
}
return response.map(addFilteredDisplayName).map(addDisplayNameForFixedRole);
};
const transformRolesError = (error: FetchBaseQueryError) => {
if (isFetchError(error)) {
error.isHandled = true;
}
return error;
};
// rolesAPI is needed to be overriden to add transformResponse and transformErrorResponse for some endpoints.
export const rolesAPI = generatedAPI.injectEndpoints({
overrideExisting: true,
endpoints: (build) => ({
listUserRoles: build.query<
Role[],
{ userId: number; includeHidden?: boolean; includeMapped?: boolean; targetOrgId?: number }
>({
query: (queryArg) => ({
url: `/access-control/users/${queryArg.userId}/roles`,
params: {
includeHidden: queryArg.includeHidden,
includeMapped: queryArg.includeMapped,
targetOrgId: queryArg.targetOrgId,
},
}),
providesTags: ['access_control', 'enterprise'],
transformResponse: transformRolesResponse,
transformErrorResponse: transformRolesError,
}),
listTeamRoles: build.query<Role[], { teamId: number; includeHidden?: boolean; targetOrgId?: number }>({
query: (queryArg) => ({
url: `/access-control/teams/${queryArg.teamId}/roles`,
params: {
includeHidden: queryArg.includeHidden,
targetOrgId: queryArg.targetOrgId,
},
}),
providesTags: ['access_control', 'enterprise'],
transformResponse: transformRolesResponse,
transformErrorResponse: transformRolesError,
}),
listRoles: build.query<Role[], { delegatable?: boolean; includeHidden?: boolean; targetOrgId?: number }>({
query: (queryArg) => ({
url: '/access-control/roles',
params: {
delegatable: queryArg.delegatable,
includeHidden: queryArg.includeHidden,
targetOrgId: queryArg.targetOrgId,
},
}),
providesTags: ['access_control', 'enterprise'],
transformResponse: transformRolesResponse,
}),
}),
});
export const {
useListTeamRolesQuery,
useSetTeamRolesMutation,
useListUserRolesQuery,
useSetUserRolesMutation,
useListRolesQuery,
} = rolesAPI;