Просмотр исходного кода

separate websocket events of ldap and keycloak group sync

Futa Arai 2 лет назад
Родитель
Сommit
418f167ebc

+ 1 - 1
apps/app/public/static/locales/en_US/admin.json

@@ -1064,9 +1064,9 @@
     "update_sync_settings_failed": "Failed to update sync settings",
     "description_form_detail": "Please note that edited value will be overwritten on next sync if description mapper is set in sync settings",
     "only_description_edit_allowed": "Only description can be edited for external user groups",
+    "sync_being_executed": "Cannot execute sync until current external group sync process finishes",
     "sync_succeeded": "Sync succeeded",
     "sync_failed": "Sync failed",
-    "sync_being_executed": "Cannot execute sync until current sync process finishes",
     "ldap": {
       "group_sync_settings": "LDAP Group Sync Settings",
       "group_search_base_DN": "Group Search Base DN",

+ 1 - 1
apps/app/public/static/locales/ja_JP/admin.json

@@ -1073,7 +1073,7 @@
     "update_sync_settings_failed": "同期設定の更新が失敗しました",
     "description_form_detail": "同期設定で「説明」の mapper が設定されている場合、編集内容は再同期によって上書きされることに注意してください",
     "only_description_edit_allowed": "外部グループは説明の編集のみが可能です",
-    "sync_being_executed": "現在実行されている同期が終わるまで次の実行ができません",
+    "sync_being_executed": "現在実行されている外部グループ同期が終わるまで次の実行ができません",
     "sync_succeeded": "同期に成功しました",
     "sync_failed": "同期に失敗しました",
     "ldap": {

+ 1 - 1
apps/app/public/static/locales/zh_CN/admin.json

@@ -1072,9 +1072,9 @@
     "update_sync_settings_failed": "Failed to update sync settings",
     "description_form_detail": "Please note that edited value will be overwritten on next sync if description mapper is set in sync settings",
     "only_description_edit_allowed": "Only description can be edited for external user groups",
+    "sync_being_executed": "Cannot execute sync until current external group sync process finishes",
     "sync_succeeded": "Sync succeeded",
     "sync_failed": "Sync failed",
-    "sync_being_executed": "Cannot execute sync until current sync process finishes",
     "ldap": {
       "group_sync_settings": "LDAP Group Sync Settings",
       "group_search_base_DN": "Group Search Base DN",

+ 2 - 1
apps/app/src/features/external-user-group/client/components/ExternalUserGroup/KeycloakGroupManagement.tsx

@@ -1,6 +1,7 @@
 import { FC, useCallback } from 'react';
 
 import { apiv3Put } from '~/client/util/apiv3-client';
+import { ExternalGroupProviderType } from '~/features/external-user-group/interfaces/external-user-group';
 
 import { KeycloakGroupSyncSettingsForm } from './KeycloakGroupSyncSettingsForm';
 import { SyncExecution } from './SyncExecution';
@@ -14,7 +15,7 @@ export const KeycloakGroupManagement: FC = () => {
   return (
     <>
       <KeycloakGroupSyncSettingsForm />
-      <SyncExecution requestSyncAPI={requestSyncAPI} />
+      <SyncExecution provider={ExternalGroupProviderType.keycloak} requestSyncAPI={requestSyncAPI} />
     </>
   );
 };

+ 2 - 1
apps/app/src/features/external-user-group/client/components/ExternalUserGroup/LdapGroupManagement.tsx

@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next';
 
 import { apiv3Get, apiv3Put } from '~/client/util/apiv3-client';
 import { toastError } from '~/client/util/toastr';
+import { ExternalGroupProviderType } from '~/features/external-user-group/interfaces/external-user-group';
 
 import { LdapGroupSyncSettingsForm } from './LdapGroupSyncSettingsForm';
 import { SyncExecution } from './SyncExecution';
@@ -60,7 +61,7 @@ export const LdapGroupManagement: FC = () => {
   return (
     <>
       <LdapGroupSyncSettingsForm />
-      <SyncExecution requestSyncAPI={requestSyncAPI} AdditionalForm={AdditionalForm} />
+      <SyncExecution provider={ExternalGroupProviderType.ldap} requestSyncAPI={requestSyncAPI} AdditionalForm={AdditionalForm} />
     </>
   );
 };

+ 10 - 7
apps/app/src/features/external-user-group/client/components/ExternalUserGroup/SyncExecution.tsx

@@ -6,17 +6,20 @@ import { useTranslation } from 'react-i18next';
 
 import { toastError, toastSuccess } from '~/client/util/toastr';
 import LabeledProgressBar from '~/components/Admin/Common/LabeledProgressBar';
+import { ExternalGroupProviderType } from '~/features/external-user-group/interfaces/external-user-group';
 import { SocketEventName } from '~/interfaces/websocket';
 import { useAdminSocket } from '~/stores/socket-io';
 
 import { useSWRxExternalUserGroupList } from '../../stores/external-user-group';
 
 type SyncExecutionProps = {
+  provider: ExternalGroupProviderType
   requestSyncAPI: (e) => Promise<void>
   AdditionalForm?: FC
 }
 
 export const SyncExecution = ({
+  provider,
   requestSyncAPI,
   AdditionalForm = () => <></>,
 }: SyncExecutionProps): JSX.Element => {
@@ -31,8 +34,8 @@ export const SyncExecution = ({
 
   useEffect(() => {
     if (socket != null) {
-      socket.off(SocketEventName.GroupSyncProgress);
-      socket.on(SocketEventName.GroupSyncProgress, (data) => {
+      socket.off(SocketEventName.externalUserGroup[provider].GroupSyncProgress);
+      socket.on(SocketEventName.externalUserGroup[provider].GroupSyncProgress, (data) => {
         setSyncStatus('syncExecuting');
         setProgress({
           total: data.totalCount,
@@ -40,21 +43,21 @@ export const SyncExecution = ({
         });
       });
 
-      socket.off(SocketEventName.GroupSyncCompleted);
-      socket.on(SocketEventName.GroupSyncCompleted, () => {
+      socket.off(SocketEventName.externalUserGroup[provider].GroupSyncCompleted);
+      socket.on(SocketEventName.externalUserGroup[provider].GroupSyncCompleted, () => {
         setSyncStatus('syncCompleted');
         mutateExternalUserGroups();
         toastSuccess(t('external_user_group.sync_succeeded'));
       });
 
-      socket.off(SocketEventName.GroupSyncFailed);
-      socket.on(SocketEventName.GroupSyncFailed, () => {
+      socket.off(SocketEventName.externalUserGroup[provider].GroupSyncFailed);
+      socket.on(SocketEventName.externalUserGroup[provider].GroupSyncFailed, () => {
         setSyncStatus('syncFailed');
         mutateExternalUserGroups();
         toastError(t('external_user_group.sync_failed'));
       });
     }
-  }, [socket, mutateExternalUserGroups, t]);
+  }, [socket, mutateExternalUserGroups, t, provider]);
 
   const onSyncBtnClick = useCallback(async(e) => {
     e.preventDefault();

+ 3 - 3
apps/app/src/features/external-user-group/server/service/external-user-group-sync.ts

@@ -63,7 +63,7 @@ abstract class ExternalUserGroupSyncService<SyncParamsType = any> {
         const externalUserGroup = await this.createUpdateExternalUserGroup(node, parentId);
         existingExternalUserGroupIds.push(externalUserGroup._id);
         count++;
-        socket?.emit(SocketEventName.GroupSyncProgress, { totalCount, count });
+        socket?.emit(SocketEventName.externalUserGroup[this.groupProviderType].GroupSyncProgress, { totalCount, count });
         // Do not use Promise.all, because the number of promises processed can
         // exponentially grow when group tree is enormous
         for await (const childNode of node.childGroupNodes) {
@@ -79,11 +79,11 @@ abstract class ExternalUserGroupSyncService<SyncParamsType = any> {
         await ExternalUserGroup.deleteMany({ _id: { $nin: existingExternalUserGroupIds }, groupProviderType: this.groupProviderType });
         await ExternalUserGroupRelation.removeAllInvalidRelations();
       }
-      socket?.emit(SocketEventName.GroupSyncCompleted);
+      socket?.emit(SocketEventName.externalUserGroup[this.groupProviderType].GroupSyncCompleted);
     }
     catch (e) {
       logger.error(e.message);
-      socket?.emit(SocketEventName.GroupSyncFailed);
+      socket?.emit(SocketEventName.externalUserGroup[this.groupProviderType].GroupSyncFailed);
     }
     finally {
       this.isExecutingSync = false;

+ 12 - 3
apps/app/src/interfaces/websocket.ts

@@ -18,9 +18,18 @@ export const SocketEventName = {
   RebuildingFailed: 'rebuildingFailed',
 
   // External user group sync
-  GroupSyncProgress: 'groupSyncProgress',
-  GroupSyncFailed: 'groupSyncFailed',
-  GroupSyncCompleted: 'groupSyncCompleted',
+  externalUserGroup: {
+    ldap: {
+      GroupSyncProgress: 'ldap:groupSyncProgress',
+      GroupSyncFailed: 'ldap:groupSyncFailed',
+      GroupSyncCompleted: 'ldap:groupSyncCompleted',
+    },
+    keycloak: {
+      GroupSyncProgress: 'keycloak:groupSyncProgress',
+      GroupSyncFailed: 'keycloak:groupSyncFailed',
+      GroupSyncCompleted: 'keycloak:groupSyncCompleted',
+    },
+  },
 
   // Page Operation
   PageCreated: 'page:create',