Class: GdsApi::AssetManager

Inherits:
Base
  • Object
show all
Defined in:
lib/gds_api/asset_manager.rb

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

#asset(id) ⇒ GdsApi::Response?

Fetches an asset given the id

Parameters:

  • id (String)

    The asset identifier (a UUID).

Returns:

  • (GdsApi::Response, nil)

    A response object containing the parsed JSON response. If the asset cannot be found, nil wil be returned.

Raises:



181
182
183
# File 'lib/gds_api/asset_manager.rb', line 181

def asset(id)
  get_json("#{base_url}/assets/#{id}")
end

#create_asset(asset) ⇒ GdsApi::Response

Creates an asset given a hash with one file attribute

Makes a POST request to the asset manager api to create an asset.

The asset must be provided as a Hash with a file attribute that behaves like a File object. The content-type that the asset manager will subsequently serve will be based on the file’s extension (derived from #path). If you supply a content-type via, for example ActionDispatch::Http::UploadedFile or another multipart wrapper, it will be ignored. To provide a content-type directly you must be specify it as a content_type attribute of the hash.

Examples:

Upload a file from disk

response = asset_manager.create_asset(file: File.new('image.jpg', 'r'))
response['id']           #=> "http://asset-manager.dev.gov.uk/assets/576bbc52759b74196b000012"
response['content_type'] #=> "image/jpeg"

Upload a file from a Rails param, (typically a multipart wrapper)

params[:file] #=> #<ActionDispatch::Http::UploadedFile:0x007fc60b43c5c8
                  # @content_type="application/foofle",
                  # @original_filename="cma_case_image.jpg",
                  # @tempfile="spec/support/images/cma_case_image.jpg">

# Though we sent a file with a +content_type+ of 'application/foofle',
# this was ignored
response = asset_manager.create_asset(file: params[:file])
response['content_type'] #=> "image/jpeg"

Parameters:

  • asset (Hash)

    The attributes for the asset to send to the api. Must contain file, which behaves like a File. All other attributes will be ignored.

Returns:

  • (GdsApi::Response)

    The wrapped http response from the api. Behaves both as a Hash and an OpenStruct, and responds to the following:

    :id           the URL of the asset
    :name         the filename of the asset that will be served
    :content_type the content_type of the asset
    :file_url     the URL from which the asset will be served when it has
                  passed a virus scan
    :state        One of 'unscanned', 'clean', or 'infected'. Unless the state is
                  'clean' the asset at the :file_url will 404
    

Raises:



47
48
49
# File 'lib/gds_api/asset_manager.rb', line 47

def create_asset(asset)
  post_multipart("#{base_url}/assets", asset: asset)
end

#create_whitehall_asset(asset) ⇒ GdsApi::Response

Creates a Whitehall asset given a hash with file & legacy_url_path (required) and legacy_etag & legacy_last_modified (optional) attributes

Makes a POST request to the asset manager api to create a Whitehall asset.

The asset must be provided as a Hash with a file attribute that behaves like a File object and a legacy_url_path attribute. The content-type that the asset manager will subsequently serve will be based only on the file’s extension (derived from #path). If you supply a content-type via, for example ActionDispatch::Http::UploadedFile or another multipart wrapper, it will be ignored.

The legacy_url_path attribute is used to specify the public URL path at which the asset should be served by the Asset Manager. This differs from ‘#create_asset` where Asset Manager itself determines the public URL path to be used and returns that to the publishing app in the response. This endpoint is intended to be an interim measure which will help us migrate assets from Whitehall into Asset Manager without needing to change the URLs. The end goal is for Asset Manager to determine the public URL path for all assets including Whitehall assets. At that point this endpoint will become redundant and should be removed.

There may be restrictions on the format of the ‘legacy_url_path`. If the supplied path is not valid, a `GdsApi::HTTPUnprocessableEntity` exception will be raised.

The optional legacy_etag & legacy_last_modified attributes allow the client to specify the values that should be used in the ‘ETag` & `Last-Modified` response headers when the asset is requested via its public URL. They are only intended to be used for migrating existing Whitehall assets to Asset Manager so that we can avoid wholesale cache invalidation. New Whitehall assets should not specify values for these attributes; Asset Manager will generate suitable values.

Note: this endpoint should only be used by the Whitehall Admin app and not by any other publishing apps.

Examples:

Upload a file from disk

response = asset_manager.create_asset(
  file: File.new('image.jpg', 'r'),
  legacy_url_path: '/government/uploads/path/to/image.jpg'
)
response['id']           #=> "http://asset-manager.dev.gov.uk/assets/576bbc52759b74196b000012"
response['content_type'] #=> "image/jpeg"

Upload a file from a Rails param, (typically a multipart wrapper)

params[:file] #=> #<ActionDispatch::Http::UploadedFile:0x007fc60b43c5c8
                  # @content_type="application/foofle",
                  # @original_filename="cma_case_image.jpg",
                  # @tempfile="spec/support/images/cma_case_image.jpg">

# Though we sent a file with a +content_type+ of 'application/foofle',
# this was ignored
response = asset_manager.create_asset(
  file: params[:file]
  legacy_url_path: '/government/uploads/path/to/cma_case_image.jpg'
)
response['content_type'] #=> "image/jpeg"

Parameters:

  • asset (Hash)

    The attributes for the asset to send to the api. Must contain file, which behaves like a File, and legacy_url_path, a String. May contain legacy_etag, a String, and legacy_last_modified, a Time object. All other attributes will be ignored.

Returns:

  • (GdsApi::Response)

    The wrapped http response from the api. Behaves both as a Hash and an OpenStruct, and responds to the following:

    :id           the URL of the asset
    :name         the filename of the asset that will be served
    :content_type the content_type of the asset
    :file_url     the URL from which the asset will be served when it has
                  passed a virus scan
    :state        One of 'unscanned', 'clean', or 'infected'. Unless the state is
                  'clean' the asset at the :file_url will redirect to a
                  placeholder
    

Raises:



127
128
129
# File 'lib/gds_api/asset_manager.rb', line 127

def create_whitehall_asset(asset)
  post_multipart("#{base_url}/whitehall_assets", asset: asset)
end

#delete_asset(id) ⇒ GdsApi::Response

Deletes an asset given an id

Makes a DELETE request to the asset manager api to delete an asset.

Examples:

Delete a file from disk

uuid = '594602dd-75b3-4e6f-b5d1-cacf8c4d4164'
asset_manager.delete_asset(uuid)

Parameters:

  • id (String)

    The asset identifier (a UUID).

Returns:

  • (GdsApi::Response)

    The wrapped http response from the api. Behaves both as a Hash and an OpenStruct, and responds to the following:

    :id           the URL of the asset
    :name         the filename of the asset that will be served
    :content_type the content_type of the asset
    :file_url     the URL from which the asset will be served when it has
                  passed a virus scan
    :state        One of 'unscanned', 'clean', or 'infected'. Unless the state is
                  'clean' the asset at the :file_url will 404
    

Raises:



204
205
206
# File 'lib/gds_api/asset_manager.rb', line 204

def delete_asset(id)
  delete_json("#{base_url}/assets/#{id}")
end

#restore_asset(id) ⇒ GdsApi::Response

Restores an asset given an id

Makes a POST request to the asset manager api to restore an asset.

Examples:

Restore a deleted file

uuid = '594602dd-75b3-4e6f-b5d1-cacf8c4d4164'
asset_manager.restore_asset(uuid)

Parameters:

  • id (String)

    The asset identifier (a UUID).

Returns:

  • (GdsApi::Response)

    The wrapped http response from the api. Behaves both as a Hash and an OpenStruct, and responds to the following:

    :id           the URL of the asset
    :name         the filename of the asset that will be served
    :content_type the content_type of the asset
    :file_url     the URL from which the asset will be served when it has
                  passed a virus scan
    :state        One of 'unscanned', 'clean', or 'infected'. Unless the state is
                  'clean' the asset at the :file_url will 404
    

Raises:



227
228
229
# File 'lib/gds_api/asset_manager.rb', line 227

def restore_asset(id)
  post_json("#{base_url}/assets/#{id}/restore")
end

#update_asset(id, asset) ⇒ GdsApi::Response

Updates an asset given a hash with one file attribute

Makes a PUT request to the asset manager api to update an asset.

The asset must be provided as a Hash with a file attribute that behaves like a File object. The content-type of the file will be based on the files extension unless you specify a content_type attribute of the hash to set it.

Examples:

Update a file from disk

uuid = '594602dd-75b3-4e6f-b5d1-cacf8c4d4164'
asset_manager.update_asset(uuid, file: File.new('image.jpg', 'r'))

Parameters:

  • id (String)

    The asset identifier (a UUID).

  • asset (Hash)

    The attributes for the asset to send to the api. Must contain file, which behaves like a File. All other attributes will be ignored.

Returns:

  • (GdsApi::Response)

    The wrapped http response from the api. Behaves both as a Hash and an OpenStruct, and responds to the following:

    :id           the URL of the asset
    :name         the filename of the asset that will be served
    :content_type the content_type of the asset
    :file_url     the URL from which the asset will be served when it has
                  passed a virus scan
    :state        One of 'unscanned', 'clean', or 'infected'. Unless the state is
                  'clean' the asset at the :file_url will 404
    

Raises:



170
171
172
# File 'lib/gds_api/asset_manager.rb', line 170

def update_asset(id, asset)
  put_multipart("#{base_url}/assets/#{id}", asset: asset)
end

#whitehall_asset(legacy_url_path) ⇒ GdsApi::Response

Fetches a Whitehall asset given the legacy URL path

Parameters:

  • legacy_url_path (String)

    The Whitehall asset identifier.

Returns:

  • (GdsApi::Response)

    A response object containing the parsed JSON response. If the asset cannot be found, GdsApi::HTTPNotFound will be raised.

Raises:



139
140
141
# File 'lib/gds_api/asset_manager.rb', line 139

def whitehall_asset(legacy_url_path)
  get_json("#{base_url}/whitehall_assets/#{uri_encode(legacy_url_path)}")
end