diff --git a/lib/constable/models/announcement.ex b/lib/constable/models/announcement.ex index 6f6c79ee..9e41b109 100644 --- a/lib/constable/models/announcement.ex +++ b/lib/constable/models/announcement.ex @@ -38,6 +38,10 @@ defmodule Constable.Announcement do query |> order_by(desc: :last_discussed_at) end + def oldest_discussed_first(query \\ __MODULE__) do + query |> order_by(asc: :last_discussed_at) + end + def with_announcement_list_assocs(query \\ __MODULE__) do from q in query, preload: [ diff --git a/lib/constable_web/controllers/api/announcement_controller.ex b/lib/constable_web/controllers/api/announcement_controller.ex index ab271ffa..4d69f612 100644 --- a/lib/constable_web/controllers/api/announcement_controller.ex +++ b/lib/constable_web/controllers/api/announcement_controller.ex @@ -13,9 +13,10 @@ defmodule ConstableWeb.Api.AnnouncementController do cursor = Repo.get(Announcement, after_id) announcements = - Announcement - |> where([a], a.inserted_at < ^cursor.inserted_at) - |> order_by(desc: :inserted_at) + interesting_announcements(conn.assigns.current_user) + |> where([a], a.last_discussed_at < ^cursor.last_discussed_at) + |> Announcement.with_announcement_list_assocs() + |> Announcement.last_discussed_first() |> limit(^limit) |> Repo.all() @@ -27,9 +28,10 @@ defmodule ConstableWeb.Api.AnnouncementController do cursor = Repo.get(Announcement, before_id) announcements = - Announcement - |> where([a], ^cursor.inserted_at < a.inserted_at) - |> order_by(:inserted_at) + interesting_announcements(conn.assigns.current_user) + |> where([a], ^cursor.last_discussed_at < a.last_discussed_at) + |> Announcement.with_announcement_list_assocs() + |> Announcement.oldest_discussed_first() |> limit(^limit) |> Repo.all() |> Enum.reverse() @@ -41,14 +43,19 @@ defmodule ConstableWeb.Api.AnnouncementController do limit = Map.get(params, "page_size", 50) announcements = - Announcement - |> order_by(desc: :inserted_at) + interesting_announcements(conn.assigns.current_user) + |> Announcement.with_announcement_list_assocs() + |> Announcement.last_discussed_first() |> limit(^limit) |> Repo.all() render(conn, "index.json", announcements: announcements) end + defp interesting_announcements(user) do + user |> Ecto.assoc(:interesting_announcements) + end + def create( conn, %{"announcement" => announcement_params, "interest_names" => interest_names} diff --git a/lib/constable_web/views/api/announcement_view.ex b/lib/constable_web/views/api/announcement_view.ex index 8c824c61..f4bb16fb 100644 --- a/lib/constable_web/views/api/announcement_view.ex +++ b/lib/constable_web/views/api/announcement_view.ex @@ -2,6 +2,8 @@ defmodule ConstableWeb.Api.AnnouncementView do use ConstableWeb, :view alias ConstableWeb.Api.CommentView + alias ConstableWeb.Api.InterestView + alias ConstableWeb.Api.UserView def render("index.json", %{announcements: announcements}) do announcements = announcements |> Repo.preload([:comments, :interests]) @@ -22,10 +24,11 @@ defmodule ConstableWeb.Api.AnnouncementView do title: announcement.title, body: announcement.body, inserted_at: announcement.inserted_at, + last_discussed_at: announcement.last_discussed_at, updated_at: announcement.updated_at, - user_id: announcement.user_id, + user: render_one(announcement.user, UserView, "author.json"), comments: render_many(announcement.comments, CommentView, "comment.json"), - interest_ids: pluck(announcement.interests, :id), + interests: render_many(announcement.interests, InterestView, "interest.json"), url: ConstableWeb.Router.Helpers.announcement_url(ConstableWeb.Endpoint, :show, announcement) } diff --git a/lib/constable_web/views/api/user_view.ex b/lib/constable_web/views/api/user_view.ex index 96d0d7a1..ceb9a140 100644 --- a/lib/constable_web/views/api/user_view.ex +++ b/lib/constable_web/views/api/user_view.ex @@ -23,4 +23,13 @@ defmodule ConstableWeb.Api.UserView do subscriptions: pluck(user.subscriptions, :id) } end + + def render("author.json", %{user: user}) do + %{ + id: user.id, + name: user.name, + profile_image_url: profile_provider().image_url(user), + username: user.username + } + end end diff --git a/test/controllers/api/announcement_controller_test.exs b/test/controllers/api/announcement_controller_test.exs index 9921900c..35e79643 100644 --- a/test/controllers/api/announcement_controller_test.exs +++ b/test/controllers/api/announcement_controller_test.exs @@ -17,8 +17,10 @@ defmodule ConstableWeb.Api.AnnouncementControllerTest do end test "#index lists announcements after the provided id", %{conn: conn, user: user} do - announcement1 = insert(:announcement, inserted_at: ~N[2020-05-16 00:00:00], user: user) - announcement2 = insert(:announcement, inserted_at: ~N[2020-05-17 00:00:00], user: user) + interest = insert(:interest, name: "everyone") + insert(:user_interest, interest: interest, user: user) + announcement1 = insert(:announcement, last_discussed_at: ~N[2020-05-16 00:00:00], interests: [interest], user: user) + announcement2 = insert(:announcement, last_discussed_at: ~N[2020-05-17 00:00:00], interests: [interest], user: user) conn = get(conn, Routes.api_announcement_path(conn, :index), %{"after" => announcement2.id}) diff --git a/test/support/conn_case_helper.ex b/test/support/conn_case_helper.ex index 197db094..7c9561d3 100644 --- a/test/support/conn_case_helper.ex +++ b/test/support/conn_case_helper.ex @@ -11,7 +11,7 @@ defmodule ConstableWeb.ConnCaseHelper do %{conn: conn, user: user} end - def api_authenticate(user \\ insert(:user)) do + def api_authenticate(user \\ insert(:user) |> with_interest()) do conn = build_conn() |> put_req_header("accept", "application/json")