DEV: treats private invitees as public and only create them on attendance
This commit is contained in:
		
							parent
							
								
									3cd4d2c705
								
							
						
					
					
						commit
						86dbc7d289
					
				|  | @ -179,45 +179,47 @@ module DiscoursePostEvent | |||
|     end | ||||
| 
 | ||||
|     def most_likely_going(limit = SiteSetting.displayed_invitees_limit) | ||||
|       self.invitees | ||||
|       going = self.invitees | ||||
|         .order([:status, :user_id]) | ||||
|         .limit(limit) | ||||
| 
 | ||||
|       if self.private? && going.count < limit | ||||
|         # invitees are only created when an attendance is set | ||||
|         # so we create a dummy invitee object with only what's needed for serializer | ||||
|         going = going + GroupUser | ||||
|           .includes(:group, :user) | ||||
|           .where('groups.name' => self.raw_invitees) | ||||
|           .where.not('users.id' => going.pluck(:user_id)) | ||||
|           .limit(limit - going.count) | ||||
|           .map { |gu| Invitee.new(user: gu.user, post_id: self.id) } | ||||
|       end | ||||
| 
 | ||||
|       going | ||||
|     end | ||||
| 
 | ||||
|     def publish_update! | ||||
|       self.post.publish_message!("/discourse-post-event/#{self.post.topic_id}", id: self.id) | ||||
|     end | ||||
| 
 | ||||
|     def destroy_extraneous_invitees! | ||||
|       self.invitees.where.not(user_id: fetch_users.select(:id)).delete_all | ||||
|     end | ||||
| 
 | ||||
|     def fill_invitees! | ||||
|       invited_users_ids = fetch_users.pluck(:id) - self.invitees.pluck(:user_id) | ||||
|       if invited_users_ids.present? | ||||
|         self.create_invitees(invited_users_ids.map { |user_id| | ||||
|           { user_id: user_id } | ||||
|         }) | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     def fetch_users | ||||
|       @fetched_users ||= Invitee.extract_uniq_usernames(self.raw_invitees) | ||||
|     end | ||||
| 
 | ||||
|     def enforce_raw_invitees! | ||||
|       self.destroy_extraneous_invitees! | ||||
|       self.fill_invitees! | ||||
|     def enforce_private_invitees! | ||||
|       self.invitees.where.not(user_id: fetch_users.select(:id)).delete_all | ||||
|       self.notify_invitees!(auto: false) | ||||
|     end | ||||
| 
 | ||||
|     def can_user_update_attendance(user) | ||||
|       !self.is_expired? && | ||||
|       ( | ||||
|         self.status == Event.statuses[:public] || | ||||
|         self.public? || | ||||
|         ( | ||||
|           self.status == Event.statuses[:private] && | ||||
|           self.invitees.exists?(user_id: user.id) | ||||
|           self.private? && | ||||
|           ( | ||||
|             self.invitees.exists?(user_id: user.id) || | ||||
|             (user.groups.pluck(:name) & self.raw_invitees).any? | ||||
|           ) | ||||
|         ) | ||||
|       ) | ||||
|     end | ||||
|  | @ -251,7 +253,7 @@ module DiscoursePostEvent | |||
|       when Event.statuses[:private] | ||||
|         raw_invitees = Array(params[:raw_invitees]) - ['trust_level_0'] | ||||
|         self.update!(params.merge(raw_invitees: raw_invitees)) | ||||
|         self.enforce_raw_invitees! | ||||
|         self.enforce_private_invitees! | ||||
|       when Event.statuses[:public] | ||||
|         self.update!(params.merge(raw_invitees: ['trust_level_0'])) | ||||
|       when Event.statuses[:standalone] | ||||
|  |  | |||
|  | @ -113,7 +113,7 @@ module DiscoursePostEvent | |||
|     end | ||||
| 
 | ||||
|     def should_display_invitees | ||||
|       object.status != Event.statuses[:standalone] && object.invitees.count > 0 | ||||
|       (object.public? && object.invitees.count > 0) || (object.private? && object.raw_invitees.count > 0) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ module Jobs | |||
|         group = Group.find_by(name: invitee['identifier']) | ||||
|         if group | ||||
|           users = group.users.pluck(:id) | ||||
|           @event.update!(raw_invitees: (@event.raw_invitees || []).push(group.name).uniq) | ||||
|           @event.update_with_params!(raw_invitees: (@event.raw_invitees || []).push(group.name).uniq) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,7 +54,7 @@ describe Post do | |||
| 
 | ||||
|         context 'when in edit grace period' do | ||||
|           before do | ||||
|             post_1.reload.event.update!(starts_at: 2.hours.ago) | ||||
|             post_1.reload.event.update_with_params!(starts_at: 2.hours.ago) | ||||
|           end | ||||
| 
 | ||||
|           it 'sends a post revision to going invitees' do | ||||
|  | @ -75,7 +75,7 @@ describe Post do | |||
| 
 | ||||
|         context 'when not edit grace period' do | ||||
|           before do | ||||
|             post_1.reload.event.update!(starts_at: 5.hours.ago) | ||||
|             post_1.reload.event.update_with_params!(starts_at: 5.hours.ago) | ||||
|           end | ||||
| 
 | ||||
|           it 'doesn’t send a post revision to anyone' do | ||||
|  |  | |||
|  | @ -164,7 +164,7 @@ describe DiscoursePostEvent::Event do | |||
|             expect(first_post.is_first_post?).to be(true) | ||||
|             expect(first_post.topic.custom_fields[Field]).to eq(starts_at) | ||||
| 
 | ||||
|             post_event.update!(starts_at: alt_starts_at) | ||||
|             post_event.update_with_params!(starts_at: alt_starts_at) | ||||
|             first_post.topic.reload | ||||
| 
 | ||||
|             expect(first_post.topic.custom_fields[Field]).to eq(alt_starts_at) | ||||
|  | @ -178,7 +178,7 @@ describe DiscoursePostEvent::Event do | |||
|             expect(second_post.is_first_post?).to be(false) | ||||
|             expect(second_post.topic.custom_fields[Field]).to be_blank | ||||
| 
 | ||||
|             post_event.update!(starts_at: alt_starts_at) | ||||
|             post_event.update_with_params!(starts_at: alt_starts_at) | ||||
|             second_post.topic.reload | ||||
| 
 | ||||
|             expect(second_post.topic.custom_fields[Field]).to be_blank | ||||
|  |  | |||
|  | @ -157,7 +157,7 @@ module DiscoursePostEvent | |||
| 
 | ||||
|           context 'when status changes from standalone to private' do | ||||
|             it 'changes the status, raw_invitees and invitees' do | ||||
|               event.update!(status: Event.statuses[:standalone]) | ||||
|               event.update_with_params!(status: Event.statuses[:standalone]) | ||||
| 
 | ||||
|               put "/discourse-post-event/events/#{event.id}.json", params: { | ||||
|                 event: { | ||||
|  | @ -170,13 +170,13 @@ module DiscoursePostEvent | |||
| 
 | ||||
|               expect(event.status).to eq(Event.statuses[:private]) | ||||
|               expect(event.raw_invitees).to eq([group.name]) | ||||
|               expect(event.invitees.pluck(:user_id)).to match_array(group.group_users.map { |gu| gu.user.id }) | ||||
|               expect(event.invitees).to eq([]) | ||||
|             end | ||||
|           end | ||||
| 
 | ||||
|           context 'when status changes from standalone to public' do | ||||
|             it 'changes the status' do | ||||
|               event.update!(status: Event.statuses[:standalone]) | ||||
|               event.update_with_params!(status: Event.statuses[:standalone]) | ||||
| 
 | ||||
|               put "/discourse-post-event/events/#{event.id}.json", params: { | ||||
|                 event: { | ||||
|  | @ -194,15 +194,14 @@ module DiscoursePostEvent | |||
| 
 | ||||
|           context 'when status changes from private to standalone' do | ||||
|             it 'changes the status' do | ||||
|               event.update!( | ||||
|               event.update_with_params!( | ||||
|                 status: Event.statuses[:private], | ||||
|                 raw_invitees: [group.name] | ||||
|               ) | ||||
|               event.fill_invitees! | ||||
| 
 | ||||
|               event.reload | ||||
| 
 | ||||
|               expect(event.invitees.pluck(:user_id)).to match_array(group.group_users.map { |gu| gu.user.id }) | ||||
|               expect(event.invitees).to eq([]) | ||||
|               expect(event.raw_invitees).to eq([group.name]) | ||||
| 
 | ||||
|               put "/discourse-post-event/events/#{event.id}.json", params: { | ||||
|  | @ -220,16 +219,15 @@ module DiscoursePostEvent | |||
|           end | ||||
| 
 | ||||
|           context 'when status changes from private to public' do | ||||
|             it 'changes the status, removes raw_invitees and keeps invitees' do | ||||
|               event.update!( | ||||
|             it 'changes the status, removes raw_invitees and drops invitees' do | ||||
|               event.update_with_params!( | ||||
|                 status: Event.statuses[:private], | ||||
|                 raw_invitees: [group.name] | ||||
|               ) | ||||
|               event.fill_invitees! | ||||
| 
 | ||||
|               event.reload | ||||
| 
 | ||||
|               expect(event.invitees.pluck(:user_id)).to match_array(group.group_users.map { |gu| gu.user.id }) | ||||
|               expect(event.invitees).to eq([]) | ||||
|               expect(event.raw_invitees).to eq([group.name]) | ||||
| 
 | ||||
|               put "/discourse-post-event/events/#{event.id}.json", params: { | ||||
|  | @ -242,13 +240,13 @@ module DiscoursePostEvent | |||
| 
 | ||||
|               expect(event.status).to eq(Event.statuses[:public]) | ||||
|               expect(event.raw_invitees).to eq(['trust_level_0']) | ||||
|               expect(event.invitees.pluck(:user_id)).to match_array(group.group_users.map { |gu| gu.user.id }) | ||||
|               expect(event.invitees).to eq([]) | ||||
|             end | ||||
|           end | ||||
| 
 | ||||
|           context 'when status changes from public to private' do | ||||
|             it 'changes the status, removes raw_invitees and keeps invitees' do | ||||
|               event.update!(status: Event.statuses[:public]) | ||||
|             it 'changes the status, removes raw_invitees and drops invitees not part of new raw_invitees' do | ||||
|               event.update_with_params!(status: Event.statuses[:public]) | ||||
|               event.create_invitees([ | ||||
|                 { user_id: invitee1.id }, | ||||
|                 { user_id: invitee2.id }, | ||||
|  | @ -256,7 +254,7 @@ module DiscoursePostEvent | |||
|               event.reload | ||||
| 
 | ||||
|               expect(event.invitees.pluck(:user_id)).to match_array([invitee1.id, invitee2.id]) | ||||
|               expect(event.raw_invitees).to eq(nil) | ||||
|               expect(event.raw_invitees).to eq(['trust_level_0']) | ||||
| 
 | ||||
|               put "/discourse-post-event/events/#{event.id}.json", params: { | ||||
|                 event: { | ||||
|  | @ -269,20 +267,20 @@ module DiscoursePostEvent | |||
| 
 | ||||
|               expect(event.status).to eq(Event.statuses[:private]) | ||||
|               expect(event.raw_invitees).to eq([group.name]) | ||||
|               expect(event.invitees.pluck(:user_id)).to match_array(group.group_users.map { |gu| gu.user.id }) | ||||
|               expect(event.invitees.pluck(:user_id)).to eq([invitee2.id]) | ||||
|             end | ||||
|           end | ||||
| 
 | ||||
|           context 'when status changes from public to standalone' do | ||||
|             it 'changes the status, removes invitees' do | ||||
|               event.update!( | ||||
|               event.update_with_params!( | ||||
|                 status: Event.statuses[:public] | ||||
|               ) | ||||
|               event.create_invitees([ { user_id: invitee1.id } ]) | ||||
|               event.reload | ||||
| 
 | ||||
|               expect(event.invitees.pluck(:user_id)).to eq([invitee1.id]) | ||||
|               expect(event.raw_invitees).to eq(nil) | ||||
|               expect(event.raw_invitees).to eq(['trust_level_0']) | ||||
| 
 | ||||
|               put "/discourse-post-event/events/#{event.id}.json", params: { | ||||
|                 event: { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue