diff --git a/src/core/core_subscription.erl b/src/core/core_subscription.erl index bae7bc8..345e180 100644 --- a/src/core/core_subscription.erl +++ b/src/core/core_subscription.erl @@ -193,23 +193,49 @@ apply_updates(Sub, Updates) -> <<"expired">> -> expired; Other -> Other end, - Acc#subscription{status = NewStatus, updated_at = calendar:universal_time()}; + Acc#subscription{status = NewStatus, + updated_at = calendar:universal_time()}; <<"plan">> -> NewPlan = case Value of - <<"monthly">> -> monthly; - <<"yearly">> -> yearly; - <<"quarterly">>-> quarterly; - <<"biannual">> -> biannual; - <<"annual">> -> annual; - Other -> Other + <<"monthly">> -> monthly; + <<"yearly">> -> yearly; + <<"quarterly">> -> quarterly; + <<"biannual">> -> biannual; + <<"annual">> -> annual; + Other -> Other end, - Acc#subscription{plan = NewPlan, updated_at = calendar:universal_time()}; + Acc#subscription{plan = NewPlan, + updated_at = calendar:universal_time()}; <<"trial_used">> -> - Acc#subscription{trial_used = Value, updated_at = calendar:universal_time()}; + Acc#subscription{trial_used = Value, + updated_at = calendar:universal_time()}; <<"expires_at">> -> - Acc#subscription{expires_at = Value, updated_at = calendar:universal_time()}; - _ -> Acc + Acc#subscription{expires_at = parse_iso_datetime(Value), + updated_at = calendar:universal_time()}; + <<"started_at">> -> + Acc#subscription{started_at = parse_iso_datetime(Value), + updated_at = calendar:universal_time()}; + _ -> + Acc end - end, Sub, maps:to_list(Updates)). + end, Sub, maps:to_list(Updates)). + +parse_iso_datetime(Bin) when is_binary(Bin) -> + try + [DateStr, TimeStr] = string:split(Bin, "T"), + TimeStrNoZ = string:trim(TimeStr, trailing, "Z"), + [YearStr, MonthStr, DayStr] = string:split(DateStr, "-", all), + [HourStr, MinuteStr, SecondStr] = string:split(TimeStrNoZ, ":", all), + Year = binary_to_integer(list_to_binary(YearStr)), + Month = binary_to_integer(list_to_binary(MonthStr)), + Day = binary_to_integer(list_to_binary(DayStr)), + Hour = binary_to_integer(list_to_binary(HourStr)), + Minute = binary_to_integer(list_to_binary(MinuteStr)), + Second = binary_to_integer(list_to_binary(SecondStr)), + {{Year, Month, Day}, {Hour, Minute, Second}} + catch + _:_ -> Bin % если не получилось разобрать, оставляем как есть + end; +parse_iso_datetime(Other) -> Other. count_subscription() -> mnesia:table_info(subscription, size). \ No newline at end of file diff --git a/src/handlers/handler_utils.erl b/src/handlers/handler_utils.erl index 5d3efc1..b760ff6 100644 --- a/src/handlers/handler_utils.erl +++ b/src/handlers/handler_utils.erl @@ -319,8 +319,13 @@ subscription_to_json(Subscription) -> %%%=================================================================== %% @private --spec datetime_to_iso8601(calendar:datetime() | undefined) -> binary() | undefined. +-spec datetime_to_iso8601(calendar:datetime() | binary() | undefined) -> binary() | undefined. datetime_to_iso8601(undefined) -> undefined; +datetime_to_iso8601(Bin) when is_binary(Bin) -> + case byte_size(Bin) > 0 of + true -> Bin; + false -> undefined + end; datetime_to_iso8601({{Year, Month, Day}, {Hour, Minute, Second}}) -> iolist_to_binary( io_lib:format("~4..0B-~2..0B-~2..0BT~2..0B:~2..0B:~2..0BZ",