Skip to content

Commit

Permalink
seed
Browse files Browse the repository at this point in the history
  • Loading branch information
tomhughes committed Nov 1, 2023
1 parent 4cbebb2 commit ea741fa
Showing 1 changed file with 60 additions and 0 deletions.
60 changes: 60 additions & 0 deletions db/seeds.rb
Expand Up @@ -7,3 +7,63 @@
# Character.create(name: 'Luke', movie: movies.first)

Language.load(Rails.root.join("config/languages.yml"))

ActiveRecord::Base.connection.execute(%(
CREATE OR REPLACE FUNCTION check_rate_limit(user_id int8, new_changes int4)
RETURNS boolean
AS $$
DECLARE
min_changes_per_hour int4;
initial_changes_per_hour int4;
max_changes_per_hour int4;
importer_changes_per_hour int4;
moderator_changes_per_hour int4;
roles text[];
last_block timestamp without time zone;
first_change timestamp without time zone;
active_reports int4;
time_since_first_change double precision;
max_changes double precision;
recent_changes int4;
BEGIN
min_changes_per_hour := #{Settings.min_changes_per_hour};
initial_changes_per_hour := #{Settings.initial_changes_per_hour};
max_changes_per_hour := #{Settings.max_changes_per_hour};
importer_changes_per_hour := #{Settings.importer_changes_per_hour};
moderator_changes_per_hour := #{Settings.moderator_changes_per_hour};
SELECT ARRAY_AGG(user_roles.role) INTO STRICT roles FROM user_roles WHERE user_roles.user_id = check_rate_limit.user_id;
IF 'moderator' = ANY(roles) THEN
max_changes := moderator_changes_per_hour;
ELSIF 'importer' = ANY(roles) THEN
max_changes := importer_changes_per_hour;
ELSE
SELECT user_blocks.created_at INTO last_block FROM user_blocks WHERE user_blocks.user_id = check_rate_limit.user_id ORDER BY user_blocks.created_at DESC LIMIT 1;
IF FOUND THEN
SELECT changesets.created_at INTO first_change FROM changesets WHERE changesets.user_id = check_rate_limit.user_id AND changesets.created_at > last_block ORDER BY changesets.created_at LIMIT 1;
ELSE
SELECT changesets.created_at INTO first_change FROM changesets WHERE changesets.user_id = check_rate_limit.user_id ORDER BY changesets.created_at LIMIT 1;
END IF;
IF NOT FOUND THEN
first_change := NOW();
END IF;
SELECT COALESCE(SUM(issues.reports_count), 0) INTO STRICT active_reports FROM issues WHERE issues.reported_user_id = check_rate_limit.user_id AND issues.status = 'open';
time_since_first_change := EXTRACT(EPOCH FROM NOW() - first_change);
max_changes := max_changes_per_hour * POWER(time_since_first_change, 2) / POWER(7 * 24 * 60 * 60, 2);
max_changes := GREATEST(initial_changes_per_hour, LEAST(max_changes_per_hour, FLOOR(max_changes)));
max_changes := max_changes / POWER(2, active_reports);
max_changes := GREATEST(min_changes_per_hour, LEAST(max_changes_per_hour, max_changes));
END IF;
SELECT COALESCE(SUM(changesets.num_changes), 0) INTO STRICT recent_changes FROM changesets WHERE changesets.user_id = check_rate_limit.user_id AND changesets.created_at >= now() - '1 hour'::interval;
RETURN recent_changes + new_changes < max_changes;
END;
$$ LANGUAGE plpgsql STABLE;
))

0 comments on commit ea741fa

Please sign in to comment.