Module: Decidim::QueryExtensions
- Defined in:
- lib/decidim/query_extensions.rb
Overview
This module’s job is to extend the API with custom fields related to decidim-core.
Class Method Summary collapse
-
.define(type) ⇒ Object
Public: Extends a type with ‘decidim-core`’s fields.
Class Method Details
.define(type) ⇒ Object
Public: Extends a type with ‘decidim-core`’s fields.
type - A GraphQL::BaseType to extend.
Returns nothing.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/decidim/query_extensions.rb', line 15 def self.define(type) Decidim.participatory_space_manifests.each do |participatory_space_manifest| type.field participatory_space_manifest.name.to_s.camelize(:lower) do type types[participatory_space_manifest.query_type.constantize] description "Lists all #{participatory_space_manifest.name}" resolve lambda { |_obj, _args, ctx| participatory_space_manifest.model_class_name.constantize.public_spaces.where( organization: ctx[:current_organization] ) } end type.field participatory_space_manifest.name.to_s.singularize.camelize(:lower) do type participatory_space_manifest.query_type.constantize description "Finds a #{participatory_space_manifest.name.to_s.singularize}" argument :id, !types.ID, "The ID of the #{participatory_space_manifest.name.to_s.singularize}" resolve lambda { |_obj, args, ctx| participatory_space_manifest.model_class_name.constantize.public_spaces.find_by( organization: ctx[:current_organization], id: args[:id] ) } end end type.field :component, Decidim::Core::ComponentInterface do description "Lists the components this space contains." argument :id, !types.ID, "The ID of the component to be found" resolve lambda { |_, args, ctx| component = Decidim::Component.published.find_by(id: args[:id]) component&.organization == ctx[:current_organization] ? component : nil } end type.field :session do type Core::SessionType description "Return's information about the logged in user" resolve lambda { |_obj, _args, ctx| ctx[:current_user] } end type.field :decidim, Core::DecidimType, "Decidim's framework properties." do resolve ->(_obj, _args, _ctx) { Decidim } end type.field :organization, Core::OrganizationType, "The current organization" do resolve ->(_obj, _args, ctx) { ctx[:current_organization] } end type.field :hashtags do type types[Core::HashtagType] description "The hashtags for current organization" argument :name, types.String, "The name of the hashtag" resolve lambda { |_obj, args, ctx| Decidim::HashtagsResolver.new(ctx[:current_organization], args[:name]). } end type.field :metrics do type types[Decidim::Core::MetricType] argument :names, types[types.String], "The names of the metrics you want to retrieve" argument :space_type, types.String, "The type of ParticipatorySpace you want to filter with" argument :space_id, types.Int, "The ID of ParticipatorySpace you want to filter with" resolve lambda { |_, args, ctx| manifests = if args[:names].blank? Decidim.metrics_registry.all else Decidim.metrics_registry.all.select do |manifest| args[:names].include?(manifest.metric_name.to_s) end end filters = {} if args[:space_type].present? && args[:space_id].present? filters[:participatory_space_type] = args[:space_type] filters[:participatory_space_id] = args[:space_id] end manifests.map do |manifest| Decidim::Core::MetricResolver.new(manifest.metric_name, ctx[:current_organization], filters) end } end end |