FIX: post owner should be considered as any other invitable
This commit is contained in:
parent
a53b565d4b
commit
166d5ff7ff
|
@ -17,24 +17,12 @@ module DiscoursePostEvent
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
invitee = Invitee.find(params[:id])
|
invitee = Invitee.upsert_attendance!(params[:id], invitee_params, guardian)
|
||||||
guardian.ensure_can_act_on_invitee!(invitee)
|
|
||||||
status = Invitee.statuses[invitee_params[:status].to_sym]
|
|
||||||
invitee.update_attendance(status: status)
|
|
||||||
invitee.event.publish_update!
|
|
||||||
render json: InviteeSerializer.new(invitee)
|
render json: InviteeSerializer.new(invitee)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
status = Invitee.statuses[invitee_params[:status].to_sym]
|
invitee = Invitee.upsert_attendance!(current_user.id, invitee_params, guardian)
|
||||||
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!
|
|
||||||
render json: InviteeSerializer.new(invitee)
|
render json: InviteeSerializer.new(invitee)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -109,26 +109,10 @@ module DiscoursePostEvent
|
||||||
@statuses ||= Enum.new(standalone: 0, public: 1, private: 2)
|
@statuses ||= Enum.new(standalone: 0, public: 1, private: 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
def most_likely_going(current_user, limit = SiteSetting.displayed_invitees_limit)
|
def most_likely_going(limit = SiteSetting.displayed_invitees_limit)
|
||||||
most_likely = []
|
self.invitees
|
||||||
|
|
||||||
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
|
|
||||||
.order([:status, :user_id])
|
.order([:status, :user_id])
|
||||||
.where.not(user_id: current_user.id)
|
.limit(limit)
|
||||||
.limit(limit - most_likely.count)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def publish_update!
|
def publish_update!
|
||||||
|
@ -160,7 +144,6 @@ module DiscoursePostEvent
|
||||||
|
|
||||||
def can_user_update_attendance(user)
|
def can_user_update_attendance(user)
|
||||||
!self.is_expired? &&
|
!self.is_expired? &&
|
||||||
self.post.user != user &&
|
|
||||||
(
|
(
|
||||||
self.status == Event.statuses[:public] ||
|
self.status == Event.statuses[:public] ||
|
||||||
(
|
(
|
||||||
|
|
|
@ -19,6 +19,27 @@ module DiscoursePostEvent
|
||||||
self.update!(params)
|
self.update!(params)
|
||||||
end
|
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)
|
def self.extract_uniq_usernames(groups)
|
||||||
User.where(
|
User.where(
|
||||||
id: GroupUser.where(
|
id: GroupUser.where(
|
||||||
|
|
|
@ -56,7 +56,7 @@ module DiscoursePostEvent
|
||||||
counts = object.invitees.group(:status).count
|
counts = object.invitees.group(:status).count
|
||||||
|
|
||||||
# event creator is always going so we add one
|
# 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
|
interested = counts[Invitee.statuses[:interested]] || 0
|
||||||
not_going = counts[Invitee.statuses[:not_going]] || 0
|
not_going = counts[Invitee.statuses[:not_going]] || 0
|
||||||
unanswered = counts[nil] || 0
|
unanswered = counts[nil] || 0
|
||||||
|
@ -70,18 +70,10 @@ module DiscoursePostEvent
|
||||||
end
|
end
|
||||||
|
|
||||||
def watching_invitee
|
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(
|
watching_invitee = Invitee.find_by(
|
||||||
user_id: scope.current_user.id,
|
user_id: scope.current_user.id,
|
||||||
post_id: object.id
|
post_id: object.id
|
||||||
)
|
)
|
||||||
end
|
|
||||||
|
|
||||||
if watching_invitee
|
if watching_invitee
|
||||||
InviteeSerializer.new(watching_invitee, root: false)
|
InviteeSerializer.new(watching_invitee, root: false)
|
||||||
|
@ -89,7 +81,7 @@ module DiscoursePostEvent
|
||||||
end
|
end
|
||||||
|
|
||||||
def sample_invitees
|
def sample_invitees
|
||||||
invitees = object.most_likely_going(scope.current_user)
|
invitees = object.most_likely_going
|
||||||
ActiveModel::ArraySerializer.new(invitees, each_serializer: InviteeSerializer)
|
ActiveModel::ArraySerializer.new(invitees, each_serializer: InviteeSerializer)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,8 @@ export default createWidget("discourse-post-event", {
|
||||||
"discourse-post-event-invitee",
|
"discourse-post-event-invitee",
|
||||||
this.state.eventModel.watching_invitee.id,
|
this.state.eventModel.watching_invitee.id,
|
||||||
{
|
{
|
||||||
status
|
status,
|
||||||
|
post_id: this.state.eventModel.id
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -63,6 +63,26 @@ module DiscoursePostEvent
|
||||||
status: 2,
|
status: 2,
|
||||||
)
|
)
|
||||||
end
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,7 +71,7 @@ module DiscoursePostEvent
|
||||||
|
|
||||||
expect(response.status).to eq(200)
|
expect(response.status).to eq(200)
|
||||||
sample_invitees = response.parsed_body['event']['sample_invitees']
|
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']
|
raw_invitees = response.parsed_body['event']['raw_invitees']
|
||||||
expect(raw_invitees).to match_array(invitees)
|
expect(raw_invitees).to match_array(invitees)
|
||||||
end
|
end
|
||||||
|
@ -88,7 +88,7 @@ module DiscoursePostEvent
|
||||||
|
|
||||||
expect(response.status).to eq(200)
|
expect(response.status).to eq(200)
|
||||||
sample_invitees = response.parsed_body['event']['sample_invitees']
|
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
|
end
|
||||||
|
|
||||||
it 'accepts one group invitee' do
|
it 'accepts one group invitee' do
|
||||||
|
@ -103,7 +103,7 @@ module DiscoursePostEvent
|
||||||
|
|
||||||
expect(response.status).to eq(200)
|
expect(response.status).to eq(200)
|
||||||
sample_invitees = response.parsed_body['event']['sample_invitees']
|
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
|
end
|
||||||
|
|
||||||
it 'accepts no invitee' do
|
it 'accepts no invitee' do
|
||||||
|
@ -118,8 +118,7 @@ module DiscoursePostEvent
|
||||||
|
|
||||||
expect(response.status).to eq(200)
|
expect(response.status).to eq(200)
|
||||||
sample_invitees = response.parsed_body['event']['sample_invitees']
|
sample_invitees = response.parsed_body['event']['sample_invitees']
|
||||||
expect(sample_invitees.count).to eq(1)
|
expect(sample_invitees.count).to eq(0)
|
||||||
expect(sample_invitees[0]['user']['username']).to eq(user.username)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'limits displayed invitees' do
|
it 'limits displayed invitees' do
|
||||||
|
|
Loading…
Reference in New Issue