Class: Supabase::Storage::AnalyticsClient

Inherits:
Object
  • Object
show all
Includes:
Request
Defined in:
lib/supabase/storage/analytics.rb

Overview

Analytics (iceberg) bucket management. Mirrors storage3’s ‘SyncStorageAnalyticsClient` — talks to `storage_url/iceberg/bucket`.

client.analytics.create("my-iceberg")
client.analytics.list(limit: 50, sort_column: "name", sort_order: "asc")
client.analytics.delete("my-iceberg")

Instance Method Summary collapse

Constructor Details

#initialize(session, base_url, headers) ⇒ AnalyticsClient

Returns a new instance of AnalyticsClient.

Parameters:

  • session (Faraday::Connection)
  • base_url (String)

    storage REST root (“…/storage/v1/”)

  • headers (Hash)


20
21
22
23
24
25
# File 'lib/supabase/storage/analytics.rb', line 20

def initialize(session, base_url, headers)
  @session  = session
  normalized = base_url.end_with?("/") ? base_url : "#{base_url}/"
  @base_url = "#{normalized}iceberg/"
  @headers  = headers
end

Instance Method Details

#catalog(catalog_name, access_key_id:, secret_access_key:) ⇒ Object

Python returns a ‘pyiceberg.RestCatalog`. There is no equivalent Iceberg client in the Ruby ecosystem, so we return the catalog configuration as a plain Hash that a downstream iceberg-ruby (when one exists) can consume. Keeping the public method present mirrors the API surface.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/supabase/storage/analytics.rb', line 51

def catalog(catalog_name, access_key_id:, secret_access_key:)
  service_key = @headers["apiKey"]
  raise Errors::StorageApiError.new("apiKey must be passed in the headers.") if service_key.to_s.empty?

  s3_endpoint = @base_url.sub(%r{iceberg/?\z}, "s3")
  {
    "name"                       => catalog_name,
    "warehouse"                  => catalog_name,
    "uri"                        => @base_url,
    "token"                      => service_key,
    "s3.endpoint"                => s3_endpoint,
    "s3.access-key-id"           => access_key_id,
    "s3.secret-access-key"       => secret_access_key,
    "s3.force-virtual-addressing" => "False"
  }
end

#create(bucket_name) ⇒ Object



27
28
29
30
# File 'lib/supabase/storage/analytics.rb', line 27

def create(bucket_name)
  body = _request(:post, ["bucket"], json: { "name" => bucket_name })
  Types::AnalyticsBucket.from_hash(body)
end

#delete(bucket_name) ⇒ Object



42
43
44
45
# File 'lib/supabase/storage/analytics.rb', line 42

def delete(bucket_name)
  body = _request(:delete, ["bucket", bucket_name])
  Types::AnalyticsBucketDeleteResponse.from_hash(body)
end

#list(limit: nil, offset: nil, sort_column: nil, sort_order: nil, search: nil) ⇒ Object

Mirrors py’s optional sort/search/pagination params. Nil values are dropped server-side; we also drop them client-side so the URL stays clean.



34
35
36
37
38
39
40
# File 'lib/supabase/storage/analytics.rb', line 34

def list(limit: nil, offset: nil, sort_column: nil, sort_order: nil, search: nil)
  params = { "limit" => limit, "offset" => offset,
             "sort_column" => sort_column, "sort_order" => sort_order,
             "search" => search }.compact
  body = _request(:get, ["bucket"], query: params.empty? ? nil : params)
  Array(body).map { |b| Types::AnalyticsBucket.from_hash(b) }
end