demarches-normaliennes/app/services/instructeurs_import_service.rb

55 lines
1.9 KiB
Ruby

class InstructeursImportService
def self.import_groupes(procedure, groupes_emails)
groupes_emails, error_groupe_emails = groupes_emails.partition { _1['groupe'].present? }
groupes_emails = groupes_emails.map do
{
groupe: _1['groupe'].strip,
email: _1['email'].present? ? EmailSanitizableConcern::EmailSanitizer.sanitize(_1['email']) : nil
}
end
errors = error_groupe_emails.map { _1['email'] }.uniq
target_labels = groupes_emails.map { _1[:groupe] }.uniq
missing_labels = target_labels - procedure.groupe_instructeurs.pluck(:label)
if missing_labels.present?
created_at = Time.zone.now
GroupeInstructeur.insert_all(missing_labels.map { |label| { procedure_id: procedure.id, label:, created_at:, updated_at: created_at } })
end
emails_in_groupe = groupes_emails
.group_by { _1[:groupe] }
.transform_values { |groupes_emails| groupes_emails.map { _1[:email] }.uniq }
emails_in_groupe.default = []
target_groupes = procedure
.groupe_instructeurs
.where(label: target_labels)
.map { [_1, emails_in_groupe[_1.label]] }
.to_h
added_instructeurs_by_group = []
target_groupes.each do |groupe_instructeur, emails|
added_instructeurs, invalid_emails = groupe_instructeur.add_instructeurs(emails:)
added_instructeurs_by_group << [groupe_instructeur, added_instructeurs]
errors << invalid_emails
end
[added_instructeurs_by_group, errors.flatten]
end
def self.import_instructeurs(procedure, emails)
instructeurs_emails = emails
.map { _1["email"] }
.compact
.map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1) }
groupe_instructeur = procedure.defaut_groupe_instructeur
instructeurs, invalid_emails = groupe_instructeur.add_instructeurs(emails: instructeurs_emails)
[instructeurs, invalid_emails]
end
end