Skip to content

Commit 15d84db

Browse files
authored
Merge pull request #1323 from code-corps/conv-query-active
Add active filter
2 parents 8caa708 + 21e5aa6 commit 15d84db

File tree

4 files changed

+47
-13
lines changed

4 files changed

+47
-13
lines changed

lib/code_corps/messages/conversation_query.ex

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ defmodule CodeCorps.Messages.ConversationQuery do
3333

3434

3535
@doc ~S"""
36-
Narrows down a `CodeCorps.Conversation` query to return only those records
37-
considered to have a specific status.
36+
Filters `CodeCorps.Conversation` record queries to return only those
37+
considered to be active.
3838
39-
The status of `active` means that only those records are included which either
40-
- belong to a `CodeCorps.Message` initiated by user
41-
- belong to a `CodeCorps.Message` initiated by admin, with at least a single
42-
reply in the form of a `CodeCorps.ConversationPart`
39+
Active conversations belong either:
40+
- to a `CodeCorps.Message` initiated by user
41+
- to a `CodeCorps.Message` initiated by an admin, with at least a single
42+
conversation part
4343
"""
44-
@spec status_filter(Queryable.t, map) :: Queryable.t
45-
def status_filter(queryable, %{"status" => "active"}) do
44+
@spec active_filter(Queryable.t, map) :: Queryable.t
45+
def active_filter(queryable, %{"active" => true}) do
4646
prefiltered_ids = queryable |> select([c], c.id) |> Repo.all
4747

4848
Conversation
@@ -53,5 +53,15 @@ defmodule CodeCorps.Messages.ConversationQuery do
5353
|> having([_c, m, _cp], m.initiated_by == "user")
5454
|> or_having([c, m, cp], m.initiated_by == "admin" and count(cp.id) > 0)
5555
end
56-
def status_filter(query, %{}), do: query
56+
def active_filter(query, %{}), do: query
57+
58+
@doc ~S"""
59+
Filters `CodeCorps.Conversation` record queries by their status.
60+
"""
61+
@spec status_filter(Queryable.t, map) :: Queryable.t
62+
def status_filter(queryable, %{"status" => status}) do
63+
queryable
64+
|> where([c], c.status == ^status)
65+
end
66+
def status_filter(query, _), do: query
5767
end

lib/code_corps/messages/messages.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ defmodule CodeCorps.Messages do
3030
def list_conversations(scope, %{} = params) do
3131
scope
3232
|> Messages.ConversationQuery.project_filter(params)
33+
|> Messages.ConversationQuery.active_filter(params)
3334
|> Messages.ConversationQuery.status_filter(params)
3435
|> Messages.ConversationQuery.user_filter(params)
3536
|> Repo.all()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule CodeCorps.Messages.ConversationQueryTest do
2+
use CodeCorps.DbAccessCase
3+
4+
alias CodeCorps.{
5+
Conversation,
6+
Messages.ConversationQuery,
7+
Repo
8+
}
9+
10+
describe "status_filter/2" do
11+
test "filters by status" do
12+
open_conversation = insert(:conversation, status: "open")
13+
_closed_conversation = insert(:conversation, status: "closed")
14+
15+
[result] =
16+
Conversation
17+
|> ConversationQuery.status_filter(%{"status" => "open"})
18+
|> Repo.all()
19+
20+
assert result.id == open_conversation.id
21+
end
22+
end
23+
end

test/lib/code_corps/messages/messages_test.exs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ defmodule CodeCorps.MessagesTest do
115115

116116
result_ids =
117117
Conversation
118-
|> Messages.list_conversations(%{"status" => "active"})
118+
|> Messages.list_conversations(%{"active" => true})
119119
|> get_and_sort_ids()
120120

121121
refute conversation_started_by_admin_without_reply.id in result_ids
@@ -125,7 +125,7 @@ defmodule CodeCorps.MessagesTest do
125125

126126
result_ids =
127127
Conversation
128-
|> Messages.list_conversations(%{"status" => "any"})
128+
|> Messages.list_conversations(%{"status" => "open"})
129129
|> get_and_sort_ids()
130130

131131
assert conversation_started_by_admin_without_reply.id in result_ids
@@ -192,7 +192,7 @@ defmodule CodeCorps.MessagesTest do
192192
conversation: other_conversation_started_by_admin_with_reply
193193
)
194194

195-
params = %{"status" => "active", "project_id" => project_1.id}
195+
params = %{"active" => true, "project_id" => project_1.id}
196196
result_ids =
197197
Conversation
198198
|> Messages.list_conversations(params)
@@ -208,7 +208,7 @@ defmodule CodeCorps.MessagesTest do
208208
# project
209209
refute other_conversation_started_by_admin_with_reply.id in result_ids
210210

211-
params = %{"status" => "active", "project_id" => project_2.id}
211+
params = %{"active" => true, "project_id" => project_2.id}
212212
result_ids =
213213
Conversation
214214
|> Messages.list_conversations(params)

0 commit comments

Comments
 (0)