From 3ff5910f1f019ae8bcb5afe72a31f1d38bb7d7a3 Mon Sep 17 00:00:00 2001 From: Steven Miers Date: Thu, 2 Jul 2015 11:19:26 -0500 Subject: [PATCH] VRFS-3276 : Add a delete-calendar directive when RSVP is canceled. --- db/up/calendar.sql | 1 + ruby/lib/jam_ruby/calendar_manager.rb | 15 ++++++++++++++- ruby/lib/jam_ruby/models/calendar.rb | 2 +- ruby/lib/jam_ruby/models/rsvp_request.rb | 10 ++++++++++ ruby/spec/jam_ruby/models/rsvp_request_spec.rb | 14 ++++++++------ 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/db/up/calendar.sql b/db/up/calendar.sql index 6d723817c..5e27c7f14 100644 --- a/db/up/calendar.sql +++ b/db/up/calendar.sql @@ -1,6 +1,7 @@ CREATE TABLE calendars ( id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4() NOT NULL, user_id VARCHAR(64) NOT NULL REFERENCES users(id) ON DELETE CASCADE, + target_uid VARCHAR(64) NOT NULL, name VARCHAR(128), description VARCHAR(8000), trigger_delete BOOLEAN DEFAULT FALSE, diff --git a/ruby/lib/jam_ruby/calendar_manager.rb b/ruby/lib/jam_ruby/calendar_manager.rb index 57c2bb062..34bd2aed1 100644 --- a/ruby/lib/jam_ruby/calendar_manager.rb +++ b/ruby/lib/jam_ruby/calendar_manager.rb @@ -6,6 +6,19 @@ module JamRuby @log = Logging.logger[self] end + def cancel_ics_event(music_session, user) + Calendar.where( + user_id: user.id, + target_uid: music_session.id, + name: music_session.description) + .first_or_create( + description: music_session.description, + start_at: music_session.scheduled_start, + end_at: music_session.scheduled_start+music_session.safe_scheduled_duration, + trigger_delete: true) + + end + # @return event (as ICS string) for a given music session def ics_event_from_music_session(music_session, delete=false) # Determine properties of calendar event and create: @@ -29,7 +42,7 @@ module JamRuby end create_ics_event( - calendar.id, + calendar.target_uid, "JamKazam Session #{calendar.name}", calendar.description, calendar.start_at, diff --git a/ruby/lib/jam_ruby/models/calendar.rb b/ruby/lib/jam_ruby/models/calendar.rb index 9c1a3c497..4f244b587 100644 --- a/ruby/lib/jam_ruby/models/calendar.rb +++ b/ruby/lib/jam_ruby/models/calendar.rb @@ -2,7 +2,7 @@ module JamRuby class Calendar < ActiveRecord::Base include HtmlSanitize html_sanitize strict: [:name, :description] - attr_accessible :name, :description, :trigger_delete, :start_at, :end_at + attr_accessible :name, :description, :target_uid, :trigger_delete, :start_at, :end_at @@log = Logging.logger[Calendar] diff --git a/ruby/lib/jam_ruby/models/rsvp_request.rb b/ruby/lib/jam_ruby/models/rsvp_request.rb index f416640bf..20c3b9e9a 100644 --- a/ruby/lib/jam_ruby/models/rsvp_request.rb +++ b/ruby/lib/jam_ruby/models/rsvp_request.rb @@ -8,6 +8,7 @@ module JamRuby validates :user, presence: true validates :canceled, :inclusion => {:in => [nil, true, false]} validate :creator_rsvp_cancel + before_save :cancel_calendar # pulls all instruments from the associated rsvp_slots def instrument_list @@ -305,6 +306,15 @@ module JamRuby errors.add(:canceled, "can't be canceled by the session organizer") end end + + def cancel_calendar + calendar_manager = CalendarManager.new + if self.canceled + self.rsvp_slots.each do |slot| + calendar_manager.cancel_ics_event(slot.music_session, user) + end + end + end end end diff --git a/ruby/spec/jam_ruby/models/rsvp_request_spec.rb b/ruby/spec/jam_ruby/models/rsvp_request_spec.rb index f93501647..9da353746 100644 --- a/ruby/spec/jam_ruby/models/rsvp_request_spec.rb +++ b/ruby/spec/jam_ruby/models/rsvp_request_spec.rb @@ -30,10 +30,10 @@ describe RsvpRequest do @slot1 = FactoryGirl.build(:rsvp_slot, :music_session => @music_session, :instrument => JamRuby::Instrument.find('electric guitar')) @slot1.save - + @slot2 = FactoryGirl.build(:rsvp_slot, :music_session => @music_session, :instrument => JamRuby::Instrument.find('drums')) @slot2.save - + @invitation = FactoryGirl.build(:invitation, :sender => @session_creator, :receiver => @session_invitee, :music_session => @music_session) @invitation.save end @@ -53,12 +53,12 @@ describe RsvpRequest do @music_session.save RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id]}, @non_session_invitee) - expect {RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id]}, @non_session_invitee)}.to raise_error(JamRuby::StateError) + expect {RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id]}, @non_session_invitee)}.to raise_error(JamRuby::StateError) end it "should allow invitee to RSVP to session with closed RSVPs" do rsvp = RsvpRequest.create({:session_id => @music_session.id, :rsvp_slots => [@slot1.id, @slot2.id], :message => "We be jammin!"}, @session_invitee) - + # verify comment comment = SessionInfoComment.find_by_creator_id(@session_invitee) comment.comment.should == "We be jammin!" @@ -373,12 +373,14 @@ describe RsvpRequest do comment = SessionInfoComment.find_by_creator_id(@session_invitee) comment.comment.should == "Let's Jam!" - # cancel - expect {RsvpRequest.cancel({:id => rsvp.id, :session_id => @music_session.id, :cancelled => "all", :message => "Sorry, I'm bailing for all sessions"}, @session_invitee)}.to_not raise_error + calendar_count = Calendar.find(:all).count + # cancel & check that calendar has been added: + expect {RsvpRequest.cancel({:id => rsvp.id, :session_id => @music_session.id, :cancelled => "all", :message => "Sorry, I'm bailing for all sessions"}, @session_invitee)}.to_not raise_error rsvp = RsvpRequest.find_by_id(rsvp.id) rsvp.canceled.should == true rsvp.cancel_all.should == true + (Calendar.find(:all).count - calendar_count).should eq(1) # verify comment comment = SessionInfoComment.find_by_creator_id(@session_invitee)