فهرست منبع

impl make-primary api

Yuki Takei 4 سال پیش
والد
کامیت
2d18f74181

+ 9 - 2
packages/app/src/components/Admin/SlackIntegration/CustomBotWithProxySettings.jsx

@@ -34,14 +34,21 @@ const CustomBotWithProxySettings = (props) => {
   };
 
   const isPrimaryChangedHandler = useCallback(async(slackIntegrationToChange, newValue) => {
+    // do nothing when turning off
+    if (!newValue) {
+      return;
+    }
+
     try {
-      console.log({ slackIntegrationToChange, newValue });
+      await appContainer.apiv3.put(`/slack-integration-settings/slack-app-integrations/${slackIntegrationToChange._id}/make-primary`);
+      // toastSuccess(t('toaster.delete_slack_integration_procedure'));
+      toastSuccess('success to make it primary');
     }
     catch (err) {
       toastError(err, 'Failed to change isPrimary');
       logger.error('Failed to change isPrimary', err);
     }
-  }, []);
+  }, [appContainer.apiv3]);
 
   const deleteSlackAppIntegrationHandler = async() => {
     try {

+ 4 - 2
packages/app/src/components/Admin/SlackIntegration/SlackAppIntegrationControl.tsx

@@ -14,22 +14,24 @@ export const SlackAppIntegrationControl: FC<Props> = (props: Props) => {
   const { t } = useTranslation();
 
   const { slackAppIntegration, onIsPrimaryChanged, onDeleteButtonClicked } = props;
+  const inputId = `cb-primary-${slackAppIntegration._id}`;
 
   return (
     <div className="d-flex align-items-center">
       <div className="my-1 custom-control custom-switch">
         <input
           className="custom-control-input"
-          id="cb-primary"
+          id={inputId}
           type="checkbox"
           defaultChecked={slackAppIntegration.isPrimary}
+          disabled={slackAppIntegration.isPrimary}
           onChange={(e) => {
             if (onIsPrimaryChanged != null) {
               onIsPrimaryChanged(slackAppIntegration, e.target.checked);
             }
           }}
         />
-        <label className="custom-control-label" htmlFor="cb-primary">
+        <label className="custom-control-label" htmlFor={inputId}>
           Primary
         </label>
       </div>

+ 48 - 0
packages/app/src/server/routes/apiv3/slack-integration-settings.js

@@ -67,6 +67,9 @@ module.exports = (crowi) => {
       body('proxyUri').if(value => value !== '').trim().matches(/^(https?:\/\/)/)
         .isURL({ require_tld: false }),
     ],
+    makePrimary: [
+      param('id').isMongoId().withMessage('id is required'),
+    ],
     updateSupportedCommands: [
       body('supportedCommandsForSingleUse').toArray(),
       body('supportedCommandsForBroadcastUse').toArray(),
@@ -450,6 +453,51 @@ module.exports = (crowi) => {
 
   });
 
+  /**
+   * @swagger
+   *
+   *    /slack-integration-settings/slack-app-integrations/:id/makeprimary:
+   *      put:
+   *        tags: [SlackIntegration]
+   *        operationId: makePrimary
+   *        summary: /slack-integration
+   *        description: Make SlackAppTokens primary
+   *        responses:
+   *          200:
+   *            description: Succeeded to make it primary
+   */
+  // eslint-disable-next-line max-len
+  router.put('/slack-app-integrations/:id/make-primary', loginRequiredStrictly, adminRequired, csrf, validator.makePrimary, apiV3FormValidator, async(req, res) => {
+
+    const { id } = req.params;
+
+    try {
+      await SlackAppIntegration.bulkWrite([
+        // unset isPrimary for others
+        {
+          updateMany: {
+            filter: { _id: { $ne: id } },
+            update: { $unset: { isPrimary: '' } },
+          },
+        },
+        // set primary
+        {
+          updateOne: {
+            filter: { _id: id },
+            update: { isPrimary: true },
+          },
+        },
+      ]);
+
+      return res.apiv3();
+    }
+    catch (error) {
+      const msg = 'Error occurred during making SlackAppIntegration primary';
+      logger.error('Error', error);
+      return res.apiv3Err(new ErrorV3(msg, 'making-primary-failed'), 500);
+    }
+  });
+
   /**
    * @swagger
    *