Sotaro KARASAWA 9 лет назад
Родитель
Сommit
d5f6c1ae5b
3 измененных файлов с 54 добавлено и 21 удалено
  1. 2 1
      lib/form/register.js
  2. 43 13
      lib/routes/login.js
  3. 9 7
      lib/views/login.html

+ 2 - 1
lib/form/register.js

@@ -8,5 +8,6 @@ module.exports = form(
   field('registerForm.name').required(),
   field('registerForm.email').required(),
   field('registerForm.password').required().is(/^[\x20-\x7F]{6,40}$/),
-  field('registerForm.googleId').isInt()
+  field('registerForm.googleId'),
+  field('registerForm.googleImage')
 );

+ 43 - 13
lib/routes/login.js

@@ -137,6 +137,7 @@ module.exports = function(crowi, app) {
       var email = registerForm.email;
       var password = registerForm.password;
       var googleId = registerForm.googleId || null;
+      var googleImage = registerForm.googleImage || null;
 
       // email と username の unique チェックする
       User.isRegisterable(email, username, function (isRegisterable, errOn) {
@@ -157,14 +158,14 @@ module.exports = function(crowi, app) {
 
         }
         if (isError) {
-          return res.render('login', {
-          });
+          debug('isError user register error', errOn);
+          return res.redirect('/register');
         }
 
         User.createUserByEmailAndPassword(name, username, email, password, function(err, userData) {
           if (err) {
             req.flash('registerWarningMessage', 'ユーザー登録に失敗しました。');
-            return res.redirect('/login?register=1');
+            return res.redirect('/register');
           } else {
 
             // 作成後、承認が必要なモードなら、管理者に通知する
@@ -204,24 +205,57 @@ module.exports = function(crowi, app) {
                 }
                 return loginSuccess(req, res, userData);
               });
+
+              if (googleImage) {
+                var axios = require('axios');
+                var fileUploader = require('../util/fileUploader')(crowi, app);
+                var filePath = User.createUserPictureFilePath(
+                  userData,
+                  googleImage.replace(/^.+\/(.+\..+)$/, '$1')
+                );
+
+                axios.get(googleImage)
+                .then(function(response) {
+                  var type = response.headers['content-type'];
+                  var fileStream = response.data;
+
+                  fileUploader.uploadFile(filePath, type, fileStream, {})
+                  .then(function(data) {
+                    var imageUrl = fileUploader.generateUrl(filePath);
+                    debug('user picture uploaded', imageUrl);
+                    userData.updateImage(imageUrl, function(err, data) {
+                      if (err) {
+                        debug('Error on update user image', err);
+                      }
+                      // DONE
+                    });
+                  }).catch(function (err) { // ignore
+                    debug('Upload error', err);
+                  });
+                }).catch(function() { // ignore
+                });
+              }
             } else {
               return loginSuccess(req, res, userData);
             }
           }
         });
       });
-    } else { // method GET
+    } else { // method GET of form is not valid
+      debug('session is', req.session);
       // google callback を受ける可能性もある
       var code = req.session.googleAuthCode || null;
       var googleId = req.session.googleId || null;
       var googleEmail = req.session.googleEmail || null;
+      var googleName = req.session.googleName || null;
+      var googleImage = req.session.googleImage || null;
 
       debug('register. if code', code);
       // callback 経由で reigster にアクセスしてきた時最初だけこの if に入る
       // code から email などを取得したらそれを session にいれて code は消去
       if (code) {
         googleAuth.handleCallback(req, function(err, tokenInfo) {
-          debug('tokenInfo', tokenInfo);
+          debug('tokenInfo on register GET', tokenInfo);
           req.session.googleAuthCode = null;
 
           if (err) {
@@ -231,21 +265,17 @@ module.exports = function(crowi, app) {
 
           req.session.googleId = googleId = tokenInfo.user_id;
           req.session.googleEmail = googleEmail = tokenInfo.email;
+          req.session.googleName = googleName = tokenInfo.name;
+          req.session.googleImage = googleImage = tokenInfo.picture;
 
           if (!User.isEmailValid(googleEmail)) {
             req.flash('registerWarningMessage', 'このメールアドレスのGoogleアカウントはコネクトできません。');
             return res.redirect('/login?register=1');
           }
-          return res.render('login', {
-            googleId: googleId,
-            googleEmail: googleEmail,
-          });
+          return res.render('login', { googleId, googleEmail, googleName, googleImage, });
         });
       } else {
-        return res.render('login', {
-          googleId: googleId,
-          googleEmail: googleEmail,
-        });
+        return res.render('login', { googleId, googleEmail, googleName, googleImage, });
       }
     }
   };

+ 9 - 7
lib/views/login.html

@@ -86,6 +86,11 @@
 
     {% if googleId %}
     <div class="google-info alert alert-info">
+      {% if googleImage %}
+      <p class="text-center">
+        <img src="{{ googleImage }}" class="picture picture-rounded picture-lg">
+      </p>
+      {% endif %}
       <code>{{ googleEmail }}</code> この Google アカウントで登録します<br>
       ユーザーID、名前、パスワードを決めて登録を継続してください。
     </div>
@@ -128,7 +133,7 @@
       <label>名前</label>
       <div class="input-group">
         <span class="input-group-addon"><i class="fa fa-user"></i></span>
-        <input type="text" class="form-control" placeholder="記入例: 山田 太郎" name="registerForm[name]" value="{{ req.body.registerForm.name }}" required>
+        <input type="text" class="form-control" placeholder="記入例: 山田 太郎" name="registerForm[name]" value="{{ googleName|default(req.body.registerForm.name) }}" required>
       </div>
 
       <label >メールアドレス</label>
@@ -156,6 +161,9 @@
       パスワードは6文字以上の半角英数字または記号
       </p>
 
+      {% if googleImage %}
+        <input type="hidden" name="registerForm[googleImage]" value="{{ googleImage }}">
+      {% endif  %}
       <input type="hidden" name="_csrf" value="{{ _csrf() }}">
       <input type="submit" class="btn btn-primary btn-lg btn-block" value="新規登録">
     </form>
@@ -182,10 +190,4 @@
 
 </div>
 
-{#
-<div class="login-footer">
-  <p>&copy; {{ now|date('Y') }} {{ config.app.title }}. <a href="" data-target="#helpModal" data-toggle="modal"><i class="fa fa-question-circle"></i> ヘルプ</a></p>
-</div>
-#}
-
 {% endblock %}