fix(calendar): persist settings on PUT/POST
CI / test (push) Successful in 7m4s
CI / deploy-ift (push) Successful in 3m21s
CI / e2e-ift (push) Failing after 52s
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped

Accept calendar.settings (e.g. week_patterns) in validate_update
and convert_field; apply on create like tags. Unblocks Front#42
pattern save which previously got 200 with empty settings.
This commit is contained in:
2026-07-29 15:00:55 +03:00
parent 7e14dbcf8b
commit faf251b11d
5 changed files with 93 additions and 3 deletions
+12 -1
View File
@@ -85,6 +85,7 @@ calendar_schema() ->
type => #{type => string, enum => [<<"personal">>, <<"commercial">>]},
confirmation => #{type => string, enum => [<<"auto">>, <<"manual">>]},
tags => #{type => array, items => #{type => string}},
settings => #{type => object},
rating_avg => #{type => number, format => float},
rating_count => #{type => integer},
status => #{type => string},
@@ -102,7 +103,12 @@ calendar_update_schema() ->
description => #{type => string},
type => #{type => string},
confirmation => #{type => string},
tags => #{type => array, items => #{type => string}}
tags => #{type => array, items => #{type => string}},
short_name => #{type => string},
category => #{type => string},
color => #{type => string},
image_url => #{type => string},
settings => #{type => object, nullable => true}
}
}.
@@ -195,4 +201,9 @@ convert_field({<<"confirmation">>, #{<<"timeout">> := N}}) when is_integer(N), N
{confirmation, {timeout, N}};
convert_field({<<"confirmation">>, Val}) -> {confirmation, Val};
convert_field({<<"tags">>, Val}) -> {tags, Val};
convert_field({<<"short_name">>, Val}) -> {short_name, Val};
convert_field({<<"category">>, Val}) -> {category, Val};
convert_field({<<"color">>, Val}) -> {color, Val};
convert_field({<<"image_url">>, Val}) -> {image_url, Val};
convert_field({<<"settings">>, Val}) when is_map(Val) -> {settings, Val};
convert_field(Other) -> Other.
+11 -2
View File
@@ -117,12 +117,21 @@ create_calendar(Req) ->
Confirmation = parse_confirmation(maps:get(<<"confirmation">>, Decoded, <<"manual">>)),
Tags = maps:get(<<"tags">>, Decoded, []),
Type = parse_type(maps:get(<<"type">>, Decoded, <<"personal">>)),
Settings = maps:get(<<"settings">>, Decoded, undefined),
case logic_calendar:create_calendar(UserId, Title, Description, Confirmation, Type) of
{ok, Calendar} ->
Updated = case Tags of
Extra0 = case Tags of
[] -> [];
_ -> [{tags, Tags}]
end,
Extra = case Settings of
S when is_map(S) -> [{settings, S} | Extra0];
_ -> Extra0
end,
Updated = case Extra of
[] -> Calendar;
_ ->
case logic_calendar:update_calendar(UserId, Calendar#calendar.id, [{tags, Tags}]) of
case logic_calendar:update_calendar(UserId, Calendar#calendar.id, Extra) of
{ok, C2} -> C2;
_ -> Calendar
end
+14
View File
@@ -242,6 +242,14 @@ normalize_update({type, <<"personal">>}) -> {type, personal};
normalize_update({type, <<"commercial">>}) -> {type, commercial};
normalize_update({type, personal}) -> {type, personal};
normalize_update({type, commercial}) -> {type, commercial};
normalize_update({<<"settings">>, Value}) when is_map(Value) -> {settings, Value};
normalize_update({<<"title">>, Value}) when is_binary(Value) -> {title, Value};
normalize_update({<<"description">>, Value}) when is_binary(Value) -> {description, Value};
normalize_update({<<"tags">>, Value}) when is_list(Value) -> {tags, Value};
normalize_update({<<"short_name">>, Value}) when is_binary(Value) -> {short_name, Value};
normalize_update({<<"category">>, Value}) when is_binary(Value) -> {category, Value};
normalize_update({<<"color">>, Value}) when is_binary(Value) -> {color, Value};
normalize_update({<<"image_url">>, Value}) when is_binary(Value) -> {image_url, Value};
normalize_update(Other) -> Other.
validate_update({title, Value}) when is_binary(Value) -> true;
@@ -249,6 +257,12 @@ validate_update({description, Value}) when is_binary(Value) -> true;
validate_update({tags, Value}) when is_list(Value) -> true;
validate_update({type, personal}) -> true;
validate_update({type, commercial}) -> true;
validate_update({short_name, Value}) when is_binary(Value) -> true;
validate_update({category, Value}) when is_binary(Value) -> true;
validate_update({color, Value}) when is_binary(Value) -> true;
validate_update({image_url, Value}) when is_binary(Value) -> true;
%% Opaque JSON object for client prefs (e.g. week_patterns for schedule fill).
validate_update({settings, Value}) when is_map(Value) -> true;
validate_update({confirmation, Value}) ->
case Value of
auto -> true;