Packages
electric
1.4.7
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/shapes/api/delete.ex
defmodule Electric.Shapes.Api.Delete do
@moduledoc false
alias Electric.Shapes
alias Electric.Shapes.Api
alias Electric.Shapes.Api.Request
alias Electric.Shapes.Api.Response
@spec validate_for_delete(Api.t(), %{(atom() | binary()) => term()}) ::
{:ok, Request.t()} | {:error, Response.t()}
def validate_for_delete(api, params) do
if api.allow_shape_deletion do
with {:ok, request} <- validate_params_for_delete(api, params),
{:ok, request} <- load_shape_info_for_delete(request) do
{:ok, request}
end
else
{:error, Response.error(api, "DELETE not allowed", status: 405)}
end
end
defp validate_params_for_delete(api, params) do
with {:ok, request_params} <- Api.Params.validate_for_delete(api, params) do
Api.request_for_params(api, request_params, %Response{
shape_definition: request_params.shape_definition
})
end
end
defp load_shape_info_for_delete(%Request{} = request) do
request
|> get_shape_handle()
|> handle_shape_info_for_delete(request)
end
defp get_shape_handle(%Request{params: %{table: nil, handle: handle}} = _request)
when is_binary(handle) do
nil
end
defp get_shape_handle(%Request{} = request) do
%{params: %{shape_definition: shape}, api: api} = request
case Shapes.fetch_handle_by_shape(api.stack_id, shape) do
{:ok, shape_handle} -> shape_handle
:error -> nil
end
end
# delete request that just has the shape handle
defp handle_shape_info_for_delete(
nil,
%Request{params: %{table: nil, handle: handle}} = request
)
when is_binary(handle) do
if Shapes.has_shape?(request.api.stack_id, handle) do
{:ok,
Map.update!(
%{request | handle: handle},
:response,
&%{&1 | handle: handle}
)}
else
{:error, Response.error(request, "No existing shape found", status: 404)}
end
end
defp handle_shape_info_for_delete(nil, %Request{} = request) do
{:error, Response.error(request, "No existing shape found", status: 404)}
end
# handle in params does not match handle of existing shape matching definition
defp handle_shape_info_for_delete(
active_shape_handle,
%Request{params: %{handle: handle}} = request
)
when not is_nil(handle) and handle != active_shape_handle do
{:error, Response.shape_definition_mismatch(request)}
end
defp handle_shape_info_for_delete(
shape_handle,
%Request{} = request
) do
{:ok,
Map.update!(
%{request | handle: shape_handle},
:response,
&%{&1 | handle: shape_handle}
)}
end
end