From df5239cac185ce7de7436c0cd0b6c913c9d588c1 Mon Sep 17 00:00:00 2001 From: Adam Sharp Date: Sun, 17 May 2020 20:21:48 -0400 Subject: [PATCH 1/4] Order announcements by last_discussed_at in API --- lib/constable/models/announcement.ex | 4 ++++ .../controllers/api/announcement_controller.ex | 10 +++++----- lib/constable_web/views/api/announcement_view.ex | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) 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..44776be6 100644 --- a/lib/constable_web/controllers/api/announcement_controller.ex +++ b/lib/constable_web/controllers/api/announcement_controller.ex @@ -14,8 +14,8 @@ defmodule ConstableWeb.Api.AnnouncementController do announcements = Announcement - |> where([a], a.inserted_at < ^cursor.inserted_at) - |> order_by(desc: :inserted_at) + |> where([a], a.last_discussed_at < ^cursor.last_discussed_at) + |> Announcement.last_discussed_first() |> limit(^limit) |> Repo.all() @@ -28,8 +28,8 @@ defmodule ConstableWeb.Api.AnnouncementController do announcements = Announcement - |> where([a], ^cursor.inserted_at < a.inserted_at) - |> order_by(:inserted_at) + |> where([a], ^cursor.last_discussed_at < a.last_discussed_at) + |> Announcement.oldest_discussed_first() |> limit(^limit) |> Repo.all() |> Enum.reverse() @@ -42,7 +42,7 @@ defmodule ConstableWeb.Api.AnnouncementController do announcements = Announcement - |> order_by(desc: :inserted_at) + |> Announcement.last_discussed_first() |> limit(^limit) |> Repo.all() diff --git a/lib/constable_web/views/api/announcement_view.ex b/lib/constable_web/views/api/announcement_view.ex index 8c824c61..037bc356 100644 --- a/lib/constable_web/views/api/announcement_view.ex +++ b/lib/constable_web/views/api/announcement_view.ex @@ -22,6 +22,7 @@ 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, comments: render_many(announcement.comments, CommentView, "comment.json"), From d9c9b7b03941cd62b052ecb9d9f3d2b5d1c3fc2c Mon Sep 17 00:00:00 2001 From: Adam Sharp Date: Mon, 18 May 2020 13:37:03 -0400 Subject: [PATCH 2/4] Embed author information in announcement list --- .../controllers/api/announcement_controller.ex | 13 ++++++++++--- lib/constable_web/views/api/announcement_view.ex | 3 ++- lib/constable_web/views/api/user_view.ex | 9 +++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/constable_web/controllers/api/announcement_controller.ex b/lib/constable_web/controllers/api/announcement_controller.ex index 44776be6..4d69f612 100644 --- a/lib/constable_web/controllers/api/announcement_controller.ex +++ b/lib/constable_web/controllers/api/announcement_controller.ex @@ -13,8 +13,9 @@ defmodule ConstableWeb.Api.AnnouncementController do cursor = Repo.get(Announcement, after_id) announcements = - Announcement + 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,8 +28,9 @@ defmodule ConstableWeb.Api.AnnouncementController do cursor = Repo.get(Announcement, before_id) announcements = - Announcement + 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() @@ -41,7 +43,8 @@ defmodule ConstableWeb.Api.AnnouncementController do limit = Map.get(params, "page_size", 50) announcements = - Announcement + interesting_announcements(conn.assigns.current_user) + |> Announcement.with_announcement_list_assocs() |> Announcement.last_discussed_first() |> limit(^limit) |> Repo.all() @@ -49,6 +52,10 @@ defmodule ConstableWeb.Api.AnnouncementController do 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 037bc356..8a70c097 100644 --- a/lib/constable_web/views/api/announcement_view.ex +++ b/lib/constable_web/views/api/announcement_view.ex @@ -2,6 +2,7 @@ defmodule ConstableWeb.Api.AnnouncementView do use ConstableWeb, :view alias ConstableWeb.Api.CommentView + alias ConstableWeb.Api.UserView def render("index.json", %{announcements: announcements}) do announcements = announcements |> Repo.preload([:comments, :interests]) @@ -24,7 +25,7 @@ defmodule ConstableWeb.Api.AnnouncementView do 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), url: 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 From 72a0b9982360db602be1b23370f49287f82d6498 Mon Sep 17 00:00:00 2001 From: Adam Sharp Date: Mon, 18 May 2020 13:38:11 -0400 Subject: [PATCH 3/4] Embed interests in announcements list --- lib/constable_web/views/api/announcement_view.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/constable_web/views/api/announcement_view.ex b/lib/constable_web/views/api/announcement_view.ex index 8a70c097..f4bb16fb 100644 --- a/lib/constable_web/views/api/announcement_view.ex +++ b/lib/constable_web/views/api/announcement_view.ex @@ -2,6 +2,7 @@ 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 @@ -27,7 +28,7 @@ defmodule ConstableWeb.Api.AnnouncementView do updated_at: announcement.updated_at, 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) } From 0fbb24ba5a1fa5875c901e24f57d83823e3a6afb Mon Sep 17 00:00:00 2001 From: Adam Sharp Date: Fri, 18 Sep 2020 15:56:17 -0400 Subject: [PATCH 4/4] wip: factories --- test/controllers/api/announcement_controller_test.exs | 6 ++++-- test/support/conn_case_helper.ex | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) 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")