Files
astuto/app/controllers/invitations_controller.rb
2024-09-06 20:27:15 +02:00

62 lines
2.0 KiB
Ruby

class InvitationsController < ApplicationController
before_action :authenticate_admin
def create
to = invitation_params[:to].split(',').map(&:strip).select { |email| URI::MailTo::EMAIL_REGEXP.match?(email) }
subject = invitation_params[:subject]
body = invitation_params[:body]
num_invitations_sent = 0
to.each do |email|
invitation_token = SecureRandom.hex(16)
invitation_token_digest = Digest::SHA256.hexdigest(invitation_token)
# skip if user already registered
next if User.find_by(email: email).present?
invitation = Invitation.find_or_initialize_by(email: email)
# skip if invitation already exists and accepted
next if invitation.persisted? && invitation.accepted_at.present?
invitation.token_digest = invitation_token_digest
invitation.save!
# replace %link% placeholder in body with the invitation link
body_with_link = body.gsub('%link%', get_url_for(method(:new_user_registration_url), options: { invitation_token: invitation_token, email: email }))
InvitationMailer.invite(to: email, subject: subject, body: body_with_link).deliver_later
num_invitations_sent += 1
end
status = num_invitations_sent > 0 ? :ok : :unprocessable_entity
render json: { num_invitations_sent: num_invitations_sent }, status: status
end
def test
to = invitation_params[:to]
subject = invitation_params[:subject]
body = invitation_params[:body]
invitation_token = SecureRandom.hex(16)
subject = "[TEST] " + subject
body_with_link = body.gsub('%link%', get_url_for(method(:new_user_registration_url), options: { invitation_token: invitation_token, email: to }))
InvitationMailer.invite(to: to, subject: subject, body: body_with_link).deliver_later
render json: {}, status: :ok
end
private
def invitation_params
params.require(:invitations).tap do |invitation|
invitation.require(:to)
invitation.require(:subject)
invitation.require(:body)
end
end
end