login.rb 1.4 KB

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