// Path: src/main/java/com/sajo/teamkerbell/entity/TodoList.java
// @Data
// @Entity
// @Table
// @EqualsAndHashCode(of = "todoListId")
// @NoArgsConstructor
// public class TodoList implements Serializable {
//     private static final long serialVersionUID = 1L;
//     @Id
//     @GeneratedValue(strategy = GenerationType.IDENTITY)
//     @Column
//     private Integer todoListId;
// 
// 
//     @Column
//     private Integer userId;
// 
//     @Column
//     private Integer projectId;
// 
//     @Column
//     private boolean finished = false;
// 
//     @Column
//     private boolean overdue = false;
// 
// 
//     @NotNull
//     @Column
//     private String content;
// 
//     @NotNull
//     @DateTimeFormat(pattern = "yyyy-MM-dd")
//     @Column
//     private LocalDate startDate;
// 
//     @NotNull
//     @DateTimeFormat(pattern = "yyyy-MM-dd")
//     @Column
//     private LocalDate endDate;
// 
//     @Column
//     private LocalDate createdAt;
// 
//     @Column
//     private LocalDate updatedAt;
// 
//     private TodoList(String content, LocalDate startDate, LocalDate endDate, Integer projectId, Integer userId) {
//         this.content = content;
//         this.startDate = startDate;
//         this.endDate = endDate;
//         this.projectId = projectId;
//         this.userId = userId;
//         this.overdue(LocalDate.now());
//     }
// 
//     public void check() {
//         this.finished = !this.finished;
//     }
// 
//     public void overdue(LocalDate nowDate) {
//         if (nowDate.isAfter(this.endDate))
//             this.overdue = true;
//     }
// 
//     @PrePersist
//     protected void onCreate() {
//         updatedAt = createdAt = LocalDate.now();
//     }
// 
//     @PreUpdate
//     protected void onUpdate() {
//         updatedAt = LocalDate.now();
//     }
// 
//     public static TodoList from(int projectId, TodoListVO todoListVO) {
//         return new TodoList(
//                 todoListVO.getContent(),
//                 todoListVO.getStartDate(),
//                 todoListVO.getEndDate(),
//                 projectId,
//                 todoListVO.getUserId());
//     }
// 
//     public void update(TodoListVO todoListVO) {
//         this.userId = todoListVO.getUserId() == null ? this.userId : todoListVO.getUserId();
//         this.content = todoListVO.getContent();
//         this.startDate = todoListVO.getStartDate();
//         this.endDate = todoListVO.getEndDate();
//         this.overdue(LocalDate.now());
//     }
// 
//     public String toTimeline() {
//         return "";
//     }
// }
// 
// Path: src/main/java/com/sajo/teamkerbell/repository/TodoListRepository.java
// @Repository
// public interface TodoListRepository extends JpaRepository<TodoList, Integer> {
//     @Query("SELECT t from TodoList t left join Project p on p.projectId = t.projectId where t.userId = ?1 and p.finished = false")
//     List<TodoList> findByUserId(Integer userId, Pageable pageable);
// 
//     List<TodoList> findByProjectId(Integer projectId, Pageable page);
// }
// 
// Path: src/main/java/com/sajo/teamkerbell/vo/TodoListVO.java
// @Data
// @NoArgsConstructor
// public class TodoListVO {
//     @NotNull
//     private String content;
//     @NotNull
//     private LocalDate startDate;
//     @NotNull
//     private LocalDate endDate;
//     private Integer userId;
// 
//     public TodoListVO(String content, LocalDate startDate, LocalDate endDate, Integer userId) {
//         this.content = content;
//         this.startDate = startDate;
//         this.endDate = endDate;
//         this.userId = userId;
//     }
// }


import com.sajo.teamkerbell.entity.TodoList;
import com.sajo.teamkerbell.repository.TodoListRepository;
import com.sajo.teamkerbell.vo.TodoListVO;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
package com.sajo.teamkerbell.service;



/**
 * Created by seongahjo on 2016. 7. 27..
 */
@Service
@Transactional
@RequiredArgsConstructor
public class TodoListService {
    private final TodoListRepository todoListRepository;

    public TodoList check(Integer todoListId) {
        TodoList todoList = todoListRepository.findById(todoListId).orElseThrow(IllegalArgumentException::new);
        todoList.check();
        return todoList;
    }

    public List<TodoList> getYetTodoListsByUserId(Integer userId, int page, int size) {
        return todoListRepository
                .findByUserId(userId, PageRequest.of(page, size)).stream()
// Path: src/main/java/com/sajo/teamkerbell/entity/TodoList.java
// @Data
// @Entity
// @Table
// @EqualsAndHashCode(of = "todoListId")
// @NoArgsConstructor
// public class TodoList implements Serializable {
//     private static final long serialVersionUID = 1L;
//     @Id
//     @GeneratedValue(strategy = GenerationType.IDENTITY)
//     @Column
//     private Integer todoListId;
// 
// 
//     @Column
//     private Integer userId;
// 
//     @Column
//     private Integer projectId;
// 
//     @Column
//     private boolean finished = false;
// 
//     @Column
//     private boolean overdue = false;
// 
// 
//     @NotNull
//     @Column
//     private String content;
// 
//     @NotNull
//     @DateTimeFormat(pattern = "yyyy-MM-dd")
//     @Column
//     private LocalDate startDate;
// 
//     @NotNull
//     @DateTimeFormat(pattern = "yyyy-MM-dd")
//     @Column
//     private LocalDate endDate;
// 
//     @Column
//     private LocalDate createdAt;
// 
//     @Column
//     private LocalDate updatedAt;
// 
//     private TodoList(String content, LocalDate startDate, LocalDate endDate, Integer projectId, Integer userId) {
//         this.content = content;
//         this.startDate = startDate;
//         this.endDate = endDate;
//         this.projectId = projectId;
//         this.userId = userId;
//         this.overdue(LocalDate.now());
//     }
// 
//     public void check() {
//         this.finished = !this.finished;
//     }
// 
//     public void overdue(LocalDate nowDate) {
//         if (nowDate.isAfter(this.endDate))
//             this.overdue = true;
//     }
// 
//     @PrePersist
//     protected void onCreate() {
//         updatedAt = createdAt = LocalDate.now();
//     }
// 
//     @PreUpdate
//     protected void onUpdate() {
//         updatedAt = LocalDate.now();
//     }
// 
//     public static TodoList from(int projectId, TodoListVO todoListVO) {
//         return new TodoList(
//                 todoListVO.getContent(),
//                 todoListVO.getStartDate(),
//                 todoListVO.getEndDate(),
//                 projectId,
//                 todoListVO.getUserId());
//     }
// 
//     public void update(TodoListVO todoListVO) {
//         this.userId = todoListVO.getUserId() == null ? this.userId : todoListVO.getUserId();
//         this.content = todoListVO.getContent();
//         this.startDate = todoListVO.getStartDate();
//         this.endDate = todoListVO.getEndDate();
//         this.overdue(LocalDate.now());
//     }
// 
//     public String toTimeline() {
//         return "";
//     }
// }
// 
// Path: src/main/java/com/sajo/teamkerbell/repository/TodoListRepository.java
// @Repository
// public interface TodoListRepository extends JpaRepository<TodoList, Integer> {
//     @Query("SELECT t from TodoList t left join Project p on p.projectId = t.projectId where t.userId = ?1 and p.finished = false")
//     List<TodoList> findByUserId(Integer userId, Pageable pageable);
// 
//     List<TodoList> findByProjectId(Integer projectId, Pageable page);
// }
// 
// Path: src/main/java/com/sajo/teamkerbell/vo/TodoListVO.java
// @Data
// @NoArgsConstructor
// public class TodoListVO {
//     @NotNull
//     private String content;
//     @NotNull
//     private LocalDate startDate;
//     @NotNull
//     private LocalDate endDate;
//     private Integer userId;
// 
//     public TodoListVO(String content, LocalDate startDate, LocalDate endDate, Integer userId) {
//         this.content = content;
//         this.startDate = startDate;
//         this.endDate = endDate;
//         this.userId = userId;
//     }
// }


// Path: src/main/java/com/sajo/teamkerbell/service/TodoListService.java
import com.sajo.teamkerbell.entity.TodoList;
import com.sajo.teamkerbell.repository.TodoListRepository;
import com.sajo.teamkerbell.vo.TodoListVO;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;

package com.sajo.teamkerbell.service;



/**
 * Created by seongahjo on 2016. 7. 27..
 */
@Service
@Transactional
@RequiredArgsConstructor
public class TodoListService {
    private final TodoListRepository todoListRepository;

    public TodoList check(Integer todoListId) {
        TodoList todoList = todoListRepository.findById(todoListId).orElseThrow(IllegalArgumentException::new);
        todoList.check();
        return todoList;
    }

    public List<TodoList> getYetTodoListsByUserId(Integer userId, int page, int size) {
        return todoListRepository
                .findByUserId(userId, PageRequest.of(page, size)).stream()
                .filter(t -> !t.isFinished()).collect(Collectors.toList());