───────┬────────────────────────────────────────────────────────────────────────
       File: src/main//java/jp/ac/kobe_u/cs/itspecialist/todoapp/controller/ToDoRestController.java
───────┼────────────────────────────────────────────────────────────────────────
   1    package jp.ac.kobe_u.cs.itspecialist.todoapp.controller;
   2    
   3    import java.util.List;
   4    
   5    import org.springframework.beans.factory.annotation.Autowired;
   6    import org.springframework.http.HttpStatus;
   7    import org.springframework.http.ResponseEntity;
   8    import org.springframework.validation.annotation.Validated;
   9    import org.springframework.web.bind.MethodArgumentNotValidException;
  10    import org.springframework.web.bind.annotation.DeleteMapping;
  11    import org.springframework.web.bind.annotation.ExceptionHandler;
  12    import org.springframework.web.bind.annotation.GetMapping;
  13    import org.springframework.web.bind.annotation.PathVariable;
  14    import org.springframework.web.bind.annotation.PostMapping;
  15    import org.springframework.web.bind.annotation.PutMapping;
  16    import org.springframework.web.bind.annotation.RequestBody;
  17    import org.springframework.web.bind.annotation.RequestMapping;
  18    import org.springframework.web.bind.annotation.RestController;
  19    
  20    import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.ToDoForm;
  21    import jp.ac.kobe_u.cs.itspecialist.todoapp.entity.ToDo;
  22    import jp.ac.kobe_u.cs.itspecialist.todoapp.exception.ToDoAppException;
  23    import jp.ac.kobe_u.cs.itspecialist.todoapp.service.MemberService;
  24    import jp.ac.kobe_u.cs.itspecialist.todoapp.service.ToDoService;
  25    
  26    /**
  27     * ToDoの操作,CRUDを行うAPI
  28     */
  29    @RestController
  30    @RequestMapping("/api")
  31    public class ToDoRestController {
  32        @Autowired
  33        ToDoService todoService;
  34        @Autowired
  35        MemberService memberService;
  36    
  37        /* --- C: ToDoを作成する --- */
  38        @PostMapping("/{mid}/todos")
  39        ToDo createToDo(@PathVariable String mid, @Validated @RequestBody ToDoForm form) {
  40            return todoService.createToDo(mid, form);
  41        }
  42    
  43        /* --- R: ToDoを取得する (1件) --- */
  44        @GetMapping("/{mid}/todos/{seq}")
  45        ToDo getToDoList(@PathVariable String mid, @PathVariable Long seq) {
  46            return todoService.getToDo(seq);
  47        }
  48    
  49        /* --- R: ToDoを取得する (リスト) --- */
  50        @GetMapping("/{mid}/todos")
  51        List<ToDo> getToDoList(@PathVariable String mid) {
  52            return todoService.getToDoList(mid);
  53        }
  54    
  55        /* --- R: Doneを取得する (リスト) --- */
  56        @GetMapping("/{mid}/dones")
  57        List<ToDo> getDoneList(@PathVariable String mid) {
  58            return todoService.getDoneList(mid);
  59        }
  60    
  61        /* --- U: ToDoを完了する --- */
  62        @PutMapping("/{mid}/todos/{seq}/done")
  63        ToDo done(@PathVariable String mid, @PathVariable Long seq) {
  64            return todoService.done(mid, seq);
  65        }
  66    
  67        /* --- U: ToDoを更新する --- */
  68        @PutMapping("/{mid}/todos/{seq}")
  69        ToDo updateToDo(@PathVariable String mid, @PathVariable Long seq, @Validated @RequestBody ToDoForm form) {
  70            return todoService.updateToDo(mid, seq, form);
  71        }
  72    
  73        /* --- D: ToDoを削除する --- */
  74        @DeleteMapping("/{mid}/todos/{seq}")
  75        boolean deleteToDo(@PathVariable String mid, @PathVariable Long seq) {
  76            todoService.deleteToDo(mid, seq);
  77            return true;
  78        }
  79    
  80        /*--------------------- エラーハンドラー -----------------------------*/
  81        /*
  82         * 本当は@RestControllerAdviceにまとめて書きたいが,@ControllerAdviceと競合するので,
  83         * Controllerに書いている.
  84         */
  85        @ExceptionHandler(ToDoAppException.class)
  86        public ResponseEntity<Object> handleToDoException(ToDoAppException ex) {
  87            HttpStatus status;
  88            switch (ex.getCode()) {
  89                // 存在しない系例外
  90                case ToDoAppException.NO_SUCH_MEMBER_EXISTS:
  91                case ToDoAppException.NO_SUCH_TODO_EXISTS:
  92                    status = HttpStatus.NOT_FOUND;
  93                    break;
  94                // パラメタ異常系例外
  95                case ToDoAppException.MEMBER_ALREADY_EXISTS:
  96                case ToDoAppException.INVALID_MEMBER_INFO:
  97                case ToDoAppException.INVALID_TODO_INFO:
  98                    status = HttpStatus.BAD_REQUEST;
  99                    break;
 100                // 認可失敗系例外
 101                case ToDoAppException.INVALID_MEMBER_OPERATION:
 102                case ToDoAppException.INVALID_TODO_OPERATION:
 103                    status = HttpStatus.FORBIDDEN;
 104                    break;
 105                default:
 106                    status = HttpStatus.INTERNAL_SERVER_ERROR;
 107            }
 108            return new ResponseEntity<>(ex, status);
 109        }
 110    
 111        /* -- バリデーション失敗 -- */
 112        @ExceptionHandler(MethodArgumentNotValidException.class)
 113        public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
 114            return new ResponseEntity<>(ex, HttpStatus.BAD_REQUEST);
 115        }
 116    
 117        /* -- その他の例外 -- */
 118        @ExceptionHandler(Exception.class)
 119        public ResponseEntity<Object> handleException(Exception ex) {
 120            return new ResponseEntity<>(ex, HttpStatus.INTERNAL_SERVER_ERROR);
 121        }
 122    
 123    }
───────┴────────────────────────────────────────────────────────────────────────