-
Notifications
You must be signed in to change notification settings - Fork 36
/
todo.service.ts
115 lines (101 loc) · 3.21 KB
/
todo.service.ts
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import * as uuid from 'uuid';
import * as Promise from 'bluebird';
import * as model from './todo.model';
import * as persistence from './todo.persistence';
import * as persistenceLs from './todo.persistence-ls';
import { Todo } from './todo.interface';
const defaultTodos: Todo[] = [
{id: uuid.v4(), description: 'Explore todo example', done: true},
{id: uuid.v4(), description: 'Sing in to persist todos to backend', done: false},
{id: uuid.v4(), description: 'Check sources on Github', done: false}
];
let isAuthenticated: boolean = false;
export function init(isAuth: boolean) {
isAuthenticated = isAuth;
if (isAuthenticated) {
persistence.findAll()
.then(_sortTodosByCreatedAt)
.then(model.setTodos);
} else {
let todosLs: Todo[] = persistenceLs.getTodos();
model.setTodos(todosLs.length ? todosLs : defaultTodos);
}
}
export function createTodo(description: string) {
let todo: Todo = {
id: uuid.v4(),
description: description,
done: false
};
if (isAuthenticated) {
persistence.create(todo)
.then(persistence.findAll)
.then(_sortTodosByCreatedAt)
.then(model.setTodos);
} else {
model.addTodo(todo);
persistenceLs.setTodos(model.getTodos());
}
}
export function toggleTodo(id: string) {
let todo: Todo = model.getTodo(id);
todo.done = !todo.done;
if (isAuthenticated) {
persistence.update(todo)
.then(persistence.findAll)
.then(_sortTodosByCreatedAt)
.then(model.setTodos);
} else {
model.replaceTodo(todo);
persistenceLs.setTodos(model.getTodos());
}
}
export function editTodo(id: string, description: string) {
let todo: Todo = model.getTodo(id);
todo.description = description;
if (isAuthenticated) {
persistence.update(todo)
.then(persistence.findAll)
.then(_sortTodosByCreatedAt)
.then(model.setTodos);
} else {
model.replaceTodo(todo);
persistenceLs.setTodos(model.getTodos());
}
}
export function removeTodo(id: string) {
if (isAuthenticated) {
persistence.remove(id)
.then(persistence.findAll)
.then(_sortTodosByCreatedAt)
.then(model.setTodos);
} else {
model.removeTodo(id);
persistenceLs.setTodos(model.getTodos());
}
}
export function removeDoneTodos() {
let todos: Todo[] = model.getTodos();
if (isAuthenticated) {
let promises: Promise<any>[] = [];
_.forEach(todos, (t: Todo) => t.done ? promises.push(persistence.remove(t.id)) : undefined);
Promise.all(promises)
.then(persistence.findAll)
.then(_sortTodosByCreatedAt)
.then(model.setTodos);
} else {
_.forEach(todos, (t: Todo) => t.done ? model.removeTodo(t.id) : undefined);
persistenceLs.setTodos(model.getTodos());
}
}
function _sortTodosByCreatedAt(todos: Todo[]) {
return todos.sort((a: Todo, b: Todo) => {
if (a.createdAt > b.createdAt) {
return 1;
}
if (a.createdAt < b.createdAt) {
return -1;
}
return 0;
});
}