feat(share): calendar_share invite/ACL for personal and commercial.
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:
@@ -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.
|
||||
Reference in New Issue
Block a user