───────┬──────────────────────────────────────────────────────────────────────── │ 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, "seq", "asc"); 53 │ } 54 │ 55 │ /* --- R: Doneを取得する (リスト) --- */ 56 │ @GetMapping("/{mid}/dones") 57 │ List<ToDo> getDoneList(@PathVariable String mid) { 58 │ return todoService.getDoneList(mid, "seq", "asc"); 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 │ } ───────┴────────────────────────────────────────────────────────────────────────