Packages
electric
1.0.0-beta.4
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/plug/delete_shape_plug.ex
defmodule Electric.Plug.DeleteShapePlug do
require Logger
use Plug.Builder, copy_opts_to_assign: :config
alias Electric.Shapes
alias Electric.Plug.ServeShapePlug.Params
import Electric.Plug.Utils, only: [hold_conn_until_stack_ready: 2]
plug :fetch_query_params
plug :put_resp_content_type, "application/json"
plug :hold_conn_until_stack_ready
plug :allow_shape_deletion
plug :validate_query_params
plug :truncate_or_delete_shape
defp allow_shape_deletion(%Plug.Conn{} = conn, _) do
if conn.assigns.config[:allow_shape_deletion] do
conn
else
conn
|> send_resp(404, Jason.encode_to_iodata!(%{status: "Not found"}))
|> halt()
end
end
defp validate_query_params(%Plug.Conn{} = conn, _) do
all_params =
Map.merge(conn.query_params, conn.path_params)
|> Map.take(["table", "handle"])
|> Map.put("offset", "-1")
case Params.validate(all_params, inspector: conn.assigns.config[:inspector]) do
{:ok, params} ->
%{conn | assigns: Map.merge(conn.assigns, params)}
{:error, error_map} ->
conn
|> send_resp(400, Jason.encode_to_iodata!(error_map))
|> halt()
end
end
defp truncate_or_delete_shape(%Plug.Conn{} = conn, _) do
if conn.assigns.handle !== nil do
with :ok <- Shapes.clean_shape(conn.assigns.handle, conn.assigns.config) do
send_resp(conn, 202, "")
end
else
# FIXME: This has a race condition where we accidentally create a snapshot & shape handle, but clean
# it before snapshot is actually made.
with {shape_handle, _} <-
Shapes.get_or_create_shape_handle(conn.assigns.config, conn.assigns.shape_definition),
:ok <- Shapes.clean_shape(shape_handle, conn.assigns.config) do
send_resp(conn, 202, "")
end
end
end
end