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