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