diff --git a/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java b/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java index c210486..6115fd1 100644 --- a/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java +++ b/src/main/java/org/ntlab/citrusserver/repositories/TodoManager.java @@ -1,4 +1,178 @@ package org.ntlab.citrusserver.repositories; +import org.ntlab.citrusserver.entities.Todo; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; + +@Repository public class TodoManager { + + /** + * todoをすべて管理します + */ + private final HashMap>> todos + = new HashMap<>(); + + /** + * アカウントの本の次に与えるべきtodoのidを管理します + */ + private final HashMap nextTodoId = new HashMap<>(); + +// private final BookManager bookManager; +// +// TodoManger(BookManager bookManager){ +// this.bookManager = bookManager; +// } + + /** + * + * アカウントと本を指定してそれに所属するtodoをすべて返す + * + * @param accountId アカウントのid + * @param bookId 本のid + * @return そのアカウントの本に所属するtodoをすべて返します + */ + public HashMap getAllTodos(String accountId, Integer bookId){ + return todos.get(accountId).get(bookId); + } + + /** + *年月をそれぞれintで指定してtodoをtodo_id->todoの辞書で返す + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param year 年 + * @param month 月 + * @return そのアカウントの本に所属するtodoのうち、指定した年月のtodoを返します + */ + public HashMap getTodosByMonth(String accountId, Integer bookId, int year, int month){ + HashMap todos = getAllTodos(accountId, bookId); + HashMap resultTodos = new HashMap<>(); + for(Todo todo : todos.values()){ + if(todo.getYear() == year){ + if (todo.getMonth() == month){ + resultTodos.put(todo.getTodoId(), todo); + } + } + } + return resultTodos; + } + + /** + *年月を-区切りの文字列で指定してtodoをtodo_id->todoの辞書で返す + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param yearMonth 年月を-で区切った文字列 + * @return そのアカウントの本に所属するtodoのうち、指定した年月のtodoを返します + */ + public HashMap getTodosByMonth(String accountId, Integer bookId, String yearMonth){ + String[] yearMonths = yearMonth.split("-"); + int year = Integer.parseInt(yearMonths[0]); + int month = Integer.parseInt(yearMonths[1]); + return getTodosByMonth(accountId, bookId, year, month); + } + + /** + * 年月日をそれぞれintで指定してtodoをtodo_id->todoの辞書で返す + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param year 年 + * @param month 月 + * @param day 日 + * @return そのアカウントの本に所属するtodoのうち、指定した年月日のtodoを返します + */ + public HashMap getTodosByDay(String accountId, Integer bookId, int year, int month, int day){ + HashMap todos = getTodosByMonth(accountId, bookId, year, month); + HashMap resultTodos = new HashMap<>(); + for(Todo todo : todos.values()){ + if(todo.getDay() == day){ + resultTodos.put(todo.getTodoId(), todo); + } + } + return resultTodos; + } + + /** + * 年月日を-区切りの文字列で指定してtodoをtodo_id->todoの辞書で返す + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param yearMonthDay 年月日を-で区切った文字列 + * @return そのアカウントの本に所属するtodoのうち、指定した年月日のtodoを返します + */ + public HashMap getTodosByDay(String accountId, Integer bookId, String yearMonthDay){ + String[] yearMonthDays = yearMonthDay.split("-"); + int year = Integer.parseInt(yearMonthDays[0]); + int month = Integer.parseInt(yearMonthDays[1]); + int day = Integer.parseInt(yearMonthDays[2]); + return getTodosByDay(accountId, bookId, year, month, day); + } + + + /** + *todo_idを指定してtodoを一つ取得する + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param year 年 + * @param month 月 + * @param day 日 + * @param todoId todoのid + * @return idを指定してtodoを返す + */ + public Todo getTodoById(String accountId, Integer bookId, int year, int month, int day, int todoId){ + return todos.get(accountId).get(bookId).get(todoId); + } + + /** + *todoを追加する + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param todo 追加するべきtodo + */ + public void addDayTodo(String accountId, Integer bookId, Todo todo){ + if(!todos.containsKey(accountId)){ + todos.put(accountId, new HashMap<>()); + + } + if(!todos.get(accountId).containsKey(bookId)){ + todos.get(accountId).put(bookId, new HashMap<>()); + } + String accountBook = accountId + bookId; + if(!nextTodoId.containsKey(accountBook)){ + nextTodoId.put(accountBook, 0); + } + + int tmp = nextTodoId.get(accountBook); + todos.get(accountId).get(bookId).put(tmp, todo); + nextTodoId.put(accountBook, tmp + 1); + + } + + /** + *todo_idを指定してtodoを削除する + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param todoId 削除すべきtodoのid + */ + public void deleteTodoById(String accountId, Integer bookId, Integer todoId){ + todos.get(accountId).get(bookId).remove(todoId); + } + + /** + *指定したtodo_idのtodoの達成状態を変更する + * + * @param accountId アカウントのid + * @param bookId 本のid + * @param todoId 変更したいtodoのid + * @param check 変更後の達成状態 + */ + public void setCheck(String accountId, Integer bookId, Integer todoId, boolean check){ + todos.get(accountId).get(bookId).get(todoId).setCheck(check); + } }