actions.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { actionCreatorFactory, noPayloadActionCreatorFactory } from 'app/core/redux';
  2. import config from 'app/core/config';
  3. import { ThunkResult, SyncInfo, LdapUser, LdapConnectionInfo, LdapError, UserSession, User } from 'app/types';
  4. import {
  5. getUserInfo,
  6. getLdapState,
  7. syncLdapUser,
  8. getUser,
  9. getUserSessions,
  10. revokeUserSession,
  11. revokeAllUserSessions,
  12. getLdapSyncStatus,
  13. } from './apis';
  14. // Action types
  15. export const ldapConnectionInfoLoadedAction = actionCreatorFactory<LdapConnectionInfo>(
  16. 'ldap/CONNECTION_INFO_LOADED'
  17. ).create();
  18. export const ldapSyncStatusLoadedAction = actionCreatorFactory<SyncInfo>('ldap/SYNC_STATUS_LOADED').create();
  19. export const userMappingInfoLoadedAction = actionCreatorFactory<LdapUser>('ldap/USER_INFO_LOADED').create();
  20. export const userMappingInfoFailedAction = actionCreatorFactory<LdapError>('ldap/USER_INFO_FAILED').create();
  21. export const clearUserMappingInfoAction = noPayloadActionCreatorFactory('ldap/CLEAR_USER_MAPPING_INFO').create();
  22. export const clearUserErrorAction = noPayloadActionCreatorFactory('ldap/CLEAR_USER_ERROR').create();
  23. export const ldapFailedAction = actionCreatorFactory<LdapError>('ldap/LDAP_FAILED').create();
  24. export const userLoadedAction = actionCreatorFactory<User>('USER_LOADED').create();
  25. export const userSessionsLoadedAction = actionCreatorFactory<UserSession[]>('USER_SESSIONS_LOADED').create();
  26. export const userSyncFailedAction = noPayloadActionCreatorFactory('USER_SYNC_FAILED').create();
  27. export const revokeUserSessionAction = noPayloadActionCreatorFactory('REVOKE_USER_SESSION').create();
  28. export const revokeAllUserSessionsAction = noPayloadActionCreatorFactory('REVOKE_ALL_USER_SESSIONS').create();
  29. // Actions
  30. export function loadLdapState(): ThunkResult<void> {
  31. return async dispatch => {
  32. try {
  33. const connectionInfo = await getLdapState();
  34. dispatch(ldapConnectionInfoLoadedAction(connectionInfo));
  35. } catch (error) {
  36. error.isHandled = true;
  37. const ldapError = {
  38. title: error.data.message,
  39. body: error.data.error,
  40. };
  41. dispatch(ldapFailedAction(ldapError));
  42. }
  43. };
  44. }
  45. export function loadLdapSyncStatus(): ThunkResult<void> {
  46. return async dispatch => {
  47. if (config.buildInfo.isEnterprise) {
  48. // Available only in enterprise
  49. const syncStatus = await getLdapSyncStatus();
  50. dispatch(ldapSyncStatusLoadedAction(syncStatus));
  51. }
  52. };
  53. }
  54. export function loadUserMapping(username: string): ThunkResult<void> {
  55. return async dispatch => {
  56. try {
  57. const userInfo = await getUserInfo(username);
  58. dispatch(userMappingInfoLoadedAction(userInfo));
  59. } catch (error) {
  60. error.isHandled = true;
  61. const userError = {
  62. title: error.data.message,
  63. body: error.data.error,
  64. };
  65. dispatch(clearUserMappingInfoAction());
  66. dispatch(userMappingInfoFailedAction(userError));
  67. }
  68. };
  69. }
  70. export function clearUserError(): ThunkResult<void> {
  71. return dispatch => {
  72. dispatch(clearUserErrorAction());
  73. };
  74. }
  75. export function clearUserMappingInfo(): ThunkResult<void> {
  76. return dispatch => {
  77. dispatch(clearUserErrorAction());
  78. dispatch(clearUserMappingInfoAction());
  79. };
  80. }
  81. export function syncUser(userId: number): ThunkResult<void> {
  82. return async dispatch => {
  83. try {
  84. await syncLdapUser(userId);
  85. dispatch(loadLdapUserInfo(userId));
  86. dispatch(loadLdapSyncStatus());
  87. } catch (error) {
  88. dispatch(userSyncFailedAction());
  89. }
  90. };
  91. }
  92. export function loadLdapUserInfo(userId: number): ThunkResult<void> {
  93. return async dispatch => {
  94. try {
  95. const user = await getUser(userId);
  96. dispatch(userLoadedAction(user));
  97. dispatch(loadUserSessions(userId));
  98. dispatch(loadUserMapping(user.login));
  99. } catch (error) {
  100. error.isHandled = true;
  101. const userError = {
  102. title: error.data.message,
  103. body: error.data.error,
  104. };
  105. dispatch(userMappingInfoFailedAction(userError));
  106. }
  107. };
  108. }
  109. export function loadUserSessions(userId: number): ThunkResult<void> {
  110. return async dispatch => {
  111. const sessions = await getUserSessions(userId);
  112. dispatch(userSessionsLoadedAction(sessions));
  113. };
  114. }
  115. export function revokeSession(tokenId: number, userId: number): ThunkResult<void> {
  116. return async dispatch => {
  117. await revokeUserSession(tokenId, userId);
  118. dispatch(loadUserSessions(userId));
  119. };
  120. }
  121. export function revokeAllSessions(userId: number): ThunkResult<void> {
  122. return async dispatch => {
  123. await revokeAllUserSessions(userId);
  124. dispatch(loadUserSessions(userId));
  125. };
  126. }