base_resolver.rb 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # frozen_string_literal: true
  2. require './lib/api_error/base_error'
  3. module Resolvers
  4. class BaseResolver < GraphQL::Schema::Resolver
  5. def self.argument_with_plural(field, type, **args)
  6. plural_sym = field.to_s.pluralize.to_sym
  7. plurals[field] = plural_sym
  8. argument(field, type, args)
  9. argument(plural_sym, [type], args.dup.tap { |a| a[:required] = false })
  10. end
  11. def self.plurals
  12. @plurals ||= {}
  13. end
  14. def plurals
  15. self.class.plurals
  16. end
  17. def clobber_id_with_iid!(args)
  18. if args[:id] && args[:iid]
  19. msg = "Cannot use 'id' and 'iid' in the same query."
  20. raise APIError::BaseError, msg
  21. end
  22. args[:id] = args.delete(:iid) if args[:iid]
  23. end
  24. def combine_ids_with_iids!(args)
  25. args[:ids] = [*args[:ids], *args.delete(:iids)] if args[:iids]
  26. end
  27. def combine_plurals!(args)
  28. plurals.each do |singular, plural|
  29. next unless args[plural]
  30. singular_arg = args[singular]
  31. args[singular] = [*args.delete(plural)]
  32. args[singular].unshift(singular_arg) if singular_arg
  33. end
  34. end
  35. def decode_id(args)
  36. if (id = args[:id])
  37. _, iid = GraphQL::Schema::UniqueWithinType.decode(id)
  38. args[:id] = iid
  39. end
  40. end
  41. def decode_ids(args)
  42. if (ids = args[:ids])
  43. ids.map! { |i| GraphQL::Schema::UniqueWithinType.decode(i).last }
  44. args[:ids] = ids
  45. end
  46. end
  47. def prepare_args!(args)
  48. decode_id(args)
  49. decode_ids(args)
  50. clobber_id_with_iid!(args)
  51. combine_ids_with_iids!(args)
  52. combine_plurals!(args)
  53. end
  54. def self.single
  55. @single ||= Class.new(self) do
  56. def resolve(**args)
  57. super.first
  58. end
  59. end
  60. end
  61. end
  62. end