mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 07:53:49 +08:00
FIX: Use updated_at date to denote expired invites (#8521)
This commit is contained in:
@ -55,7 +55,7 @@ class Invite < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def expired?
|
def expired?
|
||||||
created_at < SiteSetting.invite_expiry_days.days.ago
|
updated_at < SiteSetting.invite_expiry_days.days.ago
|
||||||
end
|
end
|
||||||
|
|
||||||
# link_valid? indicates whether the invite link can be used to log in to the site
|
# link_valid? indicates whether the invite link can be used to log in to the site
|
||||||
@ -191,7 +191,7 @@ class Invite < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.find_pending_invites_from(inviter, offset = 0)
|
def self.find_pending_invites_from(inviter, offset = 0)
|
||||||
find_all_invites_from(inviter, offset).where('invites.user_id IS NULL').order('invites.created_at DESC')
|
find_all_invites_from(inviter, offset).where('invites.user_id IS NULL').order('invites.updated_at DESC')
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.find_redeemed_invites_from(inviter, offset = 0)
|
def self.find_redeemed_invites_from(inviter, offset = 0)
|
||||||
@ -244,7 +244,7 @@ class Invite < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.rescind_all_expired_invites_from(user)
|
def self.rescind_all_expired_invites_from(user)
|
||||||
Invite.where('invites.user_id IS NULL AND invites.email IS NOT NULL AND invited_by_id = ? AND invites.created_at < ?',
|
Invite.where('invites.user_id IS NULL AND invites.email IS NOT NULL AND invited_by_id = ? AND invites.updated_at < ?',
|
||||||
user.id, SiteSetting.invite_expiry_days.days.ago).find_each do |invite|
|
user.id, SiteSetting.invite_expiry_days.days.ago).find_each do |invite|
|
||||||
invite.trash!(user)
|
invite.trash!(user)
|
||||||
end
|
end
|
||||||
|
@ -88,7 +88,7 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
|
|||||||
end
|
end
|
||||||
|
|
||||||
def mark_invite_redeemed
|
def mark_invite_redeemed
|
||||||
count = Invite.where('id = ? AND redeemed_at IS NULL AND created_at >= ?',
|
count = Invite.where('id = ? AND redeemed_at IS NULL AND updated_at >= ?',
|
||||||
invite.id, SiteSetting.invite_expiry_days.days.ago)
|
invite.id, SiteSetting.invite_expiry_days.days.ago)
|
||||||
.update_all('redeemed_at = CURRENT_TIMESTAMP')
|
.update_all('redeemed_at = CURRENT_TIMESTAMP')
|
||||||
|
|
||||||
|
@ -1223,7 +1223,7 @@ en:
|
|||||||
search: "type to search invites..."
|
search: "type to search invites..."
|
||||||
title: "Invites"
|
title: "Invites"
|
||||||
user: "Invited User"
|
user: "Invited User"
|
||||||
sent: "Sent"
|
sent: "Last Sent"
|
||||||
none: "No invites to display."
|
none: "No invites to display."
|
||||||
truncated:
|
truncated:
|
||||||
one: "Showing the first invite."
|
one: "Showing the first invite."
|
||||||
|
7
db/migrate/20191211152404_add_index_to_invites.rb
Normal file
7
db/migrate/20191211152404_add_index_to_invites.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddIndexToInvites < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_index :invites, [:invited_by_id]
|
||||||
|
end
|
||||||
|
end
|
@ -70,6 +70,7 @@ describe InviteRedeemer do
|
|||||||
inviter = invite.invited_by
|
inviter = invite.invited_by
|
||||||
inviter.admin = true
|
inviter.admin = true
|
||||||
user = invite_redeemer.redeem
|
user = invite_redeemer.redeem
|
||||||
|
invite.reload
|
||||||
|
|
||||||
expect(user.name).to eq(name)
|
expect(user.name).to eq(name)
|
||||||
expect(user.username).to eq(username)
|
expect(user.username).to eq(username)
|
||||||
@ -153,5 +154,20 @@ describe InviteRedeemer do
|
|||||||
another_user = another_invite_redeemer.redeem
|
another_user = another_invite_redeemer.redeem
|
||||||
expect(another_user).to eq(nil)
|
expect(another_user).to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should correctly update the invite redeemed_at date" do
|
||||||
|
SiteSetting.invite_expiry_days = 2
|
||||||
|
invite.update!(created_at: 10.days.ago)
|
||||||
|
|
||||||
|
inviter = invite.invited_by
|
||||||
|
inviter.admin = true
|
||||||
|
user = invite_redeemer.redeem
|
||||||
|
invite.reload
|
||||||
|
|
||||||
|
expect(user.invited_by).to eq(inviter)
|
||||||
|
expect(inviter.notifications.count).to eq(1)
|
||||||
|
expect(invite.redeemed_at).not_to eq(nil)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -109,7 +109,6 @@ describe Invite do
|
|||||||
expect(new_invite.invite_key).not_to eq(invite.invite_key)
|
expect(new_invite.invite_key).not_to eq(invite.invite_key)
|
||||||
expect(new_invite.topics).to eq([topic])
|
expect(new_invite.topics).to eq([topic])
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when adding a duplicate' do
|
context 'when adding a duplicate' do
|
||||||
@ -137,7 +136,7 @@ describe Invite do
|
|||||||
|
|
||||||
it 'returns a new invite if the other has expired' do
|
it 'returns a new invite if the other has expired' do
|
||||||
SiteSetting.invite_expiry_days = 1
|
SiteSetting.invite_expiry_days = 1
|
||||||
invite.update!(created_at: 2.days.ago)
|
invite.update!(updated_at: 2.days.ago)
|
||||||
|
|
||||||
new_invite = Invite.invite_by_email(
|
new_invite = Invite.invite_by_email(
|
||||||
'iceking@adventuretime.ooo', inviter, topic
|
'iceking@adventuretime.ooo', inviter, topic
|
||||||
@ -159,6 +158,15 @@ describe Invite do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'resets expiry of a resent invite' do
|
||||||
|
SiteSetting.invite_expiry_days = 2
|
||||||
|
invite.update!(updated_at: 10.days.ago)
|
||||||
|
expect(invite).to be_expired
|
||||||
|
|
||||||
|
invite.resend_invite
|
||||||
|
expect(invite).not_to be_expired
|
||||||
|
end
|
||||||
|
|
||||||
it 'correctly marks invite emailed_status for email invites' do
|
it 'correctly marks invite emailed_status for email invites' do
|
||||||
expect(invite.emailed_status).to eq(Invite.emailed_status_types[:sending])
|
expect(invite.emailed_status).to eq(Invite.emailed_status_types[:sending])
|
||||||
|
|
||||||
@ -214,7 +222,7 @@ describe Invite do
|
|||||||
|
|
||||||
it 'wont redeem an expired invite' do
|
it 'wont redeem an expired invite' do
|
||||||
SiteSetting.invite_expiry_days = 10
|
SiteSetting.invite_expiry_days = 10
|
||||||
invite.update_column(:created_at, 20.days.ago)
|
invite.update_column(:updated_at, 20.days.ago)
|
||||||
expect(invite.redeem).to be_blank
|
expect(invite.redeem).to be_blank
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -493,7 +501,7 @@ describe Invite do
|
|||||||
invite_1 = Fabricate(:invite, invited_by: user)
|
invite_1 = Fabricate(:invite, invited_by: user)
|
||||||
invite_2 = Fabricate(:invite, invited_by: user)
|
invite_2 = Fabricate(:invite, invited_by: user)
|
||||||
expired_invite = Fabricate(:invite, invited_by: user)
|
expired_invite = Fabricate(:invite, invited_by: user)
|
||||||
expired_invite.update!(created_at: 2.days.ago)
|
expired_invite.update!(updated_at: 2.days.ago)
|
||||||
Invite.rescind_all_expired_invites_from(user)
|
Invite.rescind_all_expired_invites_from(user)
|
||||||
invite_1.reload
|
invite_1.reload
|
||||||
invite_2.reload
|
invite_2.reload
|
||||||
|
Reference in New Issue
Block a user