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