Stage 4
This commit is contained in:
@@ -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,
|
||||
|
||||
#{
|
||||
|
||||
Reference in New Issue
Block a user