login.rb 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # frozen_string_literal: true
  2. module Mutations
  3. module User
  4. class Login < Mutations::BaseMutation
  5. # include ::ControllerMethods
  6. field :user, Types::UserType, null: false
  7. argument :login, String, required: true
  8. argument :password, String, required: true
  9. def resolve(login:, password:)
  10. user = User.find_for_database_authentication(login: login)
  11. if user && active_for_authentication?(user)
  12. if invalid_for_authentication?(user, password)
  13. raise_user_error('bad credentials')
  14. end
  15. set_auth_headers(user)
  16. controller.sign_in(:user, user, store: false, bypass: false)
  17. {user: user}
  18. elsif user && !active_for_authentication?(user)
  19. if locked?(user)
  20. raise_user_error('account locked')
  21. else
  22. raise_user_error('account not confirmed', email: user.email)
  23. end
  24. else
  25. raise_user_error('bad credentials given')
  26. end
  27. end
  28. private
  29. def invalid_for_authentication?(user, password)
  30. valid_password = user.valid_password?(password)
  31. (user.respond_to?(:valid_for_authentication?) && !user.valid_for_authentication? { valid_password }) ||
  32. !valid_password
  33. end
  34. def active_for_authentication?(user)
  35. !user.respond_to?(:active_for_authentication?) || user.active_for_authentication?
  36. end
  37. def locked?(user)
  38. user.respond_to?(:locked_at) && user.locked_at
  39. end
  40. end
  41. end
  42. end