OSDN Git Service

全てのjavaファイルにモードライン追加。
[rabbit-bts/RabbitBTS.git] / src / jp / sourceforge / rabbitBTS / controllers / RegisterController.java
index 18c4f1f..0022f08 100644 (file)
@@ -1,3 +1,4 @@
+// vim:set ts=4 sts=4 sw=4 noet fenc=utf-8:
 /*
    Copyright 2009 senju@users.sourceforge.jp
 
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-*/
-
+ */
 
 package jp.sourceforge.rabbitBTS.controllers;
 
+import java.util.Date;
+import java.util.logging.Level;
+
 import javax.servlet.http.HttpServletRequest;
 
 import jp.sourceforge.rabbitBTS.Sht;
-import jp.sourceforge.rabbitBTS.exceptions.NotRegisteredException;
-import jp.sourceforge.rabbitBTS.models.UserProfile;
-import jp.sourceforge.rabbitBTS.services.AccountServices;
+import jp.sourceforge.rabbitBTS.exceptions.HasNotValidIdException;
+import jp.sourceforge.rabbitBTS.exceptions.RabbitBTSException;
+import jp.sourceforge.rabbitBTS.models.Account;
+import jp.sourceforge.rabbitBTS.services.AccountService;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.Validator;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
-
 @Controller
-public class RegisterController implements IController {
+public final class RegisterController extends BaseController implements
+               IPublicController {
+       private static final String REDIRECT_HOME_HTML = "redirect:/home/";
+
+       @Autowired
+       private AccountService accountService;
+
        @Autowired
-       private AccountServices accountServices;
+       private Validator validator;
 
+       /**
+        * 新規登録画面を表示する。
+        * <p>
+        * ユーザーがgoogleにログインしていない場合、googleのログイン画面にリダイレクトする。
+        * ユーザーがアカウントを持っている場合、ユーザーホームにリダイレクトする。
+        * ユーザーがgoogleにログイン済みでかつアカウントを持っていない時だけ、画面を表示する。
+        * 
+        * @param req
+        * @param map
+        * @return
+        */
        @RequestMapping(method = RequestMethod.GET)
-       public String index(HttpServletRequest req) {
+       public String index(HttpServletRequest req, ModelMap map) {
+               String ret = null;
                try {
-                       UserProfile up = accountServices.fetchUserProfile();
-                       if (up == null) {
-                               // googleにログインしてない場合
-                               return Sht.loginUrl(req);
+                       final Account account = this.accountService.fetchAccount();
+                       if (account == null) {
+                               // 正常系
+                               map.addAttribute(new Account());
+                               ret = null;
                        } else {
                                // すでに登録済みの場合ホームへリダイレクト
-                               return "redirect:/home.html";
+                               Sht.log(this).finer("既に登録済み");
+                               ret = REDIRECT_HOME_HTML;
                        }
-               } catch (NotRegisteredException e) {
-                       // 正常系
+               } catch (final HasNotValidIdException e) {
+                       // googleにログインしてない場合
+                       Sht.log(this).finer("ログインが必要");
+                       ret = "redirect:" + Sht.loginUrl(req);
+               }
+               return ret;
+       }
+
+       /**
+        * 新規登録を行う。
+        * 
+        * <p>
+        * 正常系
+        * <ol>
+        * <li>バリデート
+        * <li>Accountを登録
+        * <li>ユーザーホームにリダイレクト
+        * <ol>
+        * <p>
+        * 異常系
+        * <ol>
+        * <li>バリデートに失敗した場合、エラーメッセージ
+        * <li>Account登録に失敗した場合(二重登録等)、ロールバック、エラーメッセージ
+        * </ol>
+        * 
+        * @param account
+        * @param result
+        * @return
+        */
+       @RequestMapping(method = RequestMethod.POST)
+       public String index(Account account, BindingResult result, ModelMap map) {
+               if (!this.isCsrfSafe(result)) {
+                       return null;
+               }
+
+               account.setLastAccess(new Date());
+
+               account.setEmail(Sht.user().getEmail());
+               this.validator.validate(account, result);
+               if (result.hasErrors()) {
+                       Sht.log(this).finer("ユーザ登録画面にてバリデートに失敗");
+                       return null;
+               }
+
+               try {
+                       // nickName重複チェック
+                       if (this.accountService.fetchAccountByNickName(account
+                                       .getNickName()) != null) {
+                               result.rejectValue("nickName", "Account.nickName[duplicate]");
+                               Sht.log(this).finer("nickName重複チェックエラー");
+                               return null;
+                       }
+
+                       this.accountService.registAccount(account);
+               } catch (final RabbitBTSException e) {
+                       Sht.log(this).log(Level.WARNING, "ユーザー登録で例外発生", e);
+                       // TODO:resultにセット
+                       map.addAttribute("errorMessage", "登録に失敗しました。再度やりなおしてください。");
                        return null;
                }
+               return REDIRECT_HOME_HTML;
        }
 }