───────┬────────────────────────────────────────────────────────────────────────
       File: src/main//java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoController.java
───────┼────────────────────────────────────────────────────────────────────────
   1    package jp.ac.kobe_u.cs.itspecialist.todoapp.controller;
   2    
   3    import java.util.List;
   4    import java.util.Objects;
   5    
   6    import org.springframework.beans.factory.annotation.Autowired;
   7    import org.springframework.data.domain.Page;
   8    import org.springframework.data.domain.Pageable;
   9    import org.springframework.stereotype.Controller;
  10    import org.springframework.ui.Model;
  11    import org.springframework.validation.BindingResult;
  12    import org.springframework.validation.annotation.Validated;
  13    import org.springframework.web.bind.annotation.*;
  14    
  15    import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.LoginForm;
  16    import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.ToDoForm;
  17    import jp.ac.kobe_u.cs.itspecialist.todoapp.entity.Member;
  18    import jp.ac.kobe_u.cs.itspecialist.todoapp.entity.ToDo;
  19    import jp.ac.kobe_u.cs.itspecialist.todoapp.service.MemberService;
  20    import jp.ac.kobe_u.cs.itspecialist.todoapp.service.ToDoService;
  21    
  22    @Controller
  23    public class ToDoController {
  24        @Autowired
  25        MemberService mService;
  26        @Autowired
  27        ToDoService tService;
  28    
  29        /**
  30         * トップページ
  31         */
  32        @GetMapping("/")
  33        String showIndex(@ModelAttribute(name = "loginForm") LoginForm loginForm, Model model) {
  34            //model.addAttribute("loginForm", loginForm);
  35            return "index";
  36        }
  37    
  38        /**
  39         * ログイン処理.midの存在確認をして,ユーザページにリダイレクト
  40         */
  41        @PostMapping("/login")
  42        String login(@Validated @ModelAttribute(name = "loginForm") LoginForm loginForm, BindingResult bindingResult,
  43                Model model) {
  44    
  45            if (bindingResult.hasErrors()) { // バリデーション
  46                return showIndex(loginForm, model);
  47            }
  48    
  49            Member m = mService.getMember(loginForm.getMid()); // 存在チェック
  50            return "redirect:/" + m.getMid() + "/todos";
  51        }
  52    
  53        /**
  54         * ユーザのToDoリストのページ
  55         */
  56        @GetMapping("/{mid}/todos")
  57        String showToDoList(@PathVariable String mid,
  58                            @RequestParam(name="sort_by", required = false) String sortBy,
  59                            @RequestParam(name="order", required = false) String order,
  60                            @ModelAttribute(name = "ToDoForm") ToDoForm form, Model model,
  61                            Pageable pageable) {
  62            Member m = mService.getMember(mid);
  63            // デフォルト値を入れておく.
  64            sortBy = getDefault(sortBy, "seq");
  65            order = getDefault(order, "asc");
  66    
  67            model.addAttribute("member", m);
  68            model.addAttribute("ToDoForm", form);
  69            Page<ToDo> todos = tService.getToDoList(mid, sortBy, order, pageable);
  70            model.addAttribute("todos", todos);
  71            Page<ToDo> dones = tService.getDoneList(mid, sortBy, order, pageable);
  72            model.addAttribute("dones", dones);
  73            return "list";
  74        }
  75    
  76        private String getDefault(String value, String defaultValue) {
  77            if(value == null || Objects.equals(value.trim(), "")) {
  78                return defaultValue;
  79            }
  80            return value;
  81        }
  82    
  83        /**
  84         * 全員のToDoリストのページ
  85         */
  86        @GetMapping("/{mid}/todos/all")
  87        String showAllToDoList(@PathVariable String mid,
  88                               @RequestParam(name="sort_by", required = false) String sortBy,
  89                               @RequestParam(name="order", required = false) String order,
  90                               Model model, Pageable pageable) {
  91            Member m = mService.getMember(mid);
  92            // デフォルト値を入れておく.
  93            sortBy = getDefault(sortBy, "seq");
  94            order = getDefault(order, "asc");
  95            model.addAttribute("member", m);
  96            Page<ToDo> todos = tService.getToDoList(sortBy, order, pageable);
  97            model.addAttribute("todos", todos);
  98            Page<ToDo> dones = tService.getDoneList(sortBy, order, pageable);
  99            model.addAttribute("dones", dones);
 100            return "alllist";
 101        }
 102    
 103        /**
 104         * ToDoの作成.作成処理後,ユーザページへリダイレクト
 105         */
 106        @PostMapping("/{mid}/todos")
 107        String createToDo(@PathVariable String mid, @Validated @ModelAttribute(name = "ToDoForm") ToDoForm form,
 108                BindingResult bindingResult, Model model) {
 109            if (!bindingResult.hasErrors()) {
 110                tService.createToDo(mid, form);
 111            }
 112            return "redirect:/" + mid + "/todos";
 113        }
 114    
 115        /**
 116         * ToDoの更新.期限を追加,削除する.その後,ユーザページへリダイレクトする.
 117         */
 118        @PutMapping("/{mid}/todos/{seq}/due")
 119        String updateDueDate(@PathVariable String mid, @PathVariable Long seq,
 120                             @Validated @ModelAttribute(name = "ToDoForm") ToDoForm form, Model model) {
 121            tService.updateDueDate(mid, seq, form.getDueDate());
 122            return "redirect:/" + mid + "/todos";
 123        }
 124    
 125        /**
 126         * ToDoの完了.完了処理後,ユーザページへリダイレクト
 127         */
 128        @GetMapping("/{mid}/todos/{seq}/done")
 129        String doneToDo(@PathVariable String mid, @PathVariable Long seq, Model model) {
 130            tService.done(mid, seq);
 131            return "redirect:/" + mid + "/todos";
 132        }
 133    
 134        /**
 135         * ToDoの完了のキャンセル.キャンセル終了後,ユーザページへリダイレクト
 136         */
 137        @GetMapping("/{mid}/todos/{seq}/cancel")
 138        String cancelToDo(@PathVariable String mid, @PathVariable Long seq, Model model) {
 139            tService.cancel(mid, seq);
 140            return "redirect:/" + mid + "/todos";
 141        }
 142    
 143        /*
 144         * 背景色の更新.更新終了後,ユーザページへリダイレクト.
 145         */
 146        @PutMapping("/{mid}/todos/{seq}/background")
 147        String updateBackground(@PathVariable String mid, @PathVariable Long seq,
 148                                @Validated @ModelAttribute(name="ToDoForm") ToDoForm form, Model model) {
 149            tService.updateBackground(mid, seq, form.getBackground());
 150            return "redirect:/" + mid + "/todos";
 151        }
 152    }
───────┴────────────────────────────────────────────────────────────────────────