Module: Supabase::Postgrest::RequestPrep

Defined in:
lib/supabase/postgrest/request_builder.rb

Overview

Internal: prepares default headers + params + method for the four CRUD verbs.

Class Method Summary collapse

Class Method Details

.cleaned_columns(columns) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/supabase/postgrest/request_builder.rb', line 59

def cleaned_columns(columns)
  quoted = false
  columns.map do |column|
    column.to_s.each_char.each_with_object(+"") do |char, out|
      if char =~ /\s/ && !quoted
        next
      end
      quoted = !quoted if char == '"'
      out << char
    end
  end.join(",")
end

.pre_delete(count:, returning:) ⇒ Object



112
113
114
115
116
# File 'lib/supabase/postgrest/request_builder.rb', line 112

def pre_delete(count:, returning:)
  prefer = ["return=#{returning}"]
  prefer << "count=#{count}" if count
  [Types::RequestMethod::DELETE, {}, { "Prefer" => prefer.join(",") }, {}]
end

.pre_insert(json, count:, returning:, upsert:, default_to_null: true) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/supabase/postgrest/request_builder.rb', line 80

def pre_insert(json, count:, returning:, upsert:, default_to_null: true)
  prefer = ["return=#{returning}"]
  prefer << "count=#{count}" if count
  prefer << "resolution=merge-duplicates" if upsert
  prefer << "missing=default" unless default_to_null

  headers = { "Prefer" => prefer.join(",") }
  params = {}
  params["columns"] = unique_columns(json) if json.is_a?(Array) && !json.empty?
  [Types::RequestMethod::POST, params, headers, json]
end

.pre_select(*columns, count: nil, head: nil) ⇒ Object



72
73
74
75
76
77
78
# File 'lib/supabase/postgrest/request_builder.rb', line 72

def pre_select(*columns, count: nil, head: nil)
  method = head ? Types::RequestMethod::HEAD : Types::RequestMethod::GET
  cleaned = cleaned_columns(columns.empty? ? %w[*] : columns)
  params = { "select" => cleaned }
  headers = count ? { "Prefer" => "count=#{count}" } : {}
  [method, params, headers, {}]
end

.pre_update(json, count:, returning:) ⇒ Object



106
107
108
109
110
# File 'lib/supabase/postgrest/request_builder.rb', line 106

def pre_update(json, count:, returning:)
  prefer = ["return=#{returning}"]
  prefer << "count=#{count}" if count
  [Types::RequestMethod::PATCH, {}, { "Prefer" => prefer.join(",") }, json]
end

.pre_upsert(json, count:, returning:, ignore_duplicates:, on_conflict: "", default_to_null: true) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/supabase/postgrest/request_builder.rb', line 92

def pre_upsert(json, count:, returning:, ignore_duplicates:, on_conflict: "", default_to_null: true)
  prefer = ["return=#{returning}"]
  prefer << "count=#{count}" if count
  resolution = ignore_duplicates ? "ignore" : "merge"
  prefer << "resolution=#{resolution}-duplicates"
  prefer << "missing=default" unless default_to_null

  headers = { "Prefer" => prefer.join(",") }
  params = {}
  params["on_conflict"] = on_conflict if on_conflict && !on_conflict.empty?
  params["columns"] = unique_columns(json) if json.is_a?(Array) && !json.empty?
  [Types::RequestMethod::POST, params, headers, json]
end

.unique_columns(rows) ⇒ Object



52
53
54
55
56
57
# File 'lib/supabase/postgrest/request_builder.rb', line 52

def unique_columns(rows)
  keys = rows.each_with_object([]) do |row, acc|
    row.each_key { |k| acc << k unless acc.include?(k) }
  end
  keys.map { |k| %("#{k}") }.join(",")
end