| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- # frozen_string_literal: true
- require './lib/api_error/base_error'
- module Resolvers
- class BaseResolver < GraphQL::Schema::Resolver
- def self.argument_with_plural(field, type, **args)
- plural_sym = field.to_s.pluralize.to_sym
- plurals[field] = plural_sym
- argument(field, type, args)
- argument(plural_sym, [type], args.dup.tap { |a| a[:required] = false })
- end
- def self.plurals
- @plurals ||= {}
- end
- def plurals
- self.class.plurals
- end
- def clobber_id_with_iid!(args)
- raise APIError::BaseError, "Cannot use 'id' and 'iid' in the same query." if args[:id] && args[:iid]
- args[:id] = args.delete(:iid) if args[:iid]
- end
- def combine_ids_with_iids!(args)
- args[:ids] = [*args[:ids], *args.delete(:iids)] if args[:iids]
- end
- def combine_plurals!(args)
- plurals.each do |singular, plural|
- next unless args[plural]
- singular_arg = args[singular]
- args[singular] = [*args.delete(plural)]
- args[singular].unshift(singular_arg) if singular_arg
- end
- end
- def decode_id(args)
- if (id = args[:id])
- _, iid = GraphQL::Schema::UniqueWithinType.decode(id)
- args[:id] = iid
- end
- end
- def decode_ids(args)
- if (ids = args[:ids])
- ids.map! { |i| GraphQL::Schema::UniqueWithinType.decode(i).last }
- args[:ids] = ids
- end
- end
- def prepare_args!(args)
- decode_id(args)
- decode_ids(args)
- clobber_id_with_iid!(args)
- combine_ids_with_iids!(args)
- combine_plurals!(args)
- end
- def self.single
- @single ||= Class.new(self) do
- def resolve(**args)
- super.first
- end
- end
- end
- end
- end
|