Class: ActiveStorage::Service::AzureService

Inherits:
ActiveStorage::Service show all
Defined in:
lib/active_storage/service/azure_service.rb

Overview

Wraps the Microsoft Azure Storage Blob Service as a Active Storage service. See ‘ActiveStorage::Service` for the generic API documentation that applies to all services.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ActiveStorage::Service

build, configure

Constructor Details

#initialize(path:, storage_account_name:, storage_access_key:, container:) ⇒ AzureService

Returns a new instance of AzureService.



10
11
12
13
14
15
16
# File 'lib/active_storage/service/azure_service.rb', line 10

def initialize(path:, storage_account_name:, storage_access_key:, container:)
  @client = Azure::Storage::Client.create(storage_account_name: , storage_access_key: storage_access_key)
  @signer = Azure::Storage::Core::Auth::SharedAccessSignature.new(, storage_access_key)
  @blobs = client.blob_client
  @container = container
  @path = path
end

Instance Attribute Details

#blobsObject (readonly)

Returns the value of attribute blobs.



8
9
10
# File 'lib/active_storage/service/azure_service.rb', line 8

def blobs
  @blobs
end

#clientObject (readonly)

Returns the value of attribute client.



8
9
10
# File 'lib/active_storage/service/azure_service.rb', line 8

def client
  @client
end

#containerObject (readonly)

Returns the value of attribute container.



8
9
10
# File 'lib/active_storage/service/azure_service.rb', line 8

def container
  @container
end

#pathObject (readonly)

Returns the value of attribute path.



8
9
10
# File 'lib/active_storage/service/azure_service.rb', line 8

def path
  @path
end

#signerObject (readonly)

Returns the value of attribute signer.



8
9
10
# File 'lib/active_storage/service/azure_service.rb', line 8

def signer
  @signer
end

Instance Method Details

#delete(key) ⇒ Object



41
42
43
44
45
46
47
48
49
# File 'lib/active_storage/service/azure_service.rb', line 41

def delete(key)
  instrument :delete, key do
    begin
      blobs.delete_blob(container, key)
    rescue Azure::Core::Http::HTTPError
      false
    end
  end
end

#download(key) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/active_storage/service/azure_service.rb', line 28

def download(key)
  if block_given?
    instrument :streaming_download, key do
      stream(key, &block)
    end
  else
    instrument :download, key do
      _, io = blobs.get_blob(container, key)
      io.force_encoding(Encoding::BINARY)
    end
  end
end

#exist?(key) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
54
55
56
57
# File 'lib/active_storage/service/azure_service.rb', line 51

def exist?(key)
  instrument :exist, key do |payload|
    answer = blob_for(key).present?
    payload[:exist] = answer
    answer
  end
end

#headers_for_direct_upload(key, content_type:, checksum:) ⇒ Object



83
84
85
# File 'lib/active_storage/service/azure_service.rb', line 83

def headers_for_direct_upload(key, content_type:, checksum:, **)
  { "Content-Type" => content_type, "Content-MD5" => checksum, "x-ms-blob-type" => "BlockBlob" }
end

#upload(key, io, checksum: nil) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/active_storage/service/azure_service.rb', line 18

def upload(key, io, checksum: nil)
  instrument :upload, key, checksum: checksum do
    begin
      blobs.create_block_blob(container, key, io, content_md5: checksum)
    rescue Azure::Core::Http::HTTPError => e
      raise ActiveStorage::IntegrityError
    end
  end
end

#url(key, expires_in:, disposition:, filename:) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/active_storage/service/azure_service.rb', line 59

def url(key, expires_in:, disposition:, filename:)
  instrument :url, key do |payload|
    base_url = url_for(key)
    generated_url = signer.signed_uri(URI(base_url), false, permissions: "r",
      expiry: format_expiry(expires_in), content_disposition: "#{disposition}; filename=\"#{filename}\"").to_s

    payload[:url] = generated_url

    generated_url
  end
end

#url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/active_storage/service/azure_service.rb', line 71

def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:)
  instrument :url, key do |payload|
    base_url = url_for(key)
    generated_url = signer.signed_uri(URI(base_url), false, permissions: "rw",
      expiry: format_expiry(expires_in)).to_s

    payload[:url] = generated_url

    generated_url
  end
end