feat(share): calendar_share invite/ACL for personal and commercial.
CI / test (push) Failing after 6m37s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been skipped
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped

Co-editor and deputy grants with mirror_to_default; personal out of search; list owned+shared. Refs EventHub/EventHubBack#73
This commit is contained in:
2026-08-15 23:20:11 +03:00
parent 00bf72e4d1
commit 331000a464
17 changed files with 1413 additions and 28 deletions
@@ -0,0 +1,88 @@
%% @doc calendar_share: id PK + mirror_to_default; create calendar_share_invite.
-module('20260815220000_calendar_share_invite').
-export([up/0, down/0]).
-include("records.hrl").
up() ->
transform_calendar_share(),
ensure_index(calendar_share, calendar_id),
ensure_index(calendar_share, user_id),
ensure_table(calendar_share_invite, record_info(fields, calendar_share_invite)),
ensure_index(calendar_share_invite, calendar_id),
ensure_index(calendar_share_invite, invitee_user_id),
ensure_index(calendar_share_invite, invitee_email),
ensure_index(calendar_share_invite, token),
ensure_index(calendar_share_invite, status),
ok.
down() ->
_ = mnesia:delete_table(calendar_share_invite),
ok.
transform_calendar_share() ->
case lists:member(calendar_share, mnesia:system_info(tables)) of
false ->
ensure_table(calendar_share, record_info(fields, calendar_share));
true ->
Attrs = mnesia:table_info(calendar_share, attributes),
case Attrs =:= record_info(fields, calendar_share) of
true ->
ok;
false ->
Fun = fun(Rec) ->
case tuple_to_list(Rec) of
[calendar_share, CalId, UserId, Rights] ->
#calendar_share{
id = infra_utils:generate_id(16),
calendar_id = CalId,
user_id = UserId,
rights = Rights,
mirror_to_default = false
};
[calendar_share, Id, CalId, UserId, Rights] ->
#calendar_share{
id = Id,
calendar_id = CalId,
user_id = UserId,
rights = Rights,
mirror_to_default = false
};
_ ->
Rec
end
end,
case mnesia:transform_table(calendar_share, Fun,
record_info(fields, calendar_share)) of
{atomic, ok} -> ok;
{aborted, Reason} -> error({transform_calendar_share_failed, Reason})
end
end
end.
ensure_table(Table, Attrs) ->
case lists:member(Table, mnesia:system_info(tables)) of
true ->
ok;
false ->
case mnesia:create_table(Table, [{disc_copies, [node()]}, {attributes, Attrs}]) of
{atomic, ok} -> ok;
{aborted, {already_exists, Table}} -> ok;
{aborted, Reason} -> error({create_table_failed, Table, Reason})
end
end.
ensure_index(Table, Attr) ->
case lists:member(Table, mnesia:system_info(tables)) of
false ->
ok;
true ->
case mnesia:add_table_index(Table, Attr) of
{atomic, ok} -> ok;
{aborted, {already_exists, Table, _Pos}} -> ok;
{aborted, {already_exists, Table, Attr}} -> ok;
{aborted, {already_exists, _}} -> ok;
{aborted, Reason} -> error({add_index_failed, Table, Attr, Reason})
end
end.