-module(lightspeed@data@migration).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/data/migration.gleam").
-export([small_reference_plan/0, medium_reference_plan/0, valid/1, step_label/1, mode_label/1, size_label/1, signature/1, name/1, steps/1, rollback_steps/1, adapters/1]).
-export_type([size_profile/0, deployment_mode/0, step/0, reference_plan/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" Reference migration plans for Phoenix/LiveView to Lightspeed adoption.\n").
-type size_profile() :: small | medium.
-type deployment_mode() :: legacy_phoenix | mixed_runtime | lightspeed_primary.
-type step() :: snapshot_legacy_data |
introduce_scoped_repository |
enable_dual_write_bridge |
verify_tenant_parity |
shift_read_path_to_lightspeed |
shift_write_path_to_lightspeed |
enable_lightspeed_runtime |
rollback_to_legacy.
-type reference_plan() :: {reference_plan,
binary(),
size_profile(),
deployment_mode(),
list(lightspeed@data@repository:adapter()),
list(step()),
list(step())}.
-file("src/lightspeed/data/migration.gleam", 44).
?DOC(" Small-app reference migration.\n").
-spec small_reference_plan() -> reference_plan().
small_reference_plan() ->
{reference_plan,
<<"small-phx-liveview-to-lightspeed"/utf8>>,
small,
mixed_runtime,
[{elixir_bridge, <<"MySmallApp.Repo"/utf8>>}, gleam_in_memory],
[snapshot_legacy_data,
introduce_scoped_repository,
enable_dual_write_bridge,
verify_tenant_parity,
shift_read_path_to_lightspeed,
enable_lightspeed_runtime],
[rollback_to_legacy]}.
-file("src/lightspeed/data/migration.gleam", 66).
?DOC(" Medium-app reference migration.\n").
-spec medium_reference_plan() -> reference_plan().
medium_reference_plan() ->
{reference_plan,
<<"medium-phx-liveview-to-lightspeed"/utf8>>,
medium,
mixed_runtime,
[{mixed_bridge,
<<"MyMediumApp.RepoRead"/utf8>>,
<<"MyMediumApp.RepoWrite"/utf8>>},
{elixir_bridge, <<"MyMediumApp.Repo"/utf8>>}],
[snapshot_legacy_data,
introduce_scoped_repository,
enable_dual_write_bridge,
verify_tenant_parity,
shift_read_path_to_lightspeed,
shift_write_path_to_lightspeed,
enable_lightspeed_runtime],
[rollback_to_legacy]}.
-file("src/lightspeed/data/migration.gleam", 168).
-spec has_step(list(step()), step()) -> boolean().
has_step(Steps, Expected) ->
case Steps of
[] ->
false;
[Step | Rest] ->
case Step =:= Expected of
true ->
true;
false ->
has_step(Rest, Expected)
end
end.
-file("src/lightspeed/data/migration.gleam", 92).
?DOC(" Validate migration plan essentials.\n").
-spec valid(reference_plan()) -> boolean().
valid(Plan) ->
((((has_step(erlang:element(6, Plan), snapshot_legacy_data) andalso has_step(
erlang:element(6, Plan),
introduce_scoped_repository
))
andalso has_step(erlang:element(6, Plan), enable_dual_write_bridge))
andalso has_step(erlang:element(6, Plan), verify_tenant_parity))
andalso has_step(erlang:element(6, Plan), enable_lightspeed_runtime))
andalso has_step(erlang:element(7, Plan), rollback_to_legacy).
-file("src/lightspeed/data/migration.gleam", 140).
?DOC(" Step label.\n").
-spec step_label(step()) -> binary().
step_label(Step) ->
case Step of
snapshot_legacy_data ->
<<"snapshot_legacy_data"/utf8>>;
introduce_scoped_repository ->
<<"introduce_scoped_repository"/utf8>>;
enable_dual_write_bridge ->
<<"enable_dual_write_bridge"/utf8>>;
verify_tenant_parity ->
<<"verify_tenant_parity"/utf8>>;
shift_read_path_to_lightspeed ->
<<"shift_read_path_to_lightspeed"/utf8>>;
shift_write_path_to_lightspeed ->
<<"shift_write_path_to_lightspeed"/utf8>>;
enable_lightspeed_runtime ->
<<"enable_lightspeed_runtime"/utf8>>;
rollback_to_legacy ->
<<"rollback_to_legacy"/utf8>>
end.
-file("src/lightspeed/data/migration.gleam", 179).
-spec join_with(binary(), list(binary())) -> binary().
join_with(Separator, Values) ->
case Values of
[] ->
<<""/utf8>>;
[Value] ->
Value;
[Value@1 | Rest] ->
<<<<Value@1/binary, Separator/binary>>/binary,
(join_with(Separator, Rest))/binary>>
end.
-file("src/lightspeed/data/migration.gleam", 131).
?DOC(" Plan deployment-mode label.\n").
-spec mode_label(deployment_mode()) -> binary().
mode_label(Mode) ->
case Mode of
legacy_phoenix ->
<<"legacy_phoenix"/utf8>>;
mixed_runtime ->
<<"mixed_runtime"/utf8>>;
lightspeed_primary ->
<<"lightspeed_primary"/utf8>>
end.
-file("src/lightspeed/data/migration.gleam", 123).
?DOC(" Plan size label.\n").
-spec size_label(size_profile()) -> binary().
size_label(Size) ->
case Size of
small ->
<<"small"/utf8>>;
medium ->
<<"medium"/utf8>>
end.
-file("src/lightspeed/data/migration.gleam", 102).
?DOC(" Stable plan signature for fixtures and docs.\n").
-spec signature(reference_plan()) -> binary().
signature(Plan) ->
<<<<<<<<<<<<<<<<<<<<<<"m19:"/utf8,
(size_label(
erlang:element(3, Plan)
))/binary>>/binary,
":"/utf8>>/binary,
(mode_label(erlang:element(4, Plan)))/binary>>/binary,
"|name="/utf8>>/binary,
(erlang:element(2, Plan))/binary>>/binary,
"|adapters="/utf8>>/binary,
(join_with(
<<","/utf8>>,
gleam@list:map(
erlang:element(5, Plan),
fun lightspeed@data@repository:adapter_label/1
)
))/binary>>/binary,
"|steps="/utf8>>/binary,
(join_with(
<<","/utf8>>,
gleam@list:map(erlang:element(6, Plan), fun step_label/1)
))/binary>>/binary,
"|rollback="/utf8>>/binary,
(join_with(
<<","/utf8>>,
gleam@list:map(erlang:element(7, Plan), fun step_label/1)
))/binary>>.
-file("src/lightspeed/data/migration.gleam", 118).
?DOC(" Plan name.\n").
-spec name(reference_plan()) -> binary().
name(Plan) ->
erlang:element(2, Plan).
-file("src/lightspeed/data/migration.gleam", 154).
?DOC(" Plan steps in execution order.\n").
-spec steps(reference_plan()) -> list(step()).
steps(Plan) ->
erlang:element(6, Plan).
-file("src/lightspeed/data/migration.gleam", 159).
?DOC(" Rollback steps in execution order.\n").
-spec rollback_steps(reference_plan()) -> list(step()).
rollback_steps(Plan) ->
erlang:element(7, Plan).
-file("src/lightspeed/data/migration.gleam", 164).
?DOC(" Adapters participating in the plan.\n").
-spec adapters(reference_plan()) -> list(lightspeed@data@repository:adapter()).
adapters(Plan) ->
erlang:element(5, Plan).