@@ -29,7 +29,10 @@ def popular_protips(user, protips, from, to)
29
29
30
30
@user = user
31
31
@protips = protips
32
- @team , @job = get_team_and_job_for ( @user )
32
+ @team , @job = self . class . get_team_and_job_for ( @user )
33
+ unless @job . nil?
34
+ self . class . mark_sent ( @job , @user )
35
+ end
33
36
@issue = campaign_params
34
37
35
38
stars = @user . following_users . where ( 'last_request_at > ?' , 1 . month . ago )
@@ -51,6 +54,14 @@ def abort_delivery(ex)
51
54
Rails . logger . error ( "[ProtipMailer.popular_protips] Aborted email '#{ ex } ' >>\n #{ ex . backtrace . join ( "\n " ) } " )
52
55
end
53
56
57
+ def self . mark_sent ( mailable , user )
58
+ SentMail . create! ( user : user , sent_at : user . last_email_sent , mailable : mailable )
59
+ end
60
+
61
+ def self . already_sent? ( mailable , user )
62
+ SentMail . where ( user_id : user . id , mailable_id : mailable . id , mailable_type : mailable . class . name ) . exists?
63
+ end
64
+
54
65
def campaign_params
55
66
{
56
67
utm_campaign : 'coderwall-popular_protips' ,
@@ -71,22 +82,20 @@ def week_of_the_month
71
82
Date . today . cweek - Date . today . at_beginning_of_month . cweek
72
83
end
73
84
74
- def get_team_and_job_for ( user )
85
+ def self . get_team_and_job_for ( user )
75
86
if user . team . try ( :hiring? )
76
87
[ user . team , user . team . jobs . sample ]
77
88
else
78
89
teams = teams_for_user ( user )
79
90
teams . each do |team |
80
- best_job = team . best_positions_for ( user ) . detect do |job |
81
- job . team_document_id == user . team_document_id
82
- end
91
+ best_job = team . best_positions_for ( user ) . detect { |job | ( job . team_document_id == user . team_document_id ) or !already_sent? ( job , user ) }
83
92
return [ team , best_job ] unless best_job . nil?
84
93
end
85
94
end
86
95
[ nil , nil ]
87
96
end
88
97
89
- def teams_for_user ( user )
98
+ def self . teams_for_user ( user )
90
99
Team . most_relevant_featured_for ( user ) . select do |team |
91
100
team . hiring?
92
101
end
0 commit comments