Add earliest allowed deletion time to user model

This commit is contained in:
Anton Khorev 2023-10-24 20:42:23 +03:00
parent 91a4fd6b5a
commit a8aaf62e62
6 changed files with 92 additions and 6 deletions

View file

@ -61,7 +61,7 @@ Metrics/BlockNesting:
# Offense count: 26
# Configuration parameters: CountComments, CountAsOne.
Metrics/ClassLength:
Max: 286
Max: 297
# Offense count: 59
# Configuration parameters: AllowedMethods, AllowedPatterns.

View file

@ -14,11 +14,12 @@
#
# Indexes
#
# changesets_bbox_idx (min_lat,max_lat,min_lon,max_lon) USING gist
# changesets_closed_at_idx (closed_at)
# changesets_created_at_idx (created_at)
# changesets_user_id_created_at_idx (user_id,created_at)
# changesets_user_id_id_idx (user_id,id)
# changesets_bbox_idx (min_lat,max_lat,min_lon,max_lon) USING gist
# changesets_closed_at_idx (closed_at)
# changesets_created_at_idx (created_at)
# changesets_user_id_created_at_idx (user_id,created_at)
# changesets_user_id_id_idx (user_id,id)
# index_changesets_on_user_id_and_closed_at (user_id,closed_at)
#
# Foreign Keys
#

View file

@ -419,6 +419,18 @@ class User < ApplicationRecord
end
end
def deletion_allowed_at
unless Settings.user_account_deletion_delay.nil?
last_changeset = changesets.reorder(:closed_at => :desc).first
return last_changeset.closed_at.utc + Settings.user_account_deletion_delay.hours if last_changeset
end
creation_time.utc
end
def deletion_allowed?
deletion_allowed_at <= Time.now.utc
end
private
def encrypt_password

View file

@ -0,0 +1,7 @@
class AddClosedAtIndexToChangesets < ActiveRecord::Migration[7.1]
disable_ddl_transaction!
def change
add_index :changesets, [:user_id, :closed_at], :algorithm => :concurrently
end
end

View file

@ -2499,6 +2499,13 @@ CREATE INDEX index_changeset_comments_on_changeset_id_and_created_at ON public.c
CREATE INDEX index_changeset_comments_on_created_at ON public.changeset_comments USING btree (created_at);
--
-- Name: index_changesets_on_user_id_and_closed_at; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_changesets_on_user_id_and_closed_at ON public.changesets USING btree (user_id, closed_at);
--
-- Name: index_changesets_subscribers_on_changeset_id; Type: INDEX; Schema: public; Owner: -
--
@ -3499,6 +3506,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('23'),
('22'),
('21'),
('20231117170422'),
('20231101222146'),
('20231029151516'),
('20231010194809'),

View file

@ -282,4 +282,62 @@ class UserTest < ActiveSupport::TestCase
oauth_access_token.reload
assert_predicate oauth_access_token, :revoked?
end
def test_deletion_allowed_when_no_changesets
with_user_account_deletion_delay(10000) do
user = create(:user)
assert_predicate user, :deletion_allowed?
end
end
def test_deletion_allowed_without_delay
with_user_account_deletion_delay(nil) do
user = create(:user)
create(:changeset, :user => user)
user.reload
assert_predicate user, :deletion_allowed?
end
end
def test_deletion_allowed_past_delay
with_user_account_deletion_delay(10) do
user = create(:user)
create(:changeset, :user => user, :created_at => Time.now.utc - 12.hours, :closed_at => Time.now.utc - 10.hours)
user.reload
assert_predicate user, :deletion_allowed?
end
end
def test_deletion_allowed_during_delay
with_user_account_deletion_delay(10) do
user = create(:user)
create(:changeset, :user => user, :created_at => Time.now.utc - 11.hours, :closed_at => Time.now.utc - 9.hours)
user.reload
assert_not_predicate user, :deletion_allowed?
assert_equal Time.now.utc + 1.hour, user.deletion_allowed_at
end
end
def test_deletion_allowed_past_zero_delay
with_user_account_deletion_delay(0) do
user = create(:user)
create(:changeset, :user => user, :created_at => Time.now.utc, :closed_at => Time.now.utc + 1.hour)
travel 90.minutes do
user.reload
assert_predicate user, :deletion_allowed?
end
end
end
def test_deletion_allowed_during_zero_delay
with_user_account_deletion_delay(0) do
user = create(:user)
create(:changeset, :user => user, :created_at => Time.now.utc, :closed_at => Time.now.utc + 1.hour)
travel 30.minutes do
user.reload
assert_not_predicate user, :deletion_allowed?
assert_equal Time.now.utc + 30.minutes, user.deletion_allowed_at
end
end
end
end