───────┬──────────────────────────────────────────────────────────────────────── │ File: src/main//java/jp/ac/kobe_u/cs/itspecialist/todoapp/service/ToDoService.java ───────┼──────────────────────────────────────────────────────────────────────── 1 │ package jp.ac.kobe_u.cs.itspecialist.todoapp.service; 2 │ 3 │ import java.util.Date; 4 │ import java.util.List; 5 │ import java.util.Objects; 6 │ 7 │ import org.springframework.beans.factory.annotation.Autowired; 8 │ import org.springframework.stereotype.Service; 9 │ 10 │ import jp.ac.kobe_u.cs.itspecialist.todoapp.dto.ToDoForm; 11 │ import jp.ac.kobe_u.cs.itspecialist.todoapp.entity.ToDo; 12 │ import jp.ac.kobe_u.cs.itspecialist.todoapp.exception.ToDoAppException; 13 │ import jp.ac.kobe_u.cs.itspecialist.todoapp.repository.ToDoRepository; 14 │ 15 │ @Service 16 │ public class ToDoService { 17 │ @Autowired 18 │ MemberService mService; 19 │ @Autowired 20 │ ToDoRepository tRepo; 21 │ /** 22 │ * ToDoを作成する (C) 23 │ * @param mid 作成者 24 │ * @param form フォーム 25 │ * @return 26 │ */ 27 │ public ToDo createToDo(String mid, ToDoForm form) { 28 │ mService.getMember(mid); //実在メンバーか確認 29 │ ToDo todo = form.toEntity(); 30 │ if(!todo.isValidDueDate()) { 31 │ throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, 32 │ todo.getDueAt() + ": should be after created at"); 33 │ } 34 │ todo.setMid(mid); 35 │ return tRepo.save(todo); 36 │ } 37 │ 38 │ /** 39 │ * ToDoを1つ取得する (R) 40 │ * @param seq 41 │ * @return 42 │ */ 43 │ public ToDo getToDo(Long seq) { 44 │ ToDo todo = tRepo.findById(seq).orElseThrow( 45 │ () -> new ToDoAppException(ToDoAppException.NO_SUCH_TODO_EXISTS, 46 │ seq + ": No such ToDo exists") 47 │ ); 48 │ return todo; 49 │ } 50 │ 51 │ /** 52 │ * あるメンバーのToDoリストを取得する (R) 53 │ * @param mid 54 │ * @return 55 │ */ 56 │ public List<ToDo> getToDoList(String mid) { 57 │ return tRepo.findByMidAndDone(mid, false); 58 │ } 59 │ /** 60 │ * あるメンバーのDoneリストを取得する (R) 61 │ * @param mid 62 │ * @return 63 │ */ 64 │ public List<ToDo> getDoneList(String mid) { 65 │ return tRepo.findByMidAndDone(mid, true); 66 │ } 67 │ 68 │ /** 69 │ * 全員のToDoリストを取得する (R) 70 │ * @return 71 │ */ 72 │ public List<ToDo> getToDoList() { 73 │ return tRepo.findByDone(false); 74 │ } 75 │ 76 │ /** 77 │ * 全員のDoneリストを取得する (R) 78 │ * @return 79 │ */ 80 │ public List<ToDo> getDoneList() { 81 │ return tRepo.findByDone(true); 82 │ } 83 │ 84 │ /** 85 │ * 〆切を更新する. 86 │ * @param mid 87 │ * @param seq 88 │ * @param due 89 │ */ 90 │ public ToDo updateDueDate(String mid, Long seq, Date due) { 91 │ ToDo todo = getToDo(seq); 92 │ if (!Objects.equals(mid, todo.getMid())) { 93 │ throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid 94 │ + ": Cannot done other's todo of " + todo.getMid()); 95 │ } 96 │ if(due != null && due.before(todo.getCreatedAt())) { 97 │ throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, 98 │ due + ": should be after created at."); 99 │ } 100 │ todo.setDueAt(due); 101 │ return tRepo.save(todo); 102 │ } 103 │ 104 │ /** 105 │ * ToDoを完了する 106 │ * @param mid 完了者 107 │ * @param seq 完了するToDoの番号 108 │ * @return 109 │ */ 110 │ public ToDo done(String mid, Long seq) { 111 │ ToDo todo = getToDo(seq); 112 │ //Doneの認可を確認する.他人のToDoを閉めたらダメ. 113 │ if (!mid.equals(todo.getMid())) { 114 │ throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid 115 │ + ": Cannot done other's todo of " + todo.getMid()); 116 │ } 117 │ todo.setDone(true); 118 │ todo.setDoneAt(new Date()); 119 │ return tRepo.save(todo); 120 │ } 121 │ 122 │ /** 123 │ * ToDoを更新する 124 │ * @param mid 更新者 125 │ * @param seq 更新するToDo番号 126 │ * @param form 更新フォーム 127 │ * @return 128 │ */ 129 │ public ToDo updateToDo(String mid, Long seq, ToDoForm form) { 130 │ ToDo todo = getToDo(seq); 131 │ //Doneの認可を確認する.他人のToDoを更新したらダメ. 132 │ if (!mid.equals(todo.getMid())) { 133 │ throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid 134 │ + ": Cannot update other's todo of " + todo.getMid()); 135 │ } 136 │ todo.setTitle(form.getTitle()); //タイトルを更新 137 │ return tRepo.save(todo); 138 │ } 139 │ 140 │ /** 141 │ * ToDoを削除する 142 │ * @param mid 削除者 143 │ * @param seq 削除するToDo番号 144 │ */ 145 │ public void deleteToDo(String mid, Long seq) { 146 │ ToDo todo = getToDo(seq); 147 │ //Doneの認可を確認する.他人のToDoを削除したらダメ. 148 │ if (!mid.equals(todo.getMid())) { 149 │ throw new ToDoAppException(ToDoAppException.INVALID_TODO_OPERATION, mid 150 │ + ": Cannot delete other's todo of " + todo.getMid()); 151 │ } 152 │ tRepo.deleteById(seq); 153 │ } 154 │ 155 │ 156 │ 157 │ } ───────┴────────────────────────────────────────────────────────────────────────