Files
EventHubBack/src/migrations/20260730120000_recurrence_exception_bag.erl
T
aleksey 32d3e7378e
CI / test (push) Failing after 10m4s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been cancelled
CI / deploy-stage (push) Has been cancelled
CI / e2e-stage (push) Has been cancelled
fix(event): store multiple recurrence cancel exceptions
Use bag table for recurrence_exception so canceling several WEEKLY occurrences keeps all exceptions (set key was only master_id).

Refs EventHub/EventHubFront#42
2026-07-30 13:07:13 +03:00

46 lines
1.6 KiB
Erlang

%% @doc recurrence_exception: set → bag, чтобы хранить несколько cancel на один master.
-module('20260730120000_recurrence_exception_bag').
-export([up/0, down/0]).
-include("records.hrl").
up() ->
case lists:member(recurrence_exception, mnesia:system_info(tables)) of
false ->
case mnesia:create_table(recurrence_exception, [
{disc_copies, [node()]},
{type, bag},
{attributes, record_info(fields, recurrence_exception)}
]) of
{atomic, ok} -> ok;
{aborted, {already_exists, recurrence_exception}} -> ok;
{aborted, Reason} -> error({create_table_failed, Reason})
end;
true ->
case mnesia:table_info(recurrence_exception, type) of
bag ->
ok;
_ ->
Rows = mnesia:dirty_match_object(#recurrence_exception{_ = '_'}),
case mnesia:delete_table(recurrence_exception) of
{atomic, ok} -> ok;
{aborted, Reason1} -> error({delete_table_failed, Reason1})
end,
case mnesia:create_table(recurrence_exception, [
{disc_copies, [node()]},
{type, bag},
{attributes, record_info(fields, recurrence_exception)}
]) of
{atomic, ok} -> ok;
{aborted, Reason2} -> error({create_table_failed, Reason2})
end,
lists:foreach(fun(R) -> mnesia:dirty_write(R) end, Rows),
ok
end
end.
down() ->
%% Откат в set потерял бы все кроме одного exception на master — не делаем.
ok.