Skip to content

Commit

Permalink
Move all link types onto a single edition type
Browse files Browse the repository at this point in the history
This removes the hardcoding and duplication amongst the varieties of
Edition we have currently implemented.

These changes will make it easier to implement new document types, as
the fields and links have already been defined.

Since all links are now returned as the Edition type, any field can be
selected from them, not just those that have been defined in the link
type. This makes queries much more flexible, as the frontend application
can request any fields it likes from the links, without any changes
being made in Publishing API.

The Minister Index Type is being retained, since that contains custom
optimisations specific to the links on that page.

Note 1: this requires selection of all fields within `details` for any
edition. Previously this was only required when `details` was nested
within a link.

Note 2: role appointment reverse links will be added in a separate
commit, as they require some logic.
  • Loading branch information
brucebolt committed Dec 31, 2024
1 parent a6cf724 commit e981e54
Show file tree
Hide file tree
Showing 12 changed files with 181 additions and 278 deletions.
227 changes: 153 additions & 74 deletions app/graphql/types/edition_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,162 @@ class WithdrawnNotice < Types::BaseObject
field :withdrawn_at, GraphQL::Types::ISO8601DateTime
end

class EditionLinks < Types::BaseObject
links_field :active_top_level_browse_page, [EditionType]
links_field :associated_taxons, [EditionType]
links_field :available_translations, [EditionType]
links_field :contact, [EditionType]
links_field :contacts, [EditionType]
links_field :content_owners, [EditionType]
links_field :corporate_information_pages, [EditionType]
links_field :current_prime_minister, [EditionType]
links_field :documents, [EditionType]
links_field :email_alert_signup, [EditionType]
links_field :embed, [EditionType]
links_field :fatality_notices, [EditionType]
links_field :featured_policies, [EditionType]
links_field :field_of_operation, [EditionType]
links_field :fields_of_operation, [EditionType]
links_field :finder, [EditionType]
links_field :government, [EditionType]
links_field :historical_accounts, [EditionType]
links_field :home_page_offices, [EditionType]
links_field :lead_organisations, [EditionType]
links_field :linked_items, [EditionType]
links_field :main_office, [EditionType]
links_field :mainstream_browse_pages, [EditionType]
links_field :manual, [EditionType]
links_field :meets_user_needs, [EditionType]
links_field :ministerial, [EditionType]
links_field :office_staff, [EditionType]
links_field :ordered_board_members, [EditionType]
links_field :ordered_chief_professional_officers, [EditionType]
links_field :ordered_child_organisations, [EditionType]
links_field :ordered_contacts, [EditionType]
links_field :ordered_featured_policies, [EditionType]
links_field :ordered_foi_contacts, [EditionType]
links_field :ordered_high_profile_groups, [EditionType]
links_field :ordered_military_personnel, [EditionType]
links_field :ordered_ministers, [EditionType]
links_field :ordered_parent_organisations, [EditionType]
links_field :ordered_related_items_overrides, [EditionType]
links_field :ordered_related_items, [EditionType]
links_field :ordered_roles, [EditionType]
links_field :ordered_special_representatives, [EditionType]
links_field :ordered_successor_organisations, [EditionType]
links_field :ordered_traffic_commissioners, [EditionType]
links_field :organisations, [EditionType]
links_field :original_primary_publishing_organisation, [EditionType]
links_field :pages_part_of_step_nav, [EditionType]
links_field :pages_related_to_step_nav, [EditionType]
links_field :pages_secondary_to_step_nav, [EditionType]
links_field :parent_taxons, [EditionType]
links_field :parent, [EditionType]
links_field :people, [EditionType]
links_field :person, [EditionType]
links_field :policy_areas, [EditionType]
links_field :popular_links, [EditionType]
links_field :primary_publishing_organisation, [EditionType]
links_field :primary_role_person, [EditionType]
links_field :related_guides, [EditionType]
links_field :related_mainstream_content, [EditionType]
links_field :related_policies, [EditionType]
links_field :related_statistical_data_sets, [EditionType]
links_field :related_topics, [EditionType]
links_field :related, [EditionType]
links_field :role, [EditionType]
links_field :roles, [EditionType]
links_field :root_taxon, [EditionType]
links_field :second_level_browse_pages, [EditionType]
links_field :secondary_role_person, [EditionType]
links_field :sections, [EditionType]
links_field :service_manual_topics, [EditionType]
links_field :speaker, [EditionType]
links_field :sponsoring_organisations, [EditionType]
links_field :suggested_ordered_related_items, [EditionType]
links_field :take_part_pages, [EditionType]
links_field :taxonomy_topic_email_override, [EditionType]
links_field :taxons, [EditionType]
links_field :top_level_browse_pages, [EditionType]
links_field :topical_events, [EditionType]
links_field :world_locations, [EditionType]
links_field :worldwide_organisation, [EditionType]
links_field :worldwide_organisations, [EditionType]

reverse_links_field :child_taxons, :parent_taxons, [EditionType]
reverse_links_field :children, :parent, [EditionType]
reverse_links_field :document_collections, :documents, [EditionType]
reverse_links_field :level_one_taxons, :root_taxon, [EditionType]
reverse_links_field :ministers, :ministerial, [EditionType]
reverse_links_field :part_of_step_navs, :pages_part_of_step_nav, [EditionType]
reverse_links_field :policies, :working_groups, [EditionType]
reverse_links_field :related_to_step_navs, :pages_related_to_step_nav, [EditionType]
reverse_links_field :secondary_to_step_navs, :secondary_to_step_navs, [EditionType]

def available_translations
Presenters::Queries::AvailableTranslations.by_edition(object)
.translations.fetch(:available_translations, [])
end
end

class Details < Types::BaseObject
class Image < Types::BaseObject
field :url, String
field :alt_text, String
end

class Logo < Types::BaseObject
field :crest, String
field :formatted_title, String
end

class WhipOrganisation < Types::BaseObject
field :label, String
field :sort_order, Integer
end

## TODO: get all the possible details fields from the content schemas
field :body, String
field :brand, String
field :current, Boolean
field :ended_on, GraphQL::Types::ISO8601DateTime
field :image, Image
field :international_delegations, [EditionType], null: false
field :logo, Logo
field :privy_counsellor, Boolean
field :started_on, GraphQL::Types::ISO8601DateTime
field :supports_historical_accounts, Boolean
field :world_locations, [EditionType], null: false
field :role_payment_type, String
field :seniority, Integer
field :whip_organisation, WhipOrganisation

def body
return object[:body] if object[:body].is_a?(String)

govspeak = object.fetch(:body, [])
.filter { _1[:content_type] == "text/govspeak" }
.map { _1[:content] }
.first

Govspeak::Document.new(govspeak).to_html if govspeak.present?
end
end

field :active, Boolean, null: false
field :analytics_identifier, String
field :base_path, String
field :content_id, ID
field :current, Boolean
field :description, String
field :details, GraphQL::Types::JSON, null: false
field :details, Details
field :document_type, String
field :ended_on, GraphQL::Types::ISO8601DateTime
field :first_published_at, GraphQL::Types::ISO8601DateTime, null: false
field :iso2, String
field :links, EditionLinks, method: :itself
field :locale, String, null: false
field :name, String, null: false
field :phase, String, null: false
field :public_updated_at, GraphQL::Types::ISO8601DateTime, null: false
field :publishing_app, String
Expand All @@ -23,9 +171,13 @@ class WithdrawnNotice < Types::BaseObject
field :rendering_app, String
field :scheduled_publishing_delay_seconds, Int
field :schema_name, String
field :slug, String, null: false
field :started_on, GraphQL::Types::ISO8601DateTime
field :state, String
field :supports_historical_accounts, Boolean
field :title, String, null: false
field :updated_at, GraphQL::Types::ISO8601DateTime
field :web_url, String
field :withdrawn_notice, WithdrawnNotice

def withdrawn_notice
Expand All @@ -43,79 +195,6 @@ def not_stored_in_publishing_api
alias_method :publishing_scheduled_at, :not_stored_in_publishing_api
alias_method :scheduled_publishing_delay_seconds, :not_stored_in_publishing_api

class Translation < Types::BaseObject
field :locale, String
field :base_path, String
end

class GovernmentDetails < Types::BaseObject
field :current, Boolean
end

class GovernmentLink < Types::BaseObject
field :base_path, String
field :content_id, String
field :details, GovernmentDetails
field :title, String
end

class OrganisationLink < Types::BaseObject
field :base_path, String
field :content_id, String
field :title, String
end

class PersonLink < Types::BaseObject
field :base_path, String
field :content_id, String
field :title, String
end

class Taxon < Types::BaseObject
field :base_path, String
field :content_id, String
field :document_type, String
field :phase, String
field :title, String
end

class TaxonLink < Taxon
class TaxonLinks < Types::BaseObject
links_field :parent_taxons, [Taxon]
end

field :links, TaxonLinks, method: :itself
end

class TopicalEventLink < Types::BaseObject
field :base_path, String
field :content_id, String
field :title, String
end

class WorldLocationLink < Types::BaseObject
field :base_path, String
field :content_id, String
field :title, String
end

class EditionLinks < Types::BaseObject
field :available_translations, [Translation]
links_field :government, [GovernmentLink]
links_field :organisations, [OrganisationLink]
links_field :people, [PersonLink]
links_field :taxons, [TaxonLink]
links_field :topical_events, [TopicalEventLink]
links_field :world_locations, [WorldLocationLink]

def available_translations
Presenters::Queries::AvailableTranslations.by_edition(object)
.translations.fetch(:available_translations, [])
end
end

field :links, EditionLinks, method: :itself

private

def presented_edition
Expand Down
12 changes: 0 additions & 12 deletions app/graphql/types/news_article_type.rb

This file was deleted.

5 changes: 2 additions & 3 deletions app/graphql/types/query_type/edition_type_or_subtype.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ class EditionTypeOrSubtype < Types::BaseUnion
EDITION_TYPES = [
Types::EditionType,
Types::MinistersIndexType,
Types::NewsArticleType,
Types::RoleType,
Types::WorldIndexType,
].freeze

possible_types(*EDITION_TYPES)
Expand All @@ -18,6 +15,8 @@ def resolve_type(object, _context)
document_type = object.document_type

matching_edition_subtype = Types::EditionType.descendants.find do |edition_subtype|
next unless edition_subtype.respond_to?(:document_types)

edition_subtype.document_types.include?(document_type)
end

Expand Down
102 changes: 0 additions & 102 deletions app/graphql/types/role_type.rb

This file was deleted.

Loading

0 comments on commit e981e54

Please sign in to comment.