From 9fe3eb258327dbbd3abe9fd374132405a953644b Mon Sep 17 00:00:00 2001 From: Renato Atilio Date: Mon, 8 Jan 2024 15:09:47 -0300 Subject: [PATCH] FEATURE: support count parameter on the events list component (#513) * FEATURE: support count parameter on the events list component * DEV: fix linting --- .../discourse_post_event/events_controller.rb | 2 +- .../components/upcoming-events-list.gjs | 4 +- lib/discourse_post_event/event_finder.rb | 4 +- .../discourse_post_event/event_finder_spec.rb | 10 ++ spec/requests/events_controller_spec.rb | 9 ++ .../components/upcoming-events-list-test.gjs | 104 ++++++++++++------ 6 files changed, 96 insertions(+), 37 deletions(-) diff --git a/app/controllers/discourse_post_event/events_controller.rb b/app/controllers/discourse_post_event/events_controller.rb index 3a2c48ac..ffaf58fe 100644 --- a/app/controllers/discourse_post_event/events_controller.rb +++ b/app/controllers/discourse_post_event/events_controller.rb @@ -119,7 +119,7 @@ module DiscoursePostEvent private def filtered_events_params - params.permit(:post_id, :category_id, :include_subcategories, :include_expired) + params.permit(:post_id, :category_id, :include_subcategories, :include_expired, :limit) end end end diff --git a/assets/javascripts/discourse/components/upcoming-events-list.gjs b/assets/javascripts/discourse/components/upcoming-events-list.gjs index 3aeff508..01a1dce1 100644 --- a/assets/javascripts/discourse/components/upcoming-events-list.gjs +++ b/assets/javascripts/discourse/components/upcoming-events-list.gjs @@ -12,6 +12,7 @@ import { isNotFullDayEvent } from "../lib/guess-best-date-format"; export const DEFAULT_MONTH_FORMAT = "MMMM YYYY"; export const DEFAULT_DATE_FORMAT = "dddd, MMM D"; export const DEFAULT_TIME_FORMAT = "LT"; +const DEFAULT_COUNT = 8; export default class UpcomingEventsList extends Component { @service appEvents; @@ -25,6 +26,7 @@ export default class UpcomingEventsList extends Component { monthFormat = this.args.params?.monthFormat ?? DEFAULT_MONTH_FORMAT; dateFormat = this.args.params?.dateFormat ?? DEFAULT_DATE_FORMAT; timeFormat = this.args.params?.timeFormat ?? DEFAULT_TIME_FORMAT; + count = this.args.params?.count ?? DEFAULT_COUNT; title = I18n.t( "discourse_calendar.discourse_post_event.upcoming_events_list.title" @@ -75,7 +77,7 @@ export default class UpcomingEventsList extends Component { try { const { events } = await ajax("/discourse-post-event/events", { - data: { category_id: this.categoryId }, + data: { category_id: this.categoryId, limit: this.count }, }); this.eventsByMonth = this.groupByMonthAndDay(events); diff --git a/lib/discourse_post_event/event_finder.rb b/lib/discourse_post_event/event_finder.rb index a0b70024..d9e51e4d 100644 --- a/lib/discourse_post_event/event_finder.rb +++ b/lib/discourse_post_event/event_finder.rb @@ -16,7 +16,7 @@ module DiscoursePostEvent ROW_NUMBER() OVER (PARTITION BY event_id ORDER BY finished_at DESC NULLS FIRST) as row_num FROM discourse_calendar_post_event_dates ) dcped ON dcped.event_id = discourse_post_event_events.id AND dcped.row_num = 1 - + SQL events = DiscoursePostEvent::Event @@ -46,6 +46,8 @@ module DiscoursePostEvent end end + events = events.limit(params[:limit].to_i) if params[:limit].present? + events end diff --git a/spec/lib/discourse_post_event/event_finder_spec.rb b/spec/lib/discourse_post_event/event_finder_spec.rb index 58e13ca8..9b4bfa68 100644 --- a/spec/lib/discourse_post_event/event_finder_spec.rb +++ b/spec/lib/discourse_post_event/event_finder_spec.rb @@ -172,5 +172,15 @@ describe DiscoursePostEvent::EventFinder do end end end + + describe "with a limit parameter provided" do + let!(:event1) { Fabricate(:event) } + let!(:event2) { Fabricate(:event) } + let!(:event3) { Fabricate(:event) } + + it "returns the correct number of events" do + expect(finder.search(current_user, { limit: 2 })).to match_array([event1, event2]) + end + end end end diff --git a/spec/requests/events_controller_spec.rb b/spec/requests/events_controller_spec.rb index a85e7255..8f725ea1 100644 --- a/spec/requests/events_controller_spec.rb +++ b/spec/requests/events_controller_spec.rb @@ -290,6 +290,15 @@ module DiscoursePostEvent ], ) end + + it "limits the number of events returned when limit param provided" do + get "/discourse-post-event/events.json?category_id=#{category.id}&include_subcategories=true&limit=1" + + expect(response.status).to eq(200) + events = response.parsed_body["events"] + expect(events.length).to eq(1) + expect(events[0]["id"]).to eq(event_1.id) + end end end end diff --git a/test/javascripts/integration/components/upcoming-events-list-test.gjs b/test/javascripts/integration/components/upcoming-events-list-test.gjs index ccf28821..d190f5e7 100644 --- a/test/javascripts/integration/components/upcoming-events-list-test.gjs +++ b/test/javascripts/integration/components/upcoming-events-list-test.gjs @@ -134,7 +134,7 @@ module("Integration | Component | upcoming-events-list", function (hooks) { ); }); - test("with events, overriden formats", async function (assert) { + test("with events, overridden formats", async function (assert) { pretender.get("/discourse-post-event/events", twoEventsResponseHandler); await render(