Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/controllers/admin/bans_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ def create
@ban.added_by = current_user

if @ban.save
MemberActivityRecorder.record(actor: current_user, key: 'member.banned',
recipient: @ban.member, trackable: @ban)
MemberMailer.ban(@ban.member, @ban).deliver_now
redirect_to [:admin, @member], notice: t('.success')
else
Expand Down
4 changes: 4 additions & 0 deletions app/controllers/admin/chapters/organisers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ def create

member = Member.find(params[:organiser][:organiser])
member.add_role(:organiser, @chapter)
MemberActivityRecorder.record(actor: current_user, key: 'organiser_role.granted',
recipient: member, trackable: @chapter)

redirect_to admin_chapter_organisers_path(@chapter), notice: 'Successfully added organiser.'
end
Expand All @@ -24,6 +26,8 @@ def destroy
member = Member.find(params[:id])

member.remove_role(:organiser, @chapter)
MemberActivityRecorder.record(actor: current_user, key: 'organiser_role.revoked',
recipient: member, trackable: @chapter)
redirect_to admin_chapter_organisers_path(@chapter), notice: 'Successfully removed organiser.'
end

Expand Down
8 changes: 8 additions & 0 deletions app/controllers/admin/invitation_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ class Admin::InvitationController < Admin::ApplicationController

# event invitations

# rubocop:disable Metrics/AbcSize
def update
invitation = Invitation.find_by(token: params[:invitation][:id])
invitation.update(attending: true, verified: true, verified_by: current_user, source: Invitation::SOURCE_ADMIN)
MemberActivityRecorder.record(actor: current_user, key: 'invitation.verified',
trackable: invitation, recipient: invitation.member)

EventInvitationMailer.attending(invitation.event, invitation.member, invitation).deliver_now

Expand All @@ -14,10 +17,14 @@ def update
notice: "You have verified #{invitation.member.full_name}'s spot at the event!"
)
end
# rubocop:enable Metrics/AbcSize

# rubocop:disable Metrics/AbcSize
def verify
invitation = Invitation.find_by(token: params[:invitation_id])
invitation.update(verified: true, verified_by_id: current_user.id, source: Invitation::SOURCE_ADMIN)
MemberActivityRecorder.record(actor: current_user, key: 'invitation.verified',
trackable: invitation, recipient: invitation.member)

EventInvitationMailer.attending(invitation.event, invitation.member, invitation).deliver_now

Expand All @@ -26,6 +33,7 @@ def verify
notice: "You have verified #{invitation.member.full_name}'s spot at the event!"
)
end
# rubocop:enable Metrics/AbcSize

def cancel
invitation = Invitation.find_by(token: params[:invitation_id])
Expand Down
9 changes: 9 additions & 0 deletions app/controllers/admin/invitations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ def update_attendance(attending:, attended:)

def update_to_attended
@invitation.update(attended: true, source: Invitation::SOURCE_ADMIN)
MemberActivityRecorder.record(actor: current_user, key: 'invitation.rsvp_override',
trackable: @invitation, recipient: @invitation.member)
end

def update_to_unattended
Expand All @@ -55,6 +57,11 @@ def update_to_attending
source: Invitation::SOURCE_ADMIN
)

if update_successful
MemberActivityRecorder.record(actor: current_user, key: 'invitation.rsvp_override',
trackable: @invitation, recipient: @invitation.member)
end

{
message: update_successful ? attending_successful : attending_failed,
error: !update_successful
Expand All @@ -74,6 +81,8 @@ def attending_failed

def update_to_not_attending
@invitation.update!(attending: false, last_overridden_by_id: current_user.id)
MemberActivityRecorder.record(actor: current_user, key: 'invitation.rsvp_override',
trackable: @invitation, recipient: @invitation.member)

{
message: "You have removed #{@invitation.member.full_name} from the workshop.",
Expand Down
4 changes: 4 additions & 0 deletions app/controllers/admin/meeting_invitations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ def update
attended = params.permit(:attended)[:attended]

@invitation.update(attending: status, attended:)
MemberActivityRecorder.record(actor: current_user, key: 'meeting_invitation.updated',
trackable: @invitation, recipient: @invitation.member)

redirect_to [:admin, @invitation.meeting],
notice: t('admin.messages.invitation.update_rsvp', name: @invitation.member.full_name)
Expand All @@ -25,6 +27,8 @@ def create

if invitation.save
MeetingInvitationMailer.approve_from_waitlist(meeting, member).deliver_now
MemberActivityRecorder.record(actor: current_user, key: 'meeting_invitation.created',
trackable: invitation, recipient: member)
redirect_to [:admin, meeting], notice: t('admin.messages.invitation.rsvp_member', name: member.full_name)
else
redirect_to [:admin, meeting], notice: t('admin.messages.invitation.rsvp_error', name: member.full_name)
Expand Down
7 changes: 6 additions & 1 deletion app/controllers/admin/member_notes_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ def create
authorize @note

@note.author = current_user
flash[:error] = @note.errors.full_messages unless @note.save
if @note.save
MemberActivityRecorder.record(actor: current_user, key: 'member_note.created',
trackable: @note, recipient: @note.member)
else
flash[:error] = @note.errors.full_messages
end
redirect_back fallback_location: root_path
end

Expand Down
7 changes: 5 additions & 2 deletions app/controllers/admin/members_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,14 @@ def events

def update_subscriptions
subscription = @member.subscriptions.find_by!(group_id: params[:group])
group = subscription.group
SubscriptionMailingListService.unsubscribe(subscription)
flash[:notice] = t('.unsubscribe', member: @member.full_name,
chapter: subscription.group.chapter.city,
group: subscription.group.name)
chapter: group.chapter.city,
group: group.name)
subscription.destroy
MemberActivityRecorder.record(actor: current_user, key: 'subscription.admin_updated',
trackable: group, recipient: @member)
redirect_back fallback_location: root_path
end

Expand Down
2 changes: 2 additions & 0 deletions app/controllers/check_ins_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ def mark_attended(invitation)
attrs[:automated_rsvp] = true
end
invitation.update!(attrs)
MemberActivityRecorder.record(actor: invitation.member, key: 'member.checked_in',
trackable: invitation)
end

def permitted_role
Expand Down
10 changes: 10 additions & 0 deletions app/controllers/invitations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ def attend
if @invitation.student_spaces? || @invitation.coach_spaces?
@invitation.update!(attending: true)

MemberActivityRecorder.record(actor: @invitation.member, key: 'event_invitation.rsvp',
trackable: @invitation)

notice = t('messages.invitations.spot_confirmed', event: @invitation.event.name)

unless event.confirmation_required || event.surveys_required
Expand All @@ -61,6 +64,8 @@ def reject
end

@invitation.update!(attending: false)
MemberActivityRecorder.record(actor: @invitation.member, key: 'event_invitation.rejected',
trackable: @invitation)
redirect_back(
fallback_location: root_path,
notice: t('messages.rejected_invitation', name: @invitation.member.name)
Expand All @@ -74,6 +79,8 @@ def rsvp_meeting
meeting = invitation.meeting

if invitation.update(attending: true)
MemberActivityRecorder.record(actor: current_user, key: 'meeting_invitation.rsvp',
trackable: invitation)
MeetingInvitationMailer.attending(meeting, current_user).deliver_now
redirect_to meeting_path(meeting, token: invitation.token),
notice: t('messages.invitations.meeting.rsvp')
Expand All @@ -87,6 +94,9 @@ def cancel_meeting

@invitation.update!(attending: false)

MemberActivityRecorder.record(actor: @invitation.member, key: 'meeting_invitation.cancelled',
trackable: @invitation)

redirect_back fallback_location: root_path, notice: t('messages.invitations.meeting.cancel')
end

Expand Down
2 changes: 2 additions & 0 deletions app/controllers/mailing_lists_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ class MailingListsController < ApplicationController
before_action :require_access

def create
MemberActivityRecorder.record(actor: current_user, key: 'mailing_list.subscribe')
subscribe_to_newsletter(current_user)
flash[:notice] = I18n.t('subscriptions.messages.mailing_list.subscribe')

redirect_back fallback_location: root_path
end

def destroy
MemberActivityRecorder.record(actor: current_user, key: 'mailing_list.unsubscribe')
unsubscribe_from_newsletter(current_user)
flash[:notice] = I18n.t('subscriptions.messages.mailing_list.unsubscribe')

Expand Down
1 change: 1 addition & 0 deletions app/controllers/member/details_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def update
return render :edit unless @member.update(attrs)

@member.newsletter ? subscribe_to_newsletter(@member) : unsubscribe_from_newsletter(@member)
MemberActivityRecorder.record(actor: @member, key: 'profile.updated')
redirect_to step2_member_path
end

Expand Down
1 change: 1 addition & 0 deletions app/controllers/members_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def profile

def update
if @member.update(member_params)
MemberActivityRecorder.record(actor: current_user, key: 'profile.updated')
notice = 'Your details have been updated.'
redirect_to profile_path, notice:
else
Expand Down
12 changes: 9 additions & 3 deletions app/controllers/subscriptions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ def index
@member = MemberPresenter.new(current_user)
end

def create
def create # rubocop:disable Metrics/MethodLength
subscription = Subscription.new(group_id:, member: current_user)

if subscription.save
SubscriptionMailingListService.subscribe(subscription)
MemberActivityRecorder.record(actor: current_user, key: 'subscription.created',
trackable: subscription.group)
send_welcome_email(current_user, subscription)
flash[:notice] = I18n.t('subscriptions.messages.group.subscribe', chapter: subscription.group.chapter.city,
role: subscription.group.name)
Expand All @@ -21,14 +23,18 @@ def create
redirect_back fallback_location: root_path
end

def destroy
def destroy # rubocop:disable Metrics/MethodLength
# Don't error if subscription is not found
subscription = current_user.subscriptions.find_by(group_id:)
SubscriptionMailingListService.unsubscribe(subscription) if subscription
subscription&.destroy

# Instead, rely on the group's existence (rather than the subscription)
group = Group.find(group_id)
if subscription
MemberActivityRecorder.record(actor: current_user, key: 'subscription.removed',
trackable: group)
end

flash[:notice] = I18n.t('subscriptions.messages.group.unsubscribe',
chapter: group.chapter.city,
role: group.name)
Expand Down
1 change: 1 addition & 0 deletions app/controllers/terms_and_conditions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ def update
member = current_user
member.accepted_toc_at = Time.zone.now
member.save(validate: false)
MemberActivityRecorder.record(actor: member, key: 'toc.accepted')
redirect_to previous_path
else
flash[notice] = I18n.t('terms_and_conditions.messages.notice')
Expand Down
6 changes: 5 additions & 1 deletion app/controllers/waiting_lists_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ class WaitingListsController < ApplicationController
# FeedbackController#submit (PR #2641, Rollbar #535).
skip_forgery_protection only: %i[create destroy]

def create
def create # rubocop:disable Metrics/MethodLength
@invitation.assign_attributes(invitation_params)

return back_with_message(@invitation.errors.full_messages) unless @invitation.valid?(:waitinglist)

@invitation.save && WaitingList.add(@invitation, auto_rsvp)
MemberActivityRecorder.record(actor: @invitation.member, key: 'waiting_list.joined',
trackable: @invitation)

message = if auto_rsvp
'You have been added to the waiting list'
Expand All @@ -25,6 +27,8 @@ def create

def destroy
WaitingList.find_by(invitation_id: @invitation.id).destroy
MemberActivityRecorder.record(actor: @invitation.member, key: 'waiting_list.left',
trackable: @invitation)

redirect_to invitation_path(@invitation), notice: 'You have been removed from the waiting list'
end
Expand Down
4 changes: 4 additions & 0 deletions app/controllers/workshop_invitation_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ def accept
return back_with_message(t('messages.no_available_seats')) unless available_spaces?(@workshop, @invitation)

if @invitation.update(invitation_params.merge!(attending: true, rsvp_time: Time.zone.now))
MemberActivityRecorder.record(actor: @invitation.member, key: 'workshop_invitation.rsvp',
trackable: @invitation)
@workshop.send_attending_email(@invitation)
back_with_message(t('messages.accepted_invitation', name: @invitation.member.name))
else
Expand All @@ -63,6 +65,8 @@ def reject
notice: t('messages.not_attending_already'))
else
@invitation.update!(attending: false)
MemberActivityRecorder.record(actor: @invitation.member, key: 'workshop_invitation.rejected',
trackable: @invitation)

next_spot = WaitingList.next_spot(@invitation.workshop, @invitation.role)

Expand Down
15 changes: 15 additions & 0 deletions spec/controllers/admin/bans_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# frozen_string_literal: true

RSpec.describe Admin::BansController do
let(:member) { Fabricate(:member) }
let(:admin) { Fabricate(:member) }
Expand All @@ -22,4 +24,17 @@
expect(response.body).to include("value=\"#{expected}\"")
end
end

describe 'POST #create' do
it 'records member.banned' do
expect do
post :create, params: { member_id: member.id, ban: { reason: 'spam', note: 'banned member',
explanation: 'test', permanent: '1',
expires_at: 1.month.from_now.to_s } }
end.to change {
PublicActivity::Activity.exists?(owner: admin, key: 'member.banned',
recipient: member)
}.from(false).to(true)
end
end
end
33 changes: 33 additions & 0 deletions spec/controllers/admin/chapters/organisers_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
require 'rails_helper'

RSpec.describe Admin::Chapters::OrganisersController, type: :controller do
let(:admin) { Fabricate(:chapter_organiser) }
let(:chapter) { Fabricate(:chapter) }
let(:member) { Fabricate(:member) }

before do
login_as_admin(admin)
end

describe 'POST #create' do
it 'records organiser_role.granted' do
post :create, params: {
chapter_id: chapter.id, organiser: { organiser: member.id }
}

expect(PublicActivity::Activity.exists?(owner: admin, key: 'organiser_role.granted',
recipient: member)).to be(true)
end
end

describe 'DELETE #destroy' do
before { member.add_role(:organiser, chapter) }

it 'records organiser_role.revoked' do
delete :destroy, params: { chapter_id: chapter.id, id: member.id }

expect(PublicActivity::Activity.exists?(owner: admin, key: 'organiser_role.revoked',
recipient: member)).to be(true)
end
end
end
23 changes: 23 additions & 0 deletions spec/controllers/admin/invitation_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe Admin::InvitationController, type: :controller do
describe 'POST #verify' do
let(:invitation) { Fabricate(:invitation, attending: false, verified: nil) }
let(:admin) { Fabricate(:chapter_organiser) }

before do
admin.add_role(:admin)
login admin
request.env['HTTP_REFERER'] = '/admin/member/3'
end

it 'records invitation.verified' do
post :verify, params: { event_id: invitation.event.id, invitation_id: invitation.token }

expect(PublicActivity::Activity.exists?(owner: admin, key: 'invitation.verified',
recipient: invitation.member)).to be(true)
end
end
end
Loading