base_resolver.rb 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # frozen_string_literal: true
  2. module Resolvers
  3. class BaseResolver < GraphQL::Schema::Resolver
  4. def self.argument_with_plural(field, type, **args)
  5. plural_sym = field.to_s.pluralize.to_sym
  6. plurals[field] = plural_sym
  7. argument(field, type, args)
  8. argument(plural_sym, [type], args.dup.tap { |a| a[:required] = false })
  9. end
  10. def self.plurals
  11. @plurals ||= {}
  12. end
  13. def plurals
  14. self.class.plurals
  15. end
  16. def clobber_id_with_iid!(args)
  17. args[:id] = args.delete(:iid) if args[:iid]
  18. end
  19. def clobber_ids_with_iids!(args)
  20. args[:ids] = args.delete(:iids) if args[:iids]
  21. end
  22. def combine_plurals!(args)
  23. plurals.each do |singular, plural|
  24. args[singular] = [args[singular], *args.delete(plural)] if args[plural]
  25. end
  26. end
  27. def decode_id(args)
  28. if (id = args[:id])
  29. _, iid = GraphQL::Schema::UniqueWithinType.decode(id)
  30. args[:id] = iid
  31. end
  32. end
  33. def decode_ids(args)
  34. if (ids = args[:ids])
  35. ids.map! { |i| GraphQL::Schema::UniqueWithinType.decode(i).last }
  36. args[:ids] = ids
  37. end
  38. end
  39. def prepare_args!(args)
  40. decode_id(args)
  41. decode_ids(args)
  42. clobber_id_with_iid!(args)
  43. clobber_ids_with_iids!(args)
  44. combine_plurals!(args)
  45. end
  46. def self.single
  47. @single ||= Class.new(self) do
  48. def resolve(**args)
  49. super.first
  50. end
  51. end
  52. end
  53. end
  54. end