diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 11:10:13 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-06-20 11:10:13 +0000 |
commit | 0ea3fcec397b69815975647f5e2aa5fe944a8486 (patch) | |
tree | 7979381b89d26011bcf9bdc989a40fcc2f1ed4ff /app/services/concerns | |
parent | 72123183a20411a36d607d70b12d57c484394c8e (diff) | |
download | gitlab-ce-0ea3fcec397b69815975647f5e2aa5fe944a8486.tar.gz |
Add latest changes from gitlab-org/gitlab@15-1-stable-eev15.1.0-rc42
Diffstat (limited to 'app/services/concerns')
-rw-r--r-- | app/services/concerns/integrations/bulk_operation_hashes.rb | 31 | ||||
-rw-r--r-- | app/services/concerns/members/bulk_create_users.rb | 86 |
2 files changed, 31 insertions, 86 deletions
diff --git a/app/services/concerns/integrations/bulk_operation_hashes.rb b/app/services/concerns/integrations/bulk_operation_hashes.rb new file mode 100644 index 00000000000..3f13c764ebe --- /dev/null +++ b/app/services/concerns/integrations/bulk_operation_hashes.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +# Returns hashes of attributes suitable for passing to `.insert_all` or `update_all` +module Integrations + module BulkOperationHashes + private + + def integration_hash(operation) + integration + .to_database_hash + .merge('inherit_from_id' => integration.inherit_from_id || integration.id) + .merge(update_timestamps(operation)) + end + + def data_fields_hash(operation) + integration + .data_fields + .to_database_hash + .merge(update_timestamps(operation)) + end + + def update_timestamps(operation) + time_now = Time.current + + { + 'created_at' => (time_now if operation == :create), + 'updated_at' => time_now + }.compact + end + end +end diff --git a/app/services/concerns/members/bulk_create_users.rb b/app/services/concerns/members/bulk_create_users.rb deleted file mode 100644 index e60c84af89e..00000000000 --- a/app/services/concerns/members/bulk_create_users.rb +++ /dev/null @@ -1,86 +0,0 @@ -# frozen_string_literal: true - -module Members - module BulkCreateUsers - extend ActiveSupport::Concern - - included do - class << self - def add_users(source, users, access_level, current_user: nil, expires_at: nil, tasks_to_be_done: [], tasks_project_id: nil) - return [] unless users.present? - - emails, users, existing_members = parse_users_list(source, users) - - Member.transaction do - (emails + users).map! do |user| - new(source, - user, - access_level, - existing_members: existing_members, - current_user: current_user, - expires_at: expires_at, - tasks_to_be_done: tasks_to_be_done, - tasks_project_id: tasks_project_id) - .execute - end - end - end - - private - - def parse_users_list(source, list) - emails = [] - user_ids = [] - users = [] - existing_members = {} - - list.each do |item| - case item - when User - users << item - when Integer - user_ids << item - when /\A\d+\Z/ - user_ids << item.to_i - when Devise.email_regexp - emails << item - end - end - - # the below will automatically discard invalid user_ids - users.concat(User.id_in(user_ids)) if user_ids.present? - users.uniq! # de-duplicate just in case as there is no controlling if user records and ids are sent multiple times - - users_by_emails = source.users_by_emails(emails) # preloads our request store for all emails - # in case emails belong to a user that is being invited by user or user_id, remove them from - # emails and let users/user_ids handle it. - parsed_emails = emails.select do |email| - user = users_by_emails[email] - !user || (users.exclude?(user) && user_ids.exclude?(user.id)) - end - - if users.present? - # helps not have to perform another query per user id to see if the member exists later on when fetching - existing_members = source.members_and_requesters.with_user(users).index_by(&:user_id) - end - - [parsed_emails, users, existing_members] - end - end - end - - def initialize(source, user, access_level, **args) - super - - @existing_members = args[:existing_members] || (raise ArgumentError, "existing_members must be included in the args hash") - end - - private - - attr_reader :existing_members - - def find_or_initialize_member_by_user - existing_members[user.id] || source.members.build(user_id: user.id) - end - end -end |