actions.ts 3.8 KB

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