───────┬──────────────────────────────────────────────────────────────────────── │ 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 │ } ───────┴────────────────────────────────────────────────────────────────────────