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

impl disassociate

* make sure password set or this user has two or more ExternalAccounts
Yuki Takei 8 лет назад
Родитель
Сommit
c1f610c404
2 измененных файлов с 47 добавлено и 9 удалено
  1. 39 9
      lib/routes/me.js
  2. 8 0
      lib/views/me/external-accounts.html

+ 39 - 9
lib/routes/me.js

@@ -178,6 +178,7 @@ module.exports = function(crowi, app) {
   }
 
   actions.externalAccounts.disassociate = function(req, res) {
+    const userData = req.user;
 
     const redirectWithFlash = (type, msg) => {
       req.flash(type, msg);
@@ -188,19 +189,48 @@ module.exports = function(crowi, app) {
       redirectWithFlash('errorMessage', 'Invalid form.');
     }
 
-    const providerType = req.body.providerType;
-    const accountId = req.body.accountId;
-    const userData = req.user;
+    // make sure password set or this user has two or more ExternalAccounts
+    new Promise((resolve, reject) => {
+      if (userData.password != null) {
+        resolve(true);
+      }
+      else {
+        ExternalAccount.count({user: userData})
+          .then((count) => {
+            resolve(count > 1)
+          });
+      }
+    })
+    .then((isDisassociatable) => {
+      if (!isDisassociatable) {
+        let e = new Error();
+        e.name = 'couldntDisassociateError';
+        throw e;
+      }
+
+      const providerType = req.body.providerType;
+      const accountId = req.body.accountId;
 
-    ExternalAccount.findOneAndRemove({providerType, accountId, user: userData})
-      .then((account) => {
-        if (account == null) {
-          return redirectWithFlash('errorMessage', 'ExternalAccount not found.');
+      return ExternalAccount.findOneAndRemove({providerType, accountId, user: userData});
+    })
+    .then((account) => {
+      if (account == null) {
+        return redirectWithFlash('errorMessage', 'ExternalAccount not found.');
+      }
+      else {
+        return redirectWithFlash('successMessage', 'Successfully disassociated.');
+      }
+    })
+    .catch((err) => {
+      if (err) {
+        if (err.name == 'couldntDisassociateError') {
+          return redirectWithFlash('couldntDisassociateError', true);
         }
         else {
-          return redirectWithFlash('successMessage', 'Successfully disassociated.');
+          return redirectWithFlash('errorMessage', err.message);
         }
-      });
+      }
+    });
 
   }
 

+ 8 - 0
lib/views/me/external-accounts.html

@@ -22,6 +22,14 @@
 
   <div class="tab-content">
 
+  {% set couldntDisassociateError = req.flash('couldntDisassociateError') %}
+  {% if couldntDisassociateError != null %}
+  <div class="alert alert-danger">
+    <b>Couldn't disassociate External Account</b><br>
+    You have not set a password and have only one External Account.
+  </div>
+  {% endif %}
+
   {% set error = req.flash('errorMessage') %}
   {% if error.length %}
   {% for e in error %}