Packages
electric
0.8.1
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/tenant/persistence.ex
defmodule Electric.Tenant.Persistence do
@moduledoc """
Helper module to persist information about tenants.
"""
alias Electric.Utils
@doc """
Persists a tenant configuration.
"""
@spec persist_tenant!(String.t(), Keyword.t(), Keyword.t()) :: :ok
def persist_tenant!(tenant_id, conn_opts, opts) do
load_tenants!(opts)
|> Map.put(tenant_id, conn_opts)
|> store_tenants(opts)
end
@doc """
Loads all tenants.
Returns a map of tenant ID to connection options.
"""
@spec load_tenants!(Keyword.t()) :: map()
def load_tenants!(opts) do
%{persistent_kv: kv} =
Keyword.get_lazy(opts, :app_config, fn -> Electric.Application.Configuration.get() end)
case Electric.PersistentKV.get(kv, key(opts)) do
{:ok, tenants} ->
deserialise_tenants(tenants)
{:error, :not_found} ->
%{}
error ->
raise error
end
end
@doc """
Deletes a tenant from storage.
"""
@spec delete_tenant!(String.t(), Keyword.t()) :: :ok
def delete_tenant!(tenant_id, opts) do
load_tenants!(opts)
|> Map.delete(tenant_id)
|> store_tenants(opts)
end
defp store_tenants(tenants, opts) do
%{persistent_kv: kv} =
Keyword.get_lazy(opts, :app_config, fn -> Electric.Application.Configuration.get() end)
serialised_tenants = serialise_tenants(tenants)
Electric.PersistentKV.set(kv, key(opts), serialised_tenants)
end
defp serialise_tenants(tenants) do
tenants
|> Utils.map_values(&tenant_config_keyword_to_map/1)
|> Jason.encode!()
end
defp deserialise_tenants(tenants) do
tenants
|> Jason.decode!()
|> Utils.map_values(&tenant_config_map_to_keyword/1)
end
defp tenant_config_keyword_to_map(conn_opts) do
conn_opts
|> Electric.Utils.deobfuscate_password()
|> Enum.into(%{})
end
defp tenant_config_map_to_keyword(config_map) do
config_map
|> Enum.map(fn {k, v} ->
val =
if k == "sslmode" do
String.to_existing_atom(v)
else
v
end
{String.to_existing_atom(k), val}
end)
|> Electric.Utils.obfuscate_password()
end
defp key(opts) do
electric_instance_id = Access.fetch!(opts, :electric_instance_id)
"tenants_#{electric_instance_id}"
end
end