AdminEditUserCtrl.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import _ from 'lodash';
  2. import { dateTime } from '@grafana/data';
  3. import { BackendSrv } from 'app/core/services/backend_srv';
  4. import { NavModelSrv } from 'app/core/core';
  5. import { User } from 'app/core/services/context_srv';
  6. import { UserSession } from 'app/types';
  7. export default class AdminEditUserCtrl {
  8. /** @ngInject */
  9. constructor($scope: any, $routeParams: any, backendSrv: BackendSrv, $location: any, navModelSrv: NavModelSrv) {
  10. $scope.user = {};
  11. $scope.sessions = [];
  12. $scope.newOrg = { name: '', role: 'Editor' };
  13. $scope.permissions = {};
  14. $scope.navModel = navModelSrv.getNav('admin', 'global-users', 0);
  15. $scope.init = () => {
  16. if ($routeParams.id) {
  17. $scope.getUser($routeParams.id);
  18. $scope.getUserSessions($routeParams.id);
  19. $scope.getUserOrgs($routeParams.id);
  20. }
  21. };
  22. $scope.getUser = (id: number) => {
  23. backendSrv.get('/api/users/' + id).then((user: User) => {
  24. $scope.user = user;
  25. $scope.user_id = id;
  26. $scope.permissions.isGrafanaAdmin = user.isGrafanaAdmin;
  27. });
  28. };
  29. $scope.getUserSessions = (id: number) => {
  30. backendSrv.get('/api/admin/users/' + id + '/auth-tokens').then((sessions: UserSession[]) => {
  31. sessions.reverse();
  32. $scope.sessions = sessions.map((session: UserSession) => {
  33. return {
  34. id: session.id,
  35. isActive: session.isActive,
  36. seenAt: dateTime(session.seenAt).fromNow(),
  37. createdAt: dateTime(session.createdAt).format('MMMM DD, YYYY'),
  38. clientIp: session.clientIp,
  39. browser: session.browser,
  40. browserVersion: session.browserVersion,
  41. os: session.os,
  42. osVersion: session.osVersion,
  43. device: session.device,
  44. };
  45. });
  46. });
  47. };
  48. $scope.revokeUserSession = (tokenId: number) => {
  49. backendSrv
  50. .post('/api/admin/users/' + $scope.user_id + '/revoke-auth-token', {
  51. authTokenId: tokenId,
  52. })
  53. .then(() => {
  54. $scope.sessions = $scope.sessions.filter((session: UserSession) => {
  55. if (session.id === tokenId) {
  56. return false;
  57. }
  58. return true;
  59. });
  60. });
  61. };
  62. $scope.revokeAllUserSessions = (tokenId: number) => {
  63. backendSrv.post('/api/admin/users/' + $scope.user_id + '/logout').then(() => {
  64. $scope.sessions = [];
  65. });
  66. };
  67. $scope.setPassword = () => {
  68. if (!$scope.passwordForm.$valid) {
  69. return;
  70. }
  71. const payload = { password: $scope.password };
  72. backendSrv.put('/api/admin/users/' + $scope.user_id + '/password', payload).then(() => {
  73. $location.path('/admin/users');
  74. });
  75. };
  76. $scope.updatePermissions = () => {
  77. const payload = $scope.permissions;
  78. backendSrv.put('/api/admin/users/' + $scope.user_id + '/permissions', payload);
  79. };
  80. $scope.create = () => {
  81. if (!$scope.userForm.$valid) {
  82. return;
  83. }
  84. backendSrv.post('/api/admin/users', $scope.user).then(() => {
  85. $location.path('/admin/users');
  86. });
  87. };
  88. $scope.getUserOrgs = (id: number) => {
  89. backendSrv.get('/api/users/' + id + '/orgs').then((orgs: any) => {
  90. $scope.orgs = orgs;
  91. });
  92. };
  93. $scope.update = () => {
  94. if (!$scope.userForm.$valid) {
  95. return;
  96. }
  97. backendSrv.put('/api/users/' + $scope.user_id, $scope.user).then(() => {
  98. $location.path('/admin/users');
  99. });
  100. };
  101. $scope.updateOrgUser = (orgUser: { orgId: string }) => {
  102. backendSrv.patch('/api/orgs/' + orgUser.orgId + '/users/' + $scope.user_id, orgUser).then(() => {});
  103. };
  104. $scope.removeOrgUser = (orgUser: { orgId: string }) => {
  105. backendSrv.delete('/api/orgs/' + orgUser.orgId + '/users/' + $scope.user_id).then(() => {
  106. $scope.getUser($scope.user_id);
  107. $scope.getUserOrgs($scope.user_id);
  108. });
  109. };
  110. $scope.orgsSearchCache = [];
  111. $scope.searchOrgs = (queryStr: any, callback: any) => {
  112. if ($scope.orgsSearchCache.length > 0) {
  113. callback(_.map($scope.orgsSearchCache, 'name'));
  114. return;
  115. }
  116. backendSrv.get('/api/orgs', { query: '' }).then((result: any) => {
  117. $scope.orgsSearchCache = result;
  118. callback(_.map(result, 'name'));
  119. });
  120. };
  121. $scope.addOrgUser = () => {
  122. if (!$scope.addOrgForm.$valid) {
  123. return;
  124. }
  125. const orgInfo: any = _.find($scope.orgsSearchCache, {
  126. name: $scope.newOrg.name,
  127. });
  128. if (!orgInfo) {
  129. return;
  130. }
  131. $scope.newOrg.loginOrEmail = $scope.user.login;
  132. backendSrv.post('/api/orgs/' + orgInfo.id + '/users/', $scope.newOrg).then(() => {
  133. $scope.getUser($scope.user_id);
  134. $scope.getUserOrgs($scope.user_id);
  135. });
  136. };
  137. $scope.deleteUser = (user: any) => {
  138. $scope.appEvent('confirm-modal', {
  139. title: 'Delete',
  140. text: 'Do you want to delete ' + user.login + '?',
  141. icon: 'fa-trash',
  142. yesText: 'Delete',
  143. onConfirm: () => {
  144. backendSrv.delete('/api/admin/users/' + user.id).then(() => {
  145. $location.path('/admin/users');
  146. });
  147. },
  148. });
  149. };
  150. $scope.disableUser = (event: any) => {
  151. const user = $scope.user;
  152. // External user can not be disabled
  153. if (user.isExternal) {
  154. event.preventDefault();
  155. event.stopPropagation();
  156. return;
  157. }
  158. const actionEndpoint = user.isDisabled ? '/enable' : '/disable';
  159. backendSrv.post('/api/admin/users/' + user.id + actionEndpoint).then(() => {
  160. $scope.init();
  161. });
  162. };
  163. $scope.init();
  164. }
  165. }