This commit is contained in:
2026-04-20 21:04:16 +03:00
parent b24cbc97f3
commit 19f82768e4
18 changed files with 1851 additions and 131 deletions
+53 -7
View File
@@ -27,13 +27,19 @@ create_event(Req) ->
<<"duration">> := Duration} ->
case parse_datetime(StartTimeStr) of
{ok, StartTime} ->
% Парсим location если есть
Location = parse_location(maps:get(<<"location">>, Decoded, undefined)),
% Проверяем, есть ли правило повторения
case maps:get(<<"recurrence">>, Decoded, undefined) of
undefined ->
% Одиночное событие
case logic_event:create_event(UserId, CalendarId, Title, StartTime, Duration) of
{ok, Event} ->
Response = event_to_json(Event),
% Обновляем location и capacity если нужно
update_event_fields(Event#event.id, Location, Decoded),
{ok, UpdatedEvent} = core_event:get_by_id(Event#event.id),
Response = event_to_json(UpdatedEvent),
send_json(Req2, 201, Response);
{error, access_denied} ->
send_error(Req2, 403, <<"Access denied">>);
@@ -48,7 +54,9 @@ create_event(Req) ->
% Повторяющееся событие
case logic_event:create_recurring_event(UserId, CalendarId, Title, StartTime, Duration, RRule) of
{ok, Event} ->
Response = event_to_json(Event),
update_event_fields(Event#event.id, Location, Decoded),
{ok, UpdatedEvent} = core_event:get_by_id(Event#event.id),
Response = event_to_json(UpdatedEvent),
send_json(Req2, 201, Response);
{error, invalid_rrule} ->
send_error(Req2, 400, <<"Invalid recurrence rule">>);
@@ -83,14 +91,12 @@ list_events(Req) ->
case handler_auth:authenticate(Req) of
{ok, UserId, Req1} ->
CalendarId = cowboy_req:binding(calendar_id, Req1),
% Проверяем параметры запроса для диапазона дат
Qs = cowboy_req:parse_qs(Req1),
From = proplists:get_value(<<"from">>, Qs, undefined),
To = proplists:get_value(<<"to">>, Qs, undefined),
case logic_event:list_events(UserId, CalendarId) of
{ok, Events} ->
% Если указан диапазон, разворачиваем повторяющиеся события
Response = case {From, To} of
{undefined, undefined} ->
[event_to_json(E) || E <- Events];
@@ -111,7 +117,43 @@ list_events(Req) ->
send_error(Req1, Code, Message)
end.
%% Разворачивание повторяющихся событий в диапазоне
%% Вспомогательные функции
update_event_fields(EventId, Location, Decoded) ->
Updates = [],
Updates1 = case Location of
undefined -> Updates;
_ -> [{location, Location} | Updates]
end,
Updates2 = case maps:get(<<"capacity">>, Decoded, undefined) of
undefined -> Updates1;
Cap -> [{capacity, Cap} | Updates1]
end,
Updates3 = case maps:get(<<"tags">>, Decoded, undefined) of
undefined -> Updates2;
Tags -> [{tags, Tags} | Updates2]
end,
Updates4 = case maps:get(<<"description">>, Decoded, undefined) of
undefined -> Updates3;
Desc -> [{description, Desc} | Updates3]
end,
Updates5 = case maps:get(<<"online_link">>, Decoded, undefined) of
undefined -> Updates4;
Link -> [{online_link, Link} | Updates4]
end,
if Updates5 /= [] -> core_event:update(EventId, Updates5);
true -> ok
end.
parse_location(undefined) -> undefined;
parse_location(LocationMap) when is_map(LocationMap) ->
case LocationMap of
#{<<"lat">> := Lat, <<"lon">> := Lon} ->
Address = maps:get(<<"address">>, LocationMap, <<"">>),
#location{address = Address, lat = Lat, lon = Lon};
_ -> undefined
end;
parse_location(_) -> undefined.
expand_recurring_events(UserId, Events, From, To) ->
lists:flatmap(fun(Event) ->
case Event#event.event_type of
@@ -148,7 +190,6 @@ parse_datetime_binary(Str) ->
{ok, Dt} = parse_datetime(Str),
Dt.
%% Вспомогательные функции
parse_datetime(Str) ->
try
[DateStr, TimeStr] = string:split(Str, "T"),
@@ -178,7 +219,12 @@ event_to_json(Event) ->
RecurrenceJson = case Event#event.recurrence_rule of
undefined -> null;
Rule -> jsx:decode(Rule, [return_maps])
Rule ->
Decoded = jsx:decode(Rule, [return_maps]),
case Decoded of
Map when is_map(Map) -> Map;
{ok, Map} -> Map
end
end,
#{