actions.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { StoreState } from 'app/types';
  2. import { ThunkAction } from 'redux-thunk';
  3. import { getBackendSrv } from 'app/core/services/backend_srv';
  4. import {
  5. DashboardAcl,
  6. DashboardAclDTO,
  7. PermissionLevel,
  8. DashboardAclUpdateDTO,
  9. NewDashboardAclItem,
  10. } from 'app/types/acl';
  11. export enum ActionTypes {
  12. LoadDashboardPermissions = 'LOAD_DASHBOARD_PERMISSIONS',
  13. }
  14. export interface LoadDashboardPermissionsAction {
  15. type: ActionTypes.LoadDashboardPermissions;
  16. payload: DashboardAcl[];
  17. }
  18. export type Action = LoadDashboardPermissionsAction;
  19. type ThunkResult<R> = ThunkAction<R, StoreState, undefined, any>;
  20. export const loadDashboardPermissions = (items: DashboardAclDTO[]): LoadDashboardPermissionsAction => ({
  21. type: ActionTypes.LoadDashboardPermissions,
  22. payload: items,
  23. });
  24. export function getDashboardPermissions(id: number): ThunkResult<void> {
  25. return async dispatch => {
  26. const permissions = await getBackendSrv().get(`/api/dashboards/id/${id}/permissions`);
  27. dispatch(loadDashboardPermissions(permissions));
  28. };
  29. }
  30. function toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {
  31. return {
  32. userId: item.userId,
  33. teamId: item.teamId,
  34. role: item.role,
  35. permission: item.permission,
  36. };
  37. }
  38. export function updateDashboardPermission(
  39. dashboardId: number,
  40. itemToUpdate: DashboardAcl,
  41. level: PermissionLevel
  42. ): ThunkResult<void> {
  43. return async (dispatch, getStore) => {
  44. const { dashboard } = getStore();
  45. const itemsToUpdate = [];
  46. for (const item of dashboard.permissions) {
  47. if (item.inherited) {
  48. continue;
  49. }
  50. const updated = toUpdateItem(itemToUpdate);
  51. // if this is the item we want to update, update it's permisssion
  52. if (itemToUpdate === item) {
  53. updated.permission = level;
  54. }
  55. itemsToUpdate.push(updated);
  56. }
  57. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  58. await dispatch(getDashboardPermissions(dashboardId));
  59. };
  60. }
  61. export function removeDashboardPermission(dashboardId: number, itemToDelete: DashboardAcl): ThunkResult<void> {
  62. return async (dispatch, getStore) => {
  63. const dashboard = getStore().dashboard;
  64. const itemsToUpdate = [];
  65. for (const item of dashboard.permissions) {
  66. if (item.inherited || item === itemToDelete) {
  67. continue;
  68. }
  69. itemsToUpdate.push(toUpdateItem(item));
  70. }
  71. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  72. await dispatch(getDashboardPermissions(dashboardId));
  73. };
  74. }
  75. export function addDashboardPermission(dashboardId: number, newItem: NewDashboardAclItem): ThunkResult<void> {
  76. return async (dispatch, getStore) => {
  77. const { dashboard } = getStore();
  78. const itemsToUpdate = [];
  79. for (const item of dashboard.permissions) {
  80. if (item.inherited) {
  81. continue;
  82. }
  83. itemsToUpdate.push(toUpdateItem(item));
  84. }
  85. itemsToUpdate.push({
  86. userId: newItem.userId,
  87. teamId: newItem.teamId,
  88. role: newItem.role,
  89. permission: newItem.permission,
  90. });
  91. await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });
  92. await dispatch(getDashboardPermissions(dashboardId));
  93. };
  94. }