@@ -22,11 +22,17 @@ defmodule ExRssWeb.FeedLive.Index do
22
22
join: e in Entry ,
23
23
on: f . id == e . feed_id ,
24
24
group_by: f . id ,
25
- order_by: [ desc_nulls_last: f . position ] ,
25
+ order_by: [
26
+ desc_nulls_last: f . position ,
27
+ desc_nulls_last: selected_as ( :newest_unread_entry_posted_at )
28
+ ] ,
26
29
select: % {
27
30
f
28
31
| unread_entries_count: filter ( count ( e . id ) , e . read == false ) ,
29
32
read_entries_count: filter ( count ( e . id ) , e . read == true ) ,
33
+ newest_unread_entry_posted_at:
34
+ filter ( max ( e . posted_at ) , e . read == false )
35
+ |> selected_as ( :newest_unread_entry_posted_at ) ,
30
36
has_error: f . retries > 0
31
37
}
32
38
)
@@ -49,14 +55,47 @@ defmodule ExRssWeb.FeedLive.Index do
49
55
end
50
56
51
57
def handle_event ( "mark_as_read" , % { "entry-id" => entry_id } , socket ) do
52
- changeset =
58
+ current_user =
53
59
Repo . get! ( User , socket . assigns . current_user . id )
60
+
61
+ changeset =
62
+ current_user
54
63
|> Ecto . assoc ( :entries )
55
64
|> Repo . get! ( entry_id )
56
65
|> Entry . changeset ( % { "read" => true } )
57
66
58
67
case Repo . update ( changeset ) do
59
68
{ :ok , entry } ->
69
+ feeds_of_current_user = current_user |> Ecto . assoc ( :feeds )
70
+
71
+ feeds_with_counts =
72
+ from (
73
+ f in feeds_of_current_user ,
74
+ join: e in Entry ,
75
+ on: f . id == e . feed_id ,
76
+ group_by: f . id ,
77
+ order_by: [
78
+ desc_nulls_last: f . position ,
79
+ desc_nulls_last: selected_as ( :newest_unread_entry_posted_at )
80
+ ] ,
81
+ select: % {
82
+ f
83
+ | unread_entries_count: filter ( count ( e . id ) , e . read == false ) ,
84
+ read_entries_count: filter ( count ( e . id ) , e . read == true ) ,
85
+ newest_unread_entry_posted_at:
86
+ filter ( max ( e . posted_at ) , e . read == false )
87
+ |> selected_as ( :newest_unread_entry_posted_at ) ,
88
+ has_error: f . retries > 0
89
+ }
90
+ )
91
+
92
+ feeds =
93
+ feeds_with_counts
94
+ |> Repo . all ( )
95
+ |> Repo . preload (
96
+ entries: from ( e in Entry , where: e . read == false , order_by: [ desc: e . posted_at ] )
97
+ )
98
+
60
99
feed_with_counts_query =
61
100
from (
62
101
f in Feed ,
@@ -93,7 +132,7 @@ defmodule ExRssWeb.FeedLive.Index do
93
132
socket =
94
133
socket
95
134
|> assign ( :oldest_unread_entry , oldest_unread_entry )
96
- |> stream_insert ( :feeds , updated_feed )
135
+ |> stream ( :feeds , feeds , reset: true )
97
136
98
137
{ :noreply , socket }
99
138
@@ -103,15 +142,48 @@ defmodule ExRssWeb.FeedLive.Index do
103
142
end
104
143
105
144
def handle_event ( "mark_as_read" , % { "feed-id" => feed_id } , socket ) do
106
- changeset =
145
+ current_user =
107
146
Repo . get! ( User , socket . assigns . current_user . id )
147
+
148
+ changeset =
149
+ current_user
108
150
|> Ecto . assoc ( :feeds )
109
151
|> Repo . get! ( feed_id )
110
152
|> Repo . preload ( :entries )
111
153
|> Feed . mark_as_read ( )
112
154
113
155
case Repo . update ( changeset ) do
114
156
{ :ok , feed } ->
157
+ feeds_of_current_user = current_user |> Ecto . assoc ( :feeds )
158
+
159
+ feeds_with_counts =
160
+ from (
161
+ f in feeds_of_current_user ,
162
+ join: e in Entry ,
163
+ on: f . id == e . feed_id ,
164
+ group_by: f . id ,
165
+ order_by: [
166
+ desc_nulls_last: f . position ,
167
+ desc_nulls_last: selected_as ( :newest_unread_entry_posted_at )
168
+ ] ,
169
+ select: % {
170
+ f
171
+ | unread_entries_count: filter ( count ( e . id ) , e . read == false ) ,
172
+ read_entries_count: filter ( count ( e . id ) , e . read == true ) ,
173
+ newest_unread_entry_posted_at:
174
+ filter ( max ( e . posted_at ) , e . read == false )
175
+ |> selected_as ( :newest_unread_entry_posted_at ) ,
176
+ has_error: f . retries > 0
177
+ }
178
+ )
179
+
180
+ feeds =
181
+ feeds_with_counts
182
+ |> Repo . all ( )
183
+ |> Repo . preload (
184
+ entries: from ( e in Entry , where: e . read == false , order_by: [ desc: e . posted_at ] )
185
+ )
186
+
115
187
feed_with_counts_query =
116
188
from (
117
189
f in Feed ,
@@ -148,7 +220,7 @@ defmodule ExRssWeb.FeedLive.Index do
148
220
socket =
149
221
socket
150
222
|> assign ( :oldest_unread_entry , oldest_unread_entry )
151
- |> stream_insert ( :feeds , updated_feed )
223
+ |> stream ( :feeds , feeds , reset: true )
152
224
153
225
{ :noreply , socket }
154
226
@@ -181,11 +253,17 @@ defmodule ExRssWeb.FeedLive.Index do
181
253
join: e in Entry ,
182
254
on: f . id == e . feed_id ,
183
255
group_by: f . id ,
184
- order_by: [ desc_nulls_last: f . position ] ,
256
+ order_by: [
257
+ desc_nulls_last: f . position ,
258
+ desc_nulls_last: selected_as ( :newest_unread_entry_posted_at )
259
+ ] ,
185
260
select: % {
186
261
f
187
262
| unread_entries_count: filter ( count ( e . id ) , e . read == false ) ,
188
263
read_entries_count: filter ( count ( e . id ) , e . read == true ) ,
264
+ newest_unread_entry_posted_at:
265
+ filter ( max ( e . posted_at ) , e . read == false )
266
+ |> selected_as ( :newest_unread_entry_posted_at ) ,
189
267
has_error: f . retries > 0
190
268
}
191
269
)
@@ -231,11 +309,17 @@ defmodule ExRssWeb.FeedLive.Index do
231
309
join: e in Entry ,
232
310
on: f . id == e . feed_id ,
233
311
group_by: f . id ,
234
- order_by: [ desc_nulls_last: f . position ] ,
312
+ order_by: [
313
+ desc_nulls_last: f . position ,
314
+ desc_nulls_last: selected_as ( :newest_unread_entry_posted_at )
315
+ ] ,
235
316
select: % {
236
317
f
237
318
| unread_entries_count: filter ( count ( e . id ) , e . read == false ) ,
238
319
read_entries_count: filter ( count ( e . id ) , e . read == true ) ,
320
+ newest_unread_entry_posted_at:
321
+ filter ( max ( e . posted_at ) , e . read == false )
322
+ |> selected_as ( :newest_unread_entry_posted_at ) ,
239
323
has_error: f . retries > 0
240
324
}
241
325
)
0 commit comments