Add digest e-mails
This commit is contained in:
		
							parent
							
								
									f5457cc3d2
								
							
						
					
					
						commit
						6b81d10030
					
				
					 25 changed files with 117 additions and 32 deletions
				
			
		|  | @ -79,6 +79,7 @@ class ApiController < ApplicationController | |||
| 
 | ||||
|   def require_user! | ||||
|     current_resource_owner | ||||
|     set_user_activity | ||||
|   rescue ActiveRecord::RecordNotFound | ||||
|     render json: { error: 'This method requires an authenticated user' }, status: 422 | ||||
|   end | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ class Settings::PreferencesController < ApplicationController | |||
|       reblog:         user_params[:notification_emails][:reblog]         == '1', | ||||
|       favourite:      user_params[:notification_emails][:favourite]      == '1', | ||||
|       mention:        user_params[:notification_emails][:mention]        == '1', | ||||
|       digest:         user_params[:notification_emails][:digest]         == '1', | ||||
|     } | ||||
| 
 | ||||
|     current_user.settings['interactions'] = { | ||||
|  | @ -33,6 +34,6 @@ class Settings::PreferencesController < ApplicationController | |||
|   private | ||||
| 
 | ||||
|   def user_params | ||||
|     params.require(:user).permit(:locale, :setting_default_privacy, notification_emails: [:follow, :follow_request, :reblog, :favourite, :mention], interactions: [:must_be_follower, :must_be_following]) | ||||
|     params.require(:user).permit(:locale, :setting_default_privacy, notification_emails: [:follow, :follow_request, :reblog, :favourite, :mention, :digest], interactions: [:must_be_follower, :must_be_following]) | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -29,6 +29,11 @@ class Formatter | |||
|     sanitize(html, tags: %w(a br p span), attributes: %w(href rel class)) | ||||
|   end | ||||
| 
 | ||||
|   def plaintext(status) | ||||
|     return status.text if status.local? | ||||
|     strip_tags(status.text) | ||||
|   end | ||||
| 
 | ||||
|   def simplified_format(account) | ||||
|     return reformat(account.note) unless account.local? | ||||
| 
 | ||||
|  |  | |||
|  | @ -49,4 +49,17 @@ class NotificationMailer < ApplicationMailer | |||
|       mail to: @me.user.email, subject: I18n.t('notification_mailer.follow_request.subject', name: @account.acct) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def digest(recipient, opts = {}) | ||||
|     @me            = recipient | ||||
|     @since         = opts[:since] || @me.user.last_emailed_at || @me.user.current_sign_in_at | ||||
|     @notifications = Notification.where(account: @me, activity_type: 'Mention').where('created_at > ?', @since) | ||||
|     @follows_since = Notification.where(account: @me, activity_type: 'Follow').where('created_at > ?', @since).count | ||||
| 
 | ||||
|     return if @notifications.empty? | ||||
| 
 | ||||
|     I18n.with_locale(@me.user.locale || I18n.default_locale) do | ||||
|       mail to: @me.user.email, subject: I18n.t('notification_mailer.digest.subject', count: @notifications.size) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ | |||
| 
 | ||||
| class Setting < RailsSettings::Base | ||||
|   source Rails.root.join('config/settings.yml') | ||||
|   namespace Rails.env | ||||
| 
 | ||||
|   def to_param | ||||
|     var | ||||
|  |  | |||
|  | @ -14,9 +14,10 @@ class User < ApplicationRecord | |||
|   validates :locale, inclusion: I18n.available_locales.map(&:to_s), unless: 'locale.nil?' | ||||
|   validates :email, email: true | ||||
| 
 | ||||
|   scope :prolific, -> { joins('inner join statuses on statuses.account_id = users.account_id').select('users.*, count(statuses.id) as statuses_count').group('users.id').order('statuses_count desc') } | ||||
|   scope :recent,   -> { order('id desc') } | ||||
|   scope :admins,   -> { where(admin: true) } | ||||
|   scope :prolific,  -> { joins('inner join statuses on statuses.account_id = users.account_id').select('users.*, count(statuses.id) as statuses_count').group('users.id').order('statuses_count desc') } | ||||
|   scope :recent,    -> { order('id desc') } | ||||
|   scope :admins,    -> { where(admin: true) } | ||||
|   scope :confirmed, -> { where.not(confirmed_at: nil) } | ||||
| 
 | ||||
|   def send_devise_notification(notification, *args) | ||||
|     devise_mailer.send(notification, self, *args).deliver_later | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <%= yield %> | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| <%= t('application_mailer.signature', instance: Rails.configuration.x.local_domain) %> | ||||
| <%= t('application_mailer.settings', link: settings_preferences_url) %> | ||||
|  |  | |||
|  | @ -1,3 +1,3 @@ | |||
| <%= strip_tags(@status.content) %> | ||||
| <%= raw Formatter.instance.plaintext(status) %> | ||||
| 
 | ||||
| <%= web_url("statuses/#{@status.id}") %> | ||||
| <%= raw t('application_mailer.view')%> <%= web_url("statuses/#{status.id}") %> | ||||
|  |  | |||
							
								
								
									
										15
									
								
								app/views/notification_mailer/digest.text.erb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								app/views/notification_mailer/digest.text.erb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| <%= display_name(@me) %>, | ||||
| 
 | ||||
| <%= raw t('notification_mailer.digest.body', since: @since, instance: root_url) %> | ||||
| <% @notifications.each do |notification| %> | ||||
| 
 | ||||
| * <%= raw t('notification_mailer.digest.mention', name: notification.from_account.acct) %> | ||||
| 
 | ||||
|   <%= raw Formatter.instance.plaintext(notification.target_status) %> | ||||
| 
 | ||||
|   <%= raw t('application_mailer.view')%> <%= web_url("statuses/#{notification.target_status.id}") %> | ||||
| <% end %> | ||||
| <% if @follows_since > 0 %> | ||||
| 
 | ||||
| <%= raw t('notification_mailer.digest.new_followers_summary', count: @follows_since) %> | ||||
| <% end %> | ||||
|  | @ -1,5 +1,5 @@ | |||
| <%= display_name(@me) %>, | ||||
| 
 | ||||
| <%= t('notification_mailer.favourite.body', name: @account.acct) %> | ||||
| <%= raw t('notification_mailer.favourite.body', name: @account.acct) %> | ||||
| 
 | ||||
| <%= render partial: 'status' %> | ||||
| <%= render partial: 'status', locals: { status: @status } %> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <%= display_name(@me) %>, | ||||
| 
 | ||||
| <%= t('notification_mailer.follow.body', name: @account.acct) %> | ||||
| <%= raw t('notification_mailer.follow.body', name: @account.acct) %> | ||||
| 
 | ||||
| <%= web_url("accounts/#{@account.id}") %> | ||||
| <%= raw t('application_mailer.view')%> <%= web_url("accounts/#{@account.id}") %> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <%= display_name(@me) %>, | ||||
| 
 | ||||
| <%= t('notification_mailer.follow_request.body', name: @account.acct) %> | ||||
| <%= raw t('notification_mailer.follow_request.body', name: @account.acct) %> | ||||
| 
 | ||||
| <%= web_url("follow_requests") %> | ||||
| <%= raw t('application_mailer.view')%> <%= web_url("follow_requests") %> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <%= display_name(@me) %>, | ||||
| 
 | ||||
| <%= t('notification_mailer.mention.body', name: @status.account.acct) %> | ||||
| <%= raw t('notification_mailer.mention.body', name: @status.account.acct) %> | ||||
| 
 | ||||
| <%= render partial: 'status' %> | ||||
| <%= render partial: 'status', locals: { status: @status } %> | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| <%= display_name(@me) %>, | ||||
| 
 | ||||
| <%= t('notification_mailer.reblog.body', name: @account.acct) %> | ||||
| <%= raw t('notification_mailer.reblog.body', name: @account.acct) %> | ||||
| 
 | ||||
| <%= render partial: 'status' %> | ||||
| <%= render partial: 'status', locals: { status: @status } %> | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
|       = ff.input :reblog, as: :boolean, wrapper: :with_label | ||||
|       = ff.input :favourite, as: :boolean, wrapper: :with_label | ||||
|       = ff.input :mention, as: :boolean, wrapper: :with_label | ||||
|       = ff.input :digest, as: :boolean, wrapper: :with_label | ||||
| 
 | ||||
|   = f.simple_fields_for :interactions, hash_to_object(current_user.settings.interactions) do |ff| | ||||
|     = ff.input :must_be_follower, as: :boolean, wrapper: :with_label | ||||
|  |  | |||
							
								
								
									
										14
									
								
								app/workers/digest_mailer_worker.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/workers/digest_mailer_worker.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class DigestMailerWorker | ||||
|   include Sidekiq::Worker | ||||
| 
 | ||||
|   sidekiq_options queue: 'mailers' | ||||
| 
 | ||||
|   def perform(user_id) | ||||
|     user = User.find(user_id) | ||||
|     return unless user.settings.notification_emails['digest'] | ||||
|     NotificationMailer.digest(user.account).deliver_now! | ||||
|     user.touch(:last_emailed_at) | ||||
|   end | ||||
| end | ||||
		Reference in a new issue