Рефакторинг админских обработчиков - пагинация, сортировка, фильтрация. Финал
This commit is contained in:
@@ -31,10 +31,10 @@ trails() ->
|
||||
#{name => <<"target_id">>, in => <<"query">>, schema => #{type => string}, description => <<"ID of target">>},
|
||||
#{name => <<"user_id">>, in => <<"query">>, schema => #{type => string}, description => <<"Filter by user">>},
|
||||
#{name => <<"status">>, in => <<"query">>, schema => #{type => string}, description => <<"visible, hidden, deleted, or all">>},
|
||||
#{name => <<"limit">>, in => <<"query">>, schema => #{type => integer}, description => <<"Page size">>},
|
||||
#{name => <<"offset">>, in => <<"query">>, schema => #{type => integer}, description => <<"Offset">>},
|
||||
#{name => <<"sort">>, in => <<"query">>, schema => #{type => string, enum => [<<"created_at">>, <<"updated_at">>, <<"rating">>]}, description => <<"Sort field">>},
|
||||
#{name => <<"order">>, in => <<"query">>, schema => #{type => string, enum => [<<"asc">>, <<"desc">>]}, description => <<"Sort direction">>}
|
||||
#{name => <<"order">>, in => <<"query">>, schema => #{type => string, enum => [<<"asc">>, <<"desc">>]}, description => <<"Sort direction">>},
|
||||
#{name => <<"limit">>, in => <<"query">>, schema => #{type => integer}, description => <<"Page size">>},
|
||||
#{name => <<"offset">>, in => <<"query">>, schema => #{type => integer}, description => <<"Offset">>}
|
||||
],
|
||||
responses => #{
|
||||
200 => #{ description => <<"Array of reviews">>, content => #{<<"application/json">> => #{schema => #{ type => array, items => review_schema() }}} }
|
||||
@@ -83,16 +83,11 @@ list_reviews(Req) ->
|
||||
target_type => normalize_target_type(proplists:get_value(<<"target_type">>, Qs)),
|
||||
target_id => proplists:get_value(<<"target_id">>, Qs),
|
||||
user_id => proplists:get_value(<<"user_id">>, Qs),
|
||||
status => proplists:get_value(<<"status">>, Qs)
|
||||
status => normalize_status(proplists:get_value(<<"status">>, Qs))
|
||||
},
|
||||
Filters = maps:filter(fun(_, V) -> V =/= undefined end, Filters0),
|
||||
Pagination = handler_utils:parse_pagination_params(Req1),
|
||||
% Убедимся, что в Pagination есть ключи sort и order со значениями по умолчанию
|
||||
PaginationWithSort = Pagination#{
|
||||
sort => maps:get(sort, Pagination, <<"created_at">>),
|
||||
order => maps:get(order, Pagination, <<"desc">>)
|
||||
},
|
||||
{ok, Total, Reviews} = logic_review:list_admin_reviews(Filters, PaginationWithSort),
|
||||
{ok, Total, Reviews} = logic_review:list_admin_reviews(Filters, Pagination),
|
||||
Json = [handler_utils:review_to_json(R) || R <- Reviews],
|
||||
ExtraHeaders = handler_utils:pagination_headers(Pagination, Total),
|
||||
handler_utils:send_json(Req1, 200, Json, ExtraHeaders);
|
||||
@@ -105,6 +100,12 @@ normalize_target_type(<<"event">>) -> event;
|
||||
normalize_target_type(<<"calendar">>) -> calendar;
|
||||
normalize_target_type(Other) -> Other.
|
||||
|
||||
%% @private Преобразует бинарный status в атом.
|
||||
normalize_status(<<"visible">>) -> visible;
|
||||
normalize_status(<<"hidden">>) -> hidden;
|
||||
normalize_status(<<"deleted">>) -> deleted;
|
||||
normalize_status(Other) -> Other.
|
||||
|
||||
bulk_update_reviews(Req) ->
|
||||
case handler_utils:auth_admin(Req) of
|
||||
{ok, AdminId, Req1} ->
|
||||
|
||||
Reference in New Issue
Block a user