@startuml
'https://plantuml.com/class-diagram


class User {
string id
TodoApplication todo_application
Analyser analyser
Notifier[] notifiers
addTodoApplication()
removeTodoApplication()
setAnalyseCondition()
}

abstract class TodoApplication {
int application_user_id
string access_token
Todo[] todos
Project[] projects
Tag[] tags
Json sync_status
sync()
createTag()
}

abstract class Todo {
string name
int project_id
int[] tag_ids
datetime sync_started_at
datetime sync_ended_at
datetime[] done_datetimes
sync()
addTag()
addCommend()
}

class Analyser {
condition
setCondition()
run()
}

abstract class Notifier {
condition
setCondition()
run()
}

class Project {
int id
string name
}

class Tag {
int id
string name
}

Analyser .left> TodoApplication : analyse

User "1"--"1" TodoApplication
User "1"--"1" Analyser
User "1"-"0..*" Notifier

TodoApplication "1"--"0..*" Todo
TodoApplication "1"--"0..*" Project
TodoApplication "1"--"0..*" Tag
Todo -left Project
Todo -right Tag

TodoApplication <|-up- Todoist
TodoApplication <|-left- Torello

Todo <|-- TodoOfTodoist
Todo <|-- TodoOfTorello

Notifier <|-- Mail
Notifier <|-- Slack

@enduml
