/app/forms/user/subscription_form.rb

https://github.com/PopulateTools/gobierto · Ruby · 72 lines · 58 code · 13 blank · 1 comment · 4 complexity · 5771af2259cd24737d164cc9d0c2ede2 MD5 · raw file

  1. # frozen_string_literal: true
  2. class User::SubscriptionForm < BaseForm
  3. attr_accessor(
  4. :user,
  5. :site,
  6. :subscribable,
  7. :subscribable_type,
  8. :subscribable_id,
  9. :user_email,
  10. :creation_ip
  11. )
  12. validates :user, :site, :subscribable, presence: true
  13. validates :user_email, format: { with: User::EMAIL_ADDRESS_REGEXP }, allow_nil: true
  14. def save
  15. toggle_user_subscription if valid?
  16. end
  17. def user
  18. @user ||= begin
  19. user_registration_form = User::RegistrationForm.new(
  20. email: user_email,
  21. site: site,
  22. creation_ip: creation_ip
  23. )
  24. user_registration_form.save
  25. promote_errors(user_registration_form.errors)
  26. user_registration_form.user
  27. end
  28. end
  29. def subscribable
  30. @subscribable ||= begin
  31. if @subscribable_id.present?
  32. subscribable_class.find_by(id: @subscribable_id)
  33. else
  34. subscribable_class
  35. end
  36. end
  37. end
  38. def subscribable_type
  39. @subscribable_type ||= if @subscribable.is_a?(Module)
  40. @subscribable.to_s
  41. else
  42. @subscribable.try(:model_name)
  43. end
  44. end
  45. def subscribable_id
  46. @subscribable_id ||= @subscribable.try(:id)
  47. end
  48. private
  49. def subscribable_class
  50. if subscribable_type.is_a?(String)
  51. subscribable_type.try(:constantize)
  52. else
  53. subscribable_type
  54. end
  55. end
  56. def toggle_user_subscription
  57. user.toggle_subscription!(subscribable, site)
  58. end
  59. end