Class: GdsApi::PublishingApi

Inherits:
Base
  • Object
show all
Defined in:
lib/gds_api/publishing_api.rb,
lib/gds_api/publishing_api/special_route_publisher.rb

Overview

Adapter for the Publishing API.

Defined Under Namespace

Classes: NoLiveVersion, SpecialRoutePublisher

Instance Attribute Summary

Attributes inherited from Base

#options

Instance Method Summary collapse

Methods inherited from Base

#client, #create_client, #get_list, #initialize, #url_for_slug

Constructor Details

This class inherits a constructor from GdsApi::Base

Instance Method Details

#destroy_intent(base_path) ⇒ Object

Delete a publishing intent for a base_path.



484
485
486
487
488
# File 'lib/gds_api/publishing_api.rb', line 484

def destroy_intent(base_path)
  delete_json(intent_url(base_path))
rescue GdsApi::HTTPNotFound => e
  e
end

#discard_draft(content_id, options = {}) ⇒ Object

Discard a draft

Deletes the draft content item.

Options Hash (options):

  • locale (String)

    The language, defaults to ‘en’ in publishing-api.

  • previous_version (Integer)

    used to ensure the request is discarding the latest lock version of the draft

See Also:



195
196
197
198
199
200
201
# File 'lib/gds_api/publishing_api.rb', line 195

def discard_draft(content_id, options = {})
  optional_keys = %i[locale previous_version]

  params = merge_optional_keys({}, options, optional_keys)

  post_json(discard_url(content_id), params)
end

#get_content(content_id, params = {}) ⇒ GdsApi::Response

Return a content item

Raises exception if the item doesn’t exist.

Options Hash (params):

  • locale (String)

    The language, defaults to ‘en’ in publishing-api.

Raises:

See Also:



35
36
37
# File 'lib/gds_api/publishing_api.rb', line 35

def get_content(content_id, params = {})
  get_json(content_url(content_id, params))
end

#get_content_items(params) ⇒ Object

Get a list of content items from the Publishing API.

The only required key in the params hash is ‘document_type`. These will be used to filter down the content items being returned by the API. Other allowed options can be seen from the link below.

Examples:


publishing_api.get_content_items(
  document_type: 'taxon',
  q: 'Driving',
  page: 1,
  per_page: 50,
  publishing_app: 'content-tagger',
  fields: ['title', 'description', 'public_updated_at'],
  locale: 'en',
  order: '-public_updated_at'
)

See Also:



335
336
337
338
# File 'lib/gds_api/publishing_api.rb', line 335

def get_content_items(params)
  query = query_string(params)
  get_json("#{endpoint}/v2/content#{query}")
end

#get_content_items_enum(params) ⇒ Enumerator

Returns an Enumerator of content items for the provided query string parameters.



348
349
350
351
352
353
354
355
356
357
358
359
360
# File 'lib/gds_api/publishing_api.rb', line 348

def get_content_items_enum(params)
  Enumerator.new do |yielder|
    (1..Float::INFINITY).each do |index|
      merged_params = params.merge(page: index)
      page = get_content_items(merged_params).to_h
      results = page.fetch("results", [])
      results.each do |result|
        yielder << result
      end
      break if page.fetch("pages") <= index
    end
  end
end

#get_editions(params = {}) ⇒ GdsApi::Response

Returns a paginated list of editions for the provided query string parameters.



390
391
392
# File 'lib/gds_api/publishing_api.rb', line 390

def get_editions(params = {})
  get_json(get_editions_url(params))
end

Get expanded links

Return the expanded links of the item.

Examples:


publishing_api.get_expanded_links("8157589b-65e2-4df6-92ba-2c91d80006c0", with_drafts: false).to_h

#=> {
  "generated" => "2017-08-01T10:42:49Z",
  "expanded_links" => {
    "organisations" => [
      {
        "content_id" => "21aa83a2-a47f-4189-a252-b02f8c322012",
        ... (and more attributes)
      }
    ]
  }
}

See Also:



275
276
277
278
279
280
281
282
283
# File 'lib/gds_api/publishing_api.rb', line 275

def get_expanded_links(content_id, locale: nil, with_drafts: true, generate: false)
  params = {}
  params[:with_drafts] = "false" unless with_drafts
  params[:generate] = "true" if generate
  params[:locale] = locale if locale
  query = query_string(params)
  validate_content_id(content_id)
  get_json("#{endpoint}/v2/expanded-links/#{content_id}#{query}")
end

#get_linkables(document_type: nil) ⇒ Object

FIXME: Add documentation



365
366
367
368
369
370
371
# File 'lib/gds_api/publishing_api.rb', line 365

def get_linkables(document_type: nil)
  if document_type.nil?
    raise ArgumentError, "Please provide a `document_type`"
  end

  get_json("#{endpoint}/v2/linkables?document_type=#{document_type}")
end

#get_linked_items(content_id, params = {}) ⇒ Object

FIXME: Add documentation



376
377
378
379
380
# File 'lib/gds_api/publishing_api.rb', line 376

def get_linked_items(content_id, params = {})
  query = query_string(params)
  validate_content_id(content_id)
  get_json("#{endpoint}/v2/linked/#{content_id}#{query}")
end

Get the link set for the given content_id.

Given a Content ID, it fetchs the existing link set and their version.

Examples:


publishing_api.get_links("a-content-id")
# => {
  "content_id" => "a-content-id",
  "links" => [
    "organisation" => "organisation-content-id",
    "document_collection" => "document-collection-content-id"
  ],
  "version" => 17
}

See Also:



224
225
226
# File 'lib/gds_api/publishing_api.rb', line 224

def get_links(content_id)
  get_json(links_url(content_id))
end

Returns an array of changes to links.

The link changes can be filtered by link_type, source content_id, target content_id and user. A maximum of 250 changes will be returned.

Examples:


publishing_api.get_links_changes(
  link_types: ['taxons'],
  target_content_ids: ['a544d48b-1e9e-47fb-b427-7a987c658c14']
)


245
246
247
# File 'lib/gds_api/publishing_api.rb', line 245

def get_links_changes(params)
  get_json(links_changes_url(params))
end

Returns a mapping of content_ids => links hashes

Examples:


publishing_api.get_links_for_content_ids([
  "e1067450-7d13-45ff-ada4-5e3dd4025fb7",
  "72ed754c-4c82-415f-914a-ab6760454cb4"
])

#=> {
  "e1067450-7d13-45ff-ada4-5e3dd4025fb7" => {
    links: {
      taxons: ["13bba81c-b2b1-4b13-a3de-b24748977198"]},
      ... (and more attributes)
    version: 10},
  "72ed754c-4c82-415f-914a-ab6760454cb4" => { ..etc }
}


437
438
439
# File 'lib/gds_api/publishing_api.rb', line 437

def get_links_for_content_ids(content_ids)
  post_json("#{endpoint}/v2/links/by-content-id", content_ids:).to_hash
end

#get_live_content(content_id, locale = "en") ⇒ GdsApi::Response

Return a live content item, i.e. content that has a state of “published” or “unpublished”

Raises exception if the item doesn’t exist.

Options Hash (locale):

  • locale (String)

    The language, defaults to ‘en’ in publishing-api.

Raises:

See Also:



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/gds_api/publishing_api.rb', line 50

def get_live_content(content_id, locale = "en")
  content_item = get_content(content_id, locale:)

  live_states = %w[published unpublished]
  return content_item if live_states.include?(content_item.to_h["publication_state"])

  live_version_number = content_item["state_history"].find { |_, v| live_states.include?(v) }&.first
  raise NoLiveVersion, "No live version exists for content_id: #{content_id}" unless live_version_number

  get_content(content_id, locale:, version: live_version_number)
end

#get_paged_editions(params = {}) ⇒ Enumerator

Returns an Enumerator of Response objects for each page of results of editions for the provided query string parameters.



402
403
404
405
406
407
408
409
410
411
412
413
# File 'lib/gds_api/publishing_api.rb', line 402

def get_paged_editions(params = {})
  Enumerator.new do |yielder|
    next_link = get_editions_url(params)
    while next_link
      yielder.yield begin
        response = get_json(next_link)
      end
      next_link_info = response["links"].select { |link| link["rel"] == "next" }.first
      next_link = next_link_info && next_link_info["href"]
    end
  end
end

#get_schema(schema_name) ⇒ GdsApi::Response

Get a content schema by name

Examples:


publishing_api.get_schema("email_address")
  # => {
    "email_address" => {
        "type": "email_address",
        "required": ["email"],
        "properties": {
          "email": { "type" => "string" },
        },
      }
  }

Raises:

See Also:



533
534
535
# File 'lib/gds_api/publishing_api.rb', line 533

def get_schema(schema_name)
  get_json("#{endpoint}/v2/schemas/#{schema_name}").to_hash
end

#get_schemasGdsApi::Response

Get all schemas

Examples:


publishing_api.get_schemas()
  # => {
    "email_address" => {
        "type": "email_address",
        "required": ["email"],
        "properties": {
          "email": { "type" => "string" },
        },
      }
  }

See Also:



508
509
510
# File 'lib/gds_api/publishing_api.rb', line 508

def get_schemas
  get_json("#{endpoint}/v2/schemas").to_hash
end

#lookup_content_id(base_path:, exclude_document_types: nil, exclude_unpublishing_types: nil, with_drafts: false) ⇒ UUID

Find the content_id for a base_path.

Convenience method if you only need to look up one content_id for a base_path. For multiple base_paths, use GdsApi::PublishingApiV2#lookup_content_ids.

Examples:


publishing_api.lookup_content_id(base_path: '/foo')
# => "51ac4247-fd92-470a-a207-6b852a97f2db"

See Also:



102
103
104
105
106
107
108
109
110
# File 'lib/gds_api/publishing_api.rb', line 102

def lookup_content_id(base_path:, exclude_document_types: nil, exclude_unpublishing_types: nil, with_drafts: false)
  lookups = lookup_content_ids(
    base_paths: [base_path],
    exclude_document_types:,
    exclude_unpublishing_types:,
    with_drafts:,
  )
  lookups[base_path]
end

#lookup_content_ids(base_paths:, exclude_document_types: nil, exclude_unpublishing_types: nil, with_drafts: false) ⇒ Hash

Find the content_ids for a list of base_paths.

Examples:


publishing_api.lookup_content_ids(base_paths: ['/foo', '/bar'])
# => { "/foo" => "51ac4247-fd92-470a-a207-6b852a97f2db", "/bar" => "261bd281-f16c-48d5-82d2-9544019ad9ca" }

See Also:



75
76
77
78
79
80
81
82
# File 'lib/gds_api/publishing_api.rb', line 75

def lookup_content_ids(base_paths:, exclude_document_types: nil, exclude_unpublishing_types: nil, with_drafts: false)
  options = { base_paths: }
  options[:exclude_document_types] = exclude_document_types if exclude_document_types
  options[:exclude_unpublishing_types] = exclude_unpublishing_types if exclude_unpublishing_types
  options[:with_drafts] = with_drafts if with_drafts
  response = post_json("#{endpoint}/lookup-by-base-path", options)
  response.to_hash
end

Patch the links of a content item

Examples:


publishing_api.patch_links(
  '86963c13-1f57-4005-b119-e7cf3cb92ecf',
  links: {
    topics: ['d6e1527d-d0c0-40d5-9603-b9f3e6866b8a'],
    mainstream_browse_pages: ['d6e1527d-d0c0-40d5-9603-b9f3e6866b8a'],
  },
  previous_version: 10,
  bulk_publishing: true
)

Options Hash (params):

  • links (Hash)

    A “links hash”

  • previous_version (Integer)

    The previous version (returned by ‘get_links`). If this version is not the current version, the publishing-api will reject the change and return 409 Conflict. (optional)

  • bulk_publishing (Boolean)

    Set to true to indicate that this is part of a mass-republish. Allows the publishing-api to prioritise human-initiated publishing (optional, default false)

See Also:



305
306
307
308
309
310
311
312
313
# File 'lib/gds_api/publishing_api.rb', line 305

def patch_links(content_id, params)
  payload = {
    links: params.fetch(:links),
  }

  payload = merge_optional_keys(payload, params, %i[previous_version bulk_publishing])

  patch_json(links_url(content_id), payload)
end

#publish(content_id, update_type = nil, options = {}) ⇒ Object

Publish a content item

The publishing-api will “publish” a draft item, so that it will be visible on the public site.

Options Hash (options):

  • locale (String)

    The language, defaults to ‘en’ in publishing-api.

See Also:



123
124
125
126
127
128
129
130
131
132
133
# File 'lib/gds_api/publishing_api.rb', line 123

def publish(content_id, update_type = nil, options = {})
  params = {
    update_type:,
  }

  optional_keys = %i[locale previous_version]

  params = merge_optional_keys(params, options, optional_keys)

  post_json(publish_url(content_id), params)
end

#put_content(content_id, payload) ⇒ Object

Put a content item



19
20
21
# File 'lib/gds_api/publishing_api.rb', line 19

def put_content(content_id, payload)
  put_json(content_url(content_id), payload)
end

#put_intent(base_path, payload) ⇒ Object

Create a publishing intent for a base_path.

publishing_api.put_intent(

'/some/base_path',
{
  publish_time: '2024-03-15T09:00:00.000+00:00',
  publishing_app: 'content-publisher',
  rendering_app: 'government-frontend',
}

)



475
476
477
# File 'lib/gds_api/publishing_api.rb', line 475

def put_intent(base_path, payload)
  put_json(intent_url(base_path), payload)
end

#put_path(base_path, payload) ⇒ Object

Reserves a path for a publishing application

Returns success or failure only.

Options Hash (payload):

  • publishing_app (Hash)

    The publishing application, like ‘content-tagger`

See Also:



449
450
451
452
# File 'lib/gds_api/publishing_api.rb', line 449

def put_path(base_path, payload)
  url = "#{endpoint}/paths#{base_path}"
  put_json(url, payload)
end

#republish(content_id, options = {}) ⇒ Object

Republish a content item

The publishing-api will “republish” a live edition. This can be used to remove an unpublishing or to re-send a published edition downstream

Options Hash (options):

  • locale (String)

    The language, defaults to ‘en’ in publishing-api.

See Also:

  • ...


145
146
147
148
149
150
151
# File 'lib/gds_api/publishing_api.rb', line 145

def republish(content_id, options = {})
  optional_keys = %i[locale previous_version]

  params = merge_optional_keys({}, options, optional_keys)

  post_json(republish_url(content_id), params)
end

#unpublish(content_id, type:, explanation: nil, alternative_path: nil, discard_drafts: false, allow_draft: false, previous_version: nil, locale: nil, unpublished_at: nil, redirects: nil) ⇒ Object

Unpublish a content item

The publishing API will “unpublish” a live item, to remove it from the public site, or update an existing unpublishing.



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/gds_api/publishing_api.rb', line 169

def unpublish(content_id, type:, explanation: nil, alternative_path: nil, discard_drafts: false, allow_draft: false, previous_version: nil, locale: nil, unpublished_at: nil, redirects: nil)
  params = {
    type:,
  }

  params[:explanation] = explanation if explanation
  params[:alternative_path] = alternative_path if alternative_path
  params[:previous_version] = previous_version if previous_version
  params[:discard_drafts] = discard_drafts if discard_drafts
  params[:allow_draft] = allow_draft if allow_draft
  params[:locale] = locale if locale
  params[:unpublished_at] = unpublished_at.utc.iso8601 if unpublished_at
  params[:redirects] = redirects if redirects

  post_json(unpublish_url(content_id), params)
end

#unreserve_path(base_path, publishing_app) ⇒ Object



454
455
456
457
# File 'lib/gds_api/publishing_api.rb', line 454

def unreserve_path(base_path, publishing_app)
  payload = { publishing_app: }
  delete_json(unreserve_url(base_path), payload)
end