-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathInMemoryTodoManager.kt
63 lines (53 loc) · 2.14 KB
/
InMemoryTodoManager.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package todoapp.application.support
import kotlinx.datetime.LocalDateTime
import mu.KotlinLogging
import todoapp.application.TodoCleanup
import todoapp.application.TodoFind
import todoapp.application.TodoModification
import todoapp.application.TodoRegistry
import todoapp.domain.Todo
import todoapp.domain.TodoId
import todoapp.domain.TodoIdGenerator
import todoapp.domain.Todos
/**
* 메모리 기반 할 일 관리 컴포넌트
*
* @author [email protected]
*/
class InMemoryTodoManager(
private val todoIdGenerator: TodoIdGenerator
): TodoFind, TodoRegistry, TodoModification, TodoCleanup {
private val todos = mutableListOf(
Todo(id = todoIdGenerator.generateId(), text = "Task One", createdDate = LocalDateTime.parse("2016-02-15T10:00:00")),
Todo(id = todoIdGenerator.generateId(), text = "Task Two", createdDate = LocalDateTime.parse("2016-02-15T10:00:10"))
)
private val logger = KotlinLogging.logger("todoapp.application.support.InMemoryTodoManager")
override suspend fun all(): Todos = Todos(todos.sortedBy { it.createdDate })
override suspend fun byId(id: TodoId): Todo = loadTodoById(id)
override suspend fun register(text: String): TodoId {
return Todo.create(text = text, idGenerator = todoIdGenerator).apply {
todos.add(this)
logger.info { "registered todo (id: $id)" }
}.id
}
override suspend fun modify(id: TodoId, text: String, completed: Boolean) {
loadTodoById(id).update(text = text, completed = completed).run {
todos.remove(this)
todos.add(this)
logger.info { "Modified todo (id: $id)" }
}
}
override suspend fun clear(id: TodoId) {
loadTodoById(id).run {
todos.remove(this)
logger.info { "Cleared todo (id: $id)" }
}
}
override suspend fun clearAllCompleted() {
val activeTodos = todos.filter { !it.completed }
todos.clear()
todos.addAll(activeTodos)
logger.info { "Cleared completed todos" }
}
private fun loadTodoById(id: TodoId) = todos.firstOrNull { it.id == id } ?: error("Not Found Todo (id: $id)")
}