@@ -14,6 +14,8 @@ defmodule TodoApp.Todo do
1414 end
1515
1616 @ topic "todos"
17+ @ completed_log_topic "completed_tasks_log"
18+
1719 def toggle_todo ( id ) do
1820 todo = Repo . get ( __MODULE__ , id )
1921
@@ -23,12 +25,28 @@ defmodule TodoApp.Todo do
2325 "done" -> "todo"
2426 end
2527
28+ if status == "done" do
29+ log_completed_task ( todo . text )
30+ end
31+
2632 change ( todo , % { status: status } )
2733 |> Repo . update ( )
2834
2935 Phoenix.PubSub . broadcast ( TodoApp.PubSub , @ topic , :changed )
3036 end
3137
38+ defp log_completed_task ( text ) do
39+ completed_at = DateTime . utc_now ( ) |> DateTime . to_iso8601 ( )
40+
41+ Ecto.Adapters.SQL . query! (
42+ Repo ,
43+ "INSERT INTO completed_tasks_log (text, completed_at) VALUES (?, ?)" ,
44+ [ text , completed_at ]
45+ )
46+
47+ Phoenix.PubSub . broadcast ( TodoApp.PubSub , @ completed_log_topic , :completed_log_changed )
48+ end
49+
3250 def drop_todo ( id ) do
3351 Repo . get ( __MODULE__ , id )
3452 |> Repo . delete ( )
@@ -44,11 +62,30 @@ defmodule TodoApp.Todo do
4462 end
4563
4664 def all_todos ( ) do
47- order_by ( __MODULE__ , asc : :id )
65+ order_by ( __MODULE__ , desc : :id )
4866 |> Repo . all ( )
4967 end
5068
5169 def subscribe ( ) do
5270 Phoenix.PubSub . subscribe ( TodoApp.PubSub , @ topic )
5371 end
72+
73+ def list_completed_log ( ) do
74+ { :ok , result } =
75+ Ecto.Adapters.SQL . query (
76+ Repo ,
77+ "SELECT id, text, completed_at FROM completed_tasks_log ORDER BY completed_at DESC" ,
78+ [ ]
79+ )
80+
81+ rows = result . rows || [ ]
82+
83+ Enum . map ( rows , fn [ id , text , completed_at ] ->
84+ % { id: id , text: text , completed_at: completed_at }
85+ end )
86+ end
87+
88+ def subscribe_completed_log ( ) do
89+ Phoenix.PubSub . subscribe ( TodoApp.PubSub , @ completed_log_topic )
90+ end
5491end
0 commit comments