# frozen_string_literal: true module Decidim module Meetings MeetingType = GraphQL::ObjectType.define do name "Meeting" description "A meeting" interfaces [ -> { Decidim::Comments::CommentableInterface }, -> { Decidim::Core::CategorizableInterface }, -> { Decidim::Core::ScopableInterface }, -> { Decidim::Core::AttachableInterface }, -> { Decidim::Core::TimestampsInterface }, -> { Decidim::Meetings::ServicesInterface }, -> { Decidim::Meetings::LinkedResourcesInterface }, -> { Decidim::Forms::QuestionnaireEntityInterface } ] field :id, !types.ID, "ID of this meeting" field :reference, !types.String, "Reference for this meeting" field :title, !Decidim::Core::TranslatedFieldType, "The title of this meeting." field :description, Decidim::Core::TranslatedFieldType, "The description of this meeting." field :startTime, !Decidim::Core::DateTimeType, "The time this meeting starts", property: :start_time field :endTime, !Decidim::Core::DateTimeType, "The time this meeting ends", property: :end_time field :author, Decidim::Core::AuthorInterface, "If specified, the author of this meeting" field :agenda, AgendaType, "Agenda for this meeting, if available" do resolve ->(meeting, _args, _ctx) { meeting.agenda if meeting.agenda&.visible? } end field :closed, !types.Boolean, "Whether this meeting is closed or not.", property: :closed? field :closingReport, Decidim::Core::TranslatedFieldType, "The closing report of this meeting.", property: :closing_report field :attendingOrganizations, types.String, "list of attending organizations", property: :attending_organizations field :attendeeCount, types.Int, "Amount of attendees to this meeting", property: :attendees_count field :contributionCount, types.Int, "Amount of contributions to this meeting", property: :contributions_count field :minutes, MinutesType, "Minutes for this meeting, if available" do resolve ->(meeting, _args, _ctx) { meeting.minutes if meeting.minutes&.visible? } end field :privateMeeting, !types.Boolean, "Whether the meeting is private or not (it can only be true if transparent)", property: :private_meeting field :transparent, !types.Boolean, "For private meetings, information is public if transparent", property: :transparent field :registrationsEnabled, !types.Boolean, "Whether the registrations are enabled or not", property: :registrations_enabled field :registrationTerms, Decidim::Core::TranslatedFieldType, "The registration terms", property: :registration_terms field :remainingSlots, types.Int, "Amount of slots available for this meeting", property: :remaining_slots field :registrationFormEnabled, !types.Boolean, "Whether the registrations have a form or not", property: :registration_form_enabled field :registrationForm, Decidim::Forms::QuestionnaireType do description "If registration requires to fill a form, this is the questionnaire" resolve ->(meeting, _args, _ctx) { meeting.questionnaire if meeting.registration_form_enabled? } end field :location, Decidim::Core::TranslatedFieldType, "The location of this meeting (free format)" field :locationHints, Decidim::Core::TranslatedFieldType, "The location of this meeting (free format)", property: :location_hints field :address, types.String, "The physical address of this meeting (used for geolocation)" field :coordinates, Decidim::Core::CoordinatesType, "Physical coordinates for this meeting" do resolve ->(meeting, _args, _ctx) { [meeting.latitude, meeting.longitude] } end end end end