From ca0b4a12c8e34762d27e7af75d615487ccfd7df5 Mon Sep 17 00:00:00 2001 From: northeastprince Date: Mon, 18 Sep 2023 18:51:48 -0400 Subject: [PATCH 01/10] I DECLARE BANKRUPTCY --- app/models/hackathon/digest/listings.rb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/models/hackathon/digest/listings.rb b/app/models/hackathon/digest/listings.rb index 0d863d0a..020772d2 100644 --- a/app/models/hackathon/digest/listings.rb +++ b/app/models/hackathon/digest/listings.rb @@ -7,7 +7,9 @@ module Hackathon::Digest::Listings has_many :listed_subscriptions, through: :listings, source: :subscription before_validation :build_candidate_listings, on: :create, if: -> { listings.empty? } + validates_length_of :listings, minimum: 1, on: :create, message: "must not be empty" + validate :minimum_one_unseen_listing, on: :create, if: -> { errors.none? } end private @@ -15,6 +17,12 @@ module Hackathon::Digest::Listings LISTING_CRITERIA = [Criterion::Location] MAX_LISTINGS = 8 + def build_candidate_listings + applicable_listings.each do |result| + listings.build hackathon: result[:hackathon], subscription: result[:subscription] + end + end + def applicable_listings(listing_criteria: LISTING_CRITERIA, max_listings: MAX_LISTINGS) listing_criteria .flat_map { |criterion| criterion.new(recipient:).candidate_listings } @@ -22,9 +30,9 @@ def applicable_listings(listing_criteria: LISTING_CRITERIA, max_listings: MAX_LI .first(max_listings) end - def build_candidate_listings - applicable_listings.each do |result| - listings.build hackathon: result[:hackathon], subscription: result[:subscription] + def minimum_one_unseen_listing + if listed_hackathons.any? ->(hackathon) { Hackathon::Digest::Listing.exists?(recipient:, hackathon:) } + errors.add :listings, "must include at least one unseen hackathon" end end end From cdf6a4f7313959db894599b7563128d3626c9120 Mon Sep 17 00:00:00 2001 From: Matt Almeida Date: Tue, 19 Sep 2023 08:56:11 -0400 Subject: [PATCH 02/10] Update app/models/hackathon/digest/listings.rb --- app/models/hackathon/digest/listings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/hackathon/digest/listings.rb b/app/models/hackathon/digest/listings.rb index 020772d2..a2d71905 100644 --- a/app/models/hackathon/digest/listings.rb +++ b/app/models/hackathon/digest/listings.rb @@ -31,7 +31,7 @@ def applicable_listings(listing_criteria: LISTING_CRITERIA, max_listings: MAX_LI end def minimum_one_unseen_listing - if listed_hackathons.any? ->(hackathon) { Hackathon::Digest::Listing.exists?(recipient:, hackathon:) } + if listed_hackathons.all? ->(hackathon) { Hackathon::Digest::Listing.exists?(recipient:, hackathon:) } errors.add :listings, "must include at least one unseen hackathon" end end From 9f84e00927712ed7573d5f675414122e0dc72110 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Tue, 26 Sep 2023 16:00:05 -0700 Subject: [PATCH 03/10] Add separation in the digest --- app/models/hackathon/digest/listing.rb | 4 ++++ .../hackathons/digest_mailer/digest.html.erb | 24 +++++++++++++++---- .../hackathons/digest_mailer/digest.text.erb | 22 +++++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/app/models/hackathon/digest/listing.rb b/app/models/hackathon/digest/listing.rb index 3dc066eb..480cf153 100644 --- a/app/models/hackathon/digest/listing.rb +++ b/app/models/hackathon/digest/listing.rb @@ -2,4 +2,8 @@ class Hackathon::Digest::Listing < ApplicationRecord belongs_to :digest, class_name: "Hackathon::Digest" belongs_to :hackathon belongs_to :subscription + + def previously_listed_for_recipient?(recipient: digest.recipient) + Hackathon::Digest::Listing.where(hackathon: hackathon, recipient: recipient) > 1 + end end diff --git a/app/views/hackathons/digest_mailer/digest.html.erb b/app/views/hackathons/digest_mailer/digest.html.erb index 653e3ddc..af3e4176 100644 --- a/app/views/hackathons/digest_mailer/digest.html.erb +++ b/app/views/hackathons/digest_mailer/digest.html.erb @@ -1,13 +1,29 @@

Check out - <% if (count = @digest.listings.count) > 1 %> - these <%= count %> hackathons + <% if (count = @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> + these <%= count %> newly listed hackathons <% else %> - this hackathon + this newly listed hackathon <% end %> coming up near you.

<% @listings_by_subscription.each do |subscription, listings| %> - <%= render "subscription", subscription:, listings: %> + <%= render "subscription", subscription:, listings: listings.select { |listing| listing.previously_listed_for_recipient? }) %> +<% end %> + +<% if listings.reject { |listing| listing.previously_listed_for_recipient? }.count > 0 %> +

+ Here + <% if (count = @digest.listings.count - @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> + are <%= count %> more hackathons + <% else %> + is one more hackathon + <% end %> + coming up near you. +

+ + <% @listings_by_subscription.each do |subscription, listings| %> + <%= render "subscription", subscription:, listings: listings.reject { |listing| listing.previously_listed_for_recipient? }) %> + <% end %> <% end %> diff --git a/app/views/hackathons/digest_mailer/digest.text.erb b/app/views/hackathons/digest_mailer/digest.text.erb index 4c4e728b..10c1b4fa 100644 --- a/app/views/hackathons/digest_mailer/digest.text.erb +++ b/app/views/hackathons/digest_mailer/digest.text.erb @@ -1,7 +1,25 @@ Check out -<%= (count = @digest.listings.count) > 1 ? "these #{count} hackathons" : "this hackathon" %> +<% if (count = @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> + these <%= count %> newly listed hackathons +<% else %> + this newly listed hackathon +<% end %> coming up near you. <% @listings_by_subscription.each do |subscription, listings| %> - <%= render "subscription", subscription:, listings: %> + <%= render "subscription", subscription:, listings: listings.select { |listing| listing.previously_listed_for_recipient? }) %> <% end %> + +<% if listings.reject { |listing| listing.previously_listed_for_recipient? }.count > 0 %> + Here + <% if (count = @digest.listings.count - @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> + are <%= count %> more hackathons + <% else %> + is one more hackathon + <% end %> + coming up near you. + + <% @listings_by_subscription.each do |subscription, listings| %> + <%= render "subscription", subscription:, listings: listings.reject { |listing| listing.previously_listed_for_recipient? }) %> + <% end %> +<% end %> \ No newline at end of file From 81e81a649bf45cdceba7d3a26f7b334287d0cdd2 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Tue, 26 Sep 2023 16:02:06 -0700 Subject: [PATCH 04/10] Update listing.rb --- app/models/hackathon/digest/listing.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/hackathon/digest/listing.rb b/app/models/hackathon/digest/listing.rb index 480cf153..7b25bb53 100644 --- a/app/models/hackathon/digest/listing.rb +++ b/app/models/hackathon/digest/listing.rb @@ -2,7 +2,7 @@ class Hackathon::Digest::Listing < ApplicationRecord belongs_to :digest, class_name: "Hackathon::Digest" belongs_to :hackathon belongs_to :subscription - + def previously_listed_for_recipient?(recipient: digest.recipient) Hackathon::Digest::Listing.where(hackathon: hackathon, recipient: recipient) > 1 end From c66bed71d5d3830ba0600b29bfd40609943bc456 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Tue, 26 Sep 2023 16:46:58 -0700 Subject: [PATCH 05/10] Update app/views/hackathons/digest_mailer/digest.html.erb Co-authored-by: Matt Almeida --- app/views/hackathons/digest_mailer/digest.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/hackathons/digest_mailer/digest.html.erb b/app/views/hackathons/digest_mailer/digest.html.erb index af3e4176..a13e4026 100644 --- a/app/views/hackathons/digest_mailer/digest.html.erb +++ b/app/views/hackathons/digest_mailer/digest.html.erb @@ -1,7 +1,7 @@

Check out <% if (count = @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> - these <%= count %> newly listed hackathons + these <%= count %> new hackathons <% else %> this newly listed hackathon <% end %> From 1e3dde09986b8c4e65a9535f8a4569a87e1b9425 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Tue, 26 Sep 2023 16:47:07 -0700 Subject: [PATCH 06/10] Update app/models/hackathon/digest/listing.rb Co-authored-by: Matt Almeida --- app/models/hackathon/digest/listing.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/hackathon/digest/listing.rb b/app/models/hackathon/digest/listing.rb index 7b25bb53..5aa2996f 100644 --- a/app/models/hackathon/digest/listing.rb +++ b/app/models/hackathon/digest/listing.rb @@ -4,6 +4,6 @@ class Hackathon::Digest::Listing < ApplicationRecord belongs_to :subscription def previously_listed_for_recipient?(recipient: digest.recipient) - Hackathon::Digest::Listing.where(hackathon: hackathon, recipient: recipient) > 1 + self.class.where(hackathon:, recipient:) > 1 end end From 36a60a0f73c471cbae59272e0b586331d480126b Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Thu, 28 Sep 2023 14:33:50 -0700 Subject: [PATCH 07/10] Update digest_mailer.rb --- app/mailers/hackathons/digest_mailer.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/mailers/hackathons/digest_mailer.rb b/app/mailers/hackathons/digest_mailer.rb index d7210a7a..fb7cf1bf 100644 --- a/app/mailers/hackathons/digest_mailer.rb +++ b/app/mailers/hackathons/digest_mailer.rb @@ -7,6 +7,16 @@ def digest .includes(:subscription, hackathon: {logo_attachment: :blob}) .group_by(&:subscription) + @new_listings_by_subscription = @digest.listings + .includes(:subscription, hackathon: {logo_attachment: :blob}) + .select { |listing| listing.previously_listed_for_recipient? }) + .group_by(&:subscription) + + @previous_listings_by_subscription = @digest.listings + .includes(:subscription, hackathon: {logo_attachment: :blob}) + .reject { |listing| listing.previously_listed_for_recipient? } + .group_by(&:subscription) + set_unsubscribe_urls_for @recipient mail to: @recipient.email_address, subject: "Hackathons near you" end From 498e59e7c5aca13bb9b14d375430a14b5d4a6386 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Thu, 28 Sep 2023 14:34:43 -0700 Subject: [PATCH 08/10] Update digest.html.erb --- app/views/hackathons/digest_mailer/digest.html.erb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/hackathons/digest_mailer/digest.html.erb b/app/views/hackathons/digest_mailer/digest.html.erb index a13e4026..7bf76c9d 100644 --- a/app/views/hackathons/digest_mailer/digest.html.erb +++ b/app/views/hackathons/digest_mailer/digest.html.erb @@ -8,11 +8,11 @@ coming up near you.

-<% @listings_by_subscription.each do |subscription, listings| %> - <%= render "subscription", subscription:, listings: listings.select { |listing| listing.previously_listed_for_recipient? }) %> +<% @new_listings_by_subscription.each do |subscription, listings| %> + <%= render "subscription", subscription:, listings: %> <% end %> -<% if listings.reject { |listing| listing.previously_listed_for_recipient? }.count > 0 %> +<% if @previous_listings_by_subscription.count > 0 %>

Here <% if (count = @digest.listings.count - @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> @@ -23,7 +23,7 @@ coming up near you.

- <% @listings_by_subscription.each do |subscription, listings| %> - <%= render "subscription", subscription:, listings: listings.reject { |listing| listing.previously_listed_for_recipient? }) %> + <% @previous_listings_by_subscription.each do |subscription, listings| %> + <%= render "subscription", subscription:, listings: %> <% end %> <% end %> From fad24d3334df89de0bebe27b1ae45786764c64f8 Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Thu, 28 Sep 2023 14:41:08 -0700 Subject: [PATCH 09/10] Update app/views/hackathons/digest_mailer/digest.html.erb Co-authored-by: Matt Almeida --- app/views/hackathons/digest_mailer/digest.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/hackathons/digest_mailer/digest.html.erb b/app/views/hackathons/digest_mailer/digest.html.erb index 7bf76c9d..628bde1d 100644 --- a/app/views/hackathons/digest_mailer/digest.html.erb +++ b/app/views/hackathons/digest_mailer/digest.html.erb @@ -12,7 +12,7 @@ <%= render "subscription", subscription:, listings: %> <% end %> -<% if @previous_listings_by_subscription.count > 0 %> +<% if @previous_listings_by_subscription.any? %>

Here <% if (count = @digest.listings.count - @digest.listings.count { |listing| listing.previously_listed_for_recipient? }) > 1 %> From f7f10c8bbeb2f92c0d59eef0d2c905b90d409b5d Mon Sep 17 00:00:00 2001 From: Sam Poder Date: Thu, 28 Sep 2023 14:57:44 -0700 Subject: [PATCH 10/10] Update app/mailers/hackathons/digest_mailer.rb --- app/mailers/hackathons/digest_mailer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/mailers/hackathons/digest_mailer.rb b/app/mailers/hackathons/digest_mailer.rb index fb7cf1bf..d2be3f7c 100644 --- a/app/mailers/hackathons/digest_mailer.rb +++ b/app/mailers/hackathons/digest_mailer.rb @@ -9,7 +9,7 @@ def digest @new_listings_by_subscription = @digest.listings .includes(:subscription, hackathon: {logo_attachment: :blob}) - .select { |listing| listing.previously_listed_for_recipient? }) + .select { |listing| listing.previously_listed_for_recipient? } .group_by(&:subscription) @previous_listings_by_subscription = @digest.listings