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