Skip to content

Commit

Permalink
feat(transfers): allow filtering by creator id
Browse files Browse the repository at this point in the history
  • Loading branch information
Gladear committed Jan 12, 2025
1 parent 8665ff9 commit 41bf1f3
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 16 deletions.
42 changes: 26 additions & 16 deletions apps/app/lib/app/transfers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,18 @@ defmodule App.Transfers do
## Filters

@filters_default %{
sort_by: :most_recent,
tenanted_by: nil
tenanted_by: nil,
created_by: nil,
sort_by: :most_recent
}
@filters_types %{
# Values are `nil`, `member_id` or `{:not, member_id}`
tenanted_by: :any,
created_by: {:array, :integer},
sort_by:
Ecto.ParameterizedType.init(Ecto.Enum,
values: [:most_recent, :oldest, :last_created, :first_created]
),
# Values are `nil`, `member_id` or `{:not, member_id}`
tenanted_by: :any
)
}

defp filter_money_transfers_query(query, raw_filters) do
Expand All @@ -96,10 +98,28 @@ defmodule App.Transfers do
|> Ecto.Changeset.apply_changes()

query
|> sort_money_transfers_by(filters[:sort_by])
|> filter_money_transfers_by_tenancy(filters[:tenanted_by])
|> filter_money_transfers_by_creator(filters[:created_by])
|> sort_money_transfers_by(filters[:sort_by])
end

defp filter_money_transfers_by_tenancy(query, {:not, member_id}) when is_integer(member_id) do
from [money_transfer: money_transfer] in query, where: money_transfer.tenant_id != ^member_id
end

defp filter_money_transfers_by_tenancy(query, member_id) when is_integer(member_id) do
from [money_transfer: money_transfer] in query, where: money_transfer.tenant_id == ^member_id
end

defp filter_money_transfers_by_tenancy(query, nil), do: query

defp filter_money_transfers_by_creator(query, creator_ids) when is_list(creator_ids) do
from [money_transfer: money_transfer] in query,
where: money_transfer.creator_id in ^creator_ids
end

defp filter_money_transfers_by_creator(query, nil), do: query

defp sort_money_transfers_by(query, :most_recent) do
from [money_transfer: money_transfer] in query, order_by: [desc: money_transfer.date]
end
Expand All @@ -116,16 +136,6 @@ defmodule App.Transfers do
from [money_transfer: money_transfer] in query, order_by: [asc: money_transfer.inserted_at]
end

defp filter_money_transfers_by_tenancy(query, {:not, member_id}) when is_integer(member_id) do
from [money_transfer: money_transfer] in query, where: money_transfer.tenant_id != ^member_id
end

defp filter_money_transfers_by_tenancy(query, member_id) when is_integer(member_id) do
from [money_transfer: money_transfer] in query, where: money_transfer.tenant_id == ^member_id
end

defp filter_money_transfers_by_tenancy(query, nil), do: query

## Pagination

defp paginate_query(query, offset, limit) do
Expand Down
17 changes: 17 additions & 0 deletions apps/app/test/app/transfers_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,23 @@ defmodule App.TransfersTest do
|> Enum.map(& &1.id) == [transfer2.id]
end

test "filters by creator", %{book: book} do
member1 = book_member_fixture(book)
member2 = book_member_fixture(book)
member3 = book_member_fixture(book)

transfer1 = money_transfer_fixture(book, tenant_id: member1.id, creator_id: member1.id)
transfer2 = money_transfer_fixture(book, tenant_id: member1.id, creator_id: member2.id)

assert Transfers.list_transfers_of_book(book, filters: %{created_by: [member1.id]})
|> Enum.map(& &1.id) == [transfer1.id]

assert Transfers.list_transfers_of_book(book, filters: %{created_by: [member2.id]})
|> Enum.map(& &1.id) == [transfer2.id]

assert Transfers.list_transfers_of_book(book, filters: %{created_by: [member3.id]}) == []
end

test "paginates results", %{book: book, member: member} do
transfer1 = money_transfer_fixture(book, tenant_id: member.id, date: ~D[2020-06-29])
transfer2 = money_transfer_fixture(book, tenant_id: member.id, date: ~D[2020-06-30])
Expand Down
19 changes: 19 additions & 0 deletions apps/app_web/lib/app_web/live/books/book_transfers_live.ex
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ defmodule AppWeb.BookTransfersLive do
others: gettext("Others")
]
),
multi_select(
name: "created_by",
label: gettext("Created by"),
options: @book_members_options
),
sort_by(
options: [
most_recent: gettext("Most recent"),
Expand Down Expand Up @@ -122,6 +127,7 @@ defmodule AppWeb.BookTransfersLive do
page: 1,
per_page: 25
)
|> assign_book_members_options()
|> assign_filters(%{"sort_by" => "most_recent"})
|> paginate_transfers(1)

Expand Down Expand Up @@ -209,6 +215,19 @@ defmodule AppWeb.BookTransfersLive do
{:noreply, socket}
end

defp assign_book_members_options(socket) do
book = socket.assigns.book

book_members_options =
from(book_member in BookMember.book_query(book),
order_by: [asc: book_member.nickname],
select: {book_member.id, book_member.nickname}
)
|> Repo.all()

assign(socket, :book_members_options, book_members_options)
end

defp assign_filters(socket, filters) do
current_member = socket.assigns.current_member

Expand Down

0 comments on commit 41bf1f3

Please sign in to comment.