FIX: post owner should be considered as any other invitable

This commit is contained in:
jjaffeux 2020-04-28 12:28:39 +02:00
parent a53b565d4b
commit 166d5ff7ff
7 changed files with 58 additions and 54 deletions

View File

@ -17,24 +17,12 @@ module DiscoursePostEvent
end
def update
invitee = Invitee.find(params[:id])
guardian.ensure_can_act_on_invitee!(invitee)
status = Invitee.statuses[invitee_params[:status].to_sym]
invitee.update_attendance(status: status)
invitee.event.publish_update!
invitee = Invitee.upsert_attendance!(params[:id], invitee_params, guardian)
render json: InviteeSerializer.new(invitee)
end
def create
status = Invitee.statuses[invitee_params[:status].to_sym]
event = Event.find(invitee_params[:post_id])
guardian.ensure_can_see!(event.post)
invitee = Invitee.create!(
status: status,
post_id: invitee_params[:post_id],
user_id: current_user.id,
)
invitee.event.publish_update!
invitee = Invitee.upsert_attendance!(current_user.id, invitee_params, guardian)
render json: InviteeSerializer.new(invitee)
end

View File

@ -109,26 +109,10 @@ module DiscoursePostEvent
@statuses ||= Enum.new(standalone: 0, public: 1, private: 2)
end
def most_likely_going(current_user, limit = SiteSetting.displayed_invitees_limit)
most_likely = []
if self.can_user_update_attendance(current_user)
most_likely << Invitee.find_or_initialize_by(
user_id: current_user.id,
post_id: self.id
)
end
most_likely << Invitee.new(
user_id: self.post.user_id,
status: Invitee.statuses[:going],
post_id: self.id
)
most_likely + self.invitees
def most_likely_going(limit = SiteSetting.displayed_invitees_limit)
self.invitees
.order([:status, :user_id])
.where.not(user_id: current_user.id)
.limit(limit - most_likely.count)
.limit(limit)
end
def publish_update!
@ -160,7 +144,6 @@ module DiscoursePostEvent
def can_user_update_attendance(user)
!self.is_expired? &&
self.post.user != user &&
(
self.status == Event.statuses[:public] ||
(

View File

@ -19,6 +19,27 @@ module DiscoursePostEvent
self.update!(params)
end
def self.upsert_attendance!(user_id, params, guardian)
invitee = Invitee.find_by(id: user_id)
status = Invitee.statuses[params[:status].to_sym]
if invitee
guardian.ensure_can_act_on_invitee!(invitee)
invitee.update_attendance(status: status)
else
event = Event.find(params[:post_id])
guardian.ensure_can_see!(event.post)
invitee = Invitee.create!(
status: status,
post_id: params[:post_id],
user_id: user_id,
)
end
invitee.event.publish_update!
invitee
end
def self.extract_uniq_usernames(groups)
User.where(
id: GroupUser.where(

View File

@ -56,7 +56,7 @@ module DiscoursePostEvent
counts = object.invitees.group(:status).count
# event creator is always going so we add one
going = (counts[Invitee.statuses[:going]] || 0) + (object.is_expired? ? 0 : 1)
going = counts[Invitee.statuses[:going]] || 0
interested = counts[Invitee.statuses[:interested]] || 0
not_going = counts[Invitee.statuses[:not_going]] || 0
unanswered = counts[nil] || 0
@ -70,18 +70,10 @@ module DiscoursePostEvent
end
def watching_invitee
if scope.current_user === object.post.user
watching_invitee = Invitee.new(
user_id: object.post.user.id,
status: Invitee.statuses[:going],
post_id: object.id
)
else
watching_invitee = Invitee.find_by(
user_id: scope.current_user.id,
post_id: object.id
)
end
watching_invitee = Invitee.find_by(
user_id: scope.current_user.id,
post_id: object.id
)
if watching_invitee
InviteeSerializer.new(watching_invitee, root: false)
@ -89,7 +81,7 @@ module DiscoursePostEvent
end
def sample_invitees
invitees = object.most_likely_going(scope.current_user)
invitees = object.most_likely_going
ActiveModel::ArraySerializer.new(invitees, each_serializer: InviteeSerializer)
end

View File

@ -57,7 +57,8 @@ export default createWidget("discourse-post-event", {
"discourse-post-event-invitee",
this.state.eventModel.watching_invitee.id,
{
status
status,
post_id: this.state.eventModel.id
}
);
} else {

View File

@ -63,6 +63,26 @@ module DiscoursePostEvent
status: 2,
)
end
context 'when the invitee is the event owner' do
let(:post_event) { Fabricate(:event, post: post1) }
it 'creates an invitee' do
expect(post_event.invitees.length).to eq(0)
put "/discourse-post-event/invitees/#{post1.user.id}.json", params: {
invitee: {
post_id: post1.id,
status: "interested"
}
}
post_event.reload
invitee = post_event.invitees.first
expect(invitee.status).to eq(1)
end
end
end
end
end

View File

@ -71,7 +71,7 @@ module DiscoursePostEvent
expect(response.status).to eq(200)
sample_invitees = response.parsed_body['event']['sample_invitees']
expect(sample_invitees.map { |i| i['user']['id'] }).to match_array([user.id] + group.group_users.map { |gu| gu.user.id })
expect(sample_invitees.map { |i| i['user']['id'] }).to match_array(group.group_users.map { |gu| gu.user.id })
raw_invitees = response.parsed_body['event']['raw_invitees']
expect(raw_invitees).to match_array(invitees)
end
@ -88,7 +88,7 @@ module DiscoursePostEvent
expect(response.status).to eq(200)
sample_invitees = response.parsed_body['event']['sample_invitees']
expect(sample_invitees.map { |i| i['user']['id'] }).to match_array([user.id])
expect(sample_invitees.length).to eq(0)
end
it 'accepts one group invitee' do
@ -103,7 +103,7 @@ module DiscoursePostEvent
expect(response.status).to eq(200)
sample_invitees = response.parsed_body['event']['sample_invitees']
expect(sample_invitees.map { |i| i['user']['username'] }).to match_array([user.username] + group.group_users.map(&:user).map(&:username))
expect(sample_invitees.map { |i| i['user']['username'] }).to match_array(group.group_users.map(&:user).map(&:username))
end
it 'accepts no invitee' do
@ -118,8 +118,7 @@ module DiscoursePostEvent
expect(response.status).to eq(200)
sample_invitees = response.parsed_body['event']['sample_invitees']
expect(sample_invitees.count).to eq(1)
expect(sample_invitees[0]['user']['username']).to eq(user.username)
expect(sample_invitees.count).to eq(0)
end
it 'limits displayed invitees' do