mirror of
https://github.com/astuto/astuto.git
synced 2025-12-15 03:07:52 +01:00
62 lines
2.0 KiB
Ruby
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 |