Рефакторинг обработчиков. Часть 1 #21

This commit is contained in:
2026-05-10 22:14:38 +03:00
parent a35d6f7acc
commit 6403f061df
46 changed files with 3082 additions and 2091 deletions
+84
View File
@@ -0,0 +1,84 @@
-module(logic_admin).
-export([list_admins/2, get_admin/1, update_admin/2]).
-include("records.hrl").
%%%-------------------------------------------------------------------
%%% Административный список администраторов с пагинацией
%%%-------------------------------------------------------------------
-spec list_admins(map(), #{limit => integer(), offset => integer(), sort => binary(), order => binary()}) ->
{ok, non_neg_integer(), [#admin{}]}.
list_admins(Filters, Pagination) ->
#{limit := Limit, offset := Offset, sort := Sort, order := Order} = Pagination,
AllAdmins = core_admin:list_all(),
Filtered = apply_filters(AllAdmins, Filters),
Sorted = sort_admins(Filtered, Sort, Order),
Total = length(Sorted),
Page = lists:sublist(Sorted, Offset + 1, Limit),
{ok, Total, Page}.
%%%-------------------------------------------------------------------
%%% Получение администратора по ID
%%%-------------------------------------------------------------------
-spec get_admin(binary()) -> {ok, #admin{}} | {error, not_found}.
get_admin(AdminId) ->
core_admin:get_by_id(AdminId).
%%%-------------------------------------------------------------------
%%% Обновление администратора
%%%-------------------------------------------------------------------
-spec update_admin(binary(), proplists:proplist()) ->
{ok, #admin{}} | {error, not_found | invalid_field}.
update_admin(AdminId, Updates) ->
case core_admin:get_by_id(AdminId) of
{ok, _Admin} ->
ValidUpdates = validate_admin_updates(Updates),
core_admin:update(AdminId, ValidUpdates);
Error ->
Error
end.
%%%===================================================================
%%% Внутренние функции
%%%===================================================================
apply_filters(Admins, Filters) ->
Role = maps:get(role, Filters, undefined),
Status = maps:get(status, Filters, undefined),
F1 = case Role of
undefined -> Admins;
_ -> [A || A <- Admins, A#admin.role =:= Role]
end,
case Status of
undefined -> F1;
_ -> [A || A <- F1, A#admin.status =:= Status]
end.
sort_admins(Admins, SortField, Order) ->
Field = binary_to_existing_atom(SortField, utf8),
Sorted = lists:sort(
fun(A, B) ->
ValA = admin_field(A, Field),
ValB = admin_field(B, Field),
if Order == <<"asc">> -> ValA =< ValB;
true -> ValA >= ValB
end
end, Admins),
Sorted.
admin_field(#admin{created_at = V}, created_at) -> V;
admin_field(#admin{email = V}, email) -> V;
admin_field(#admin{role = V}, role) -> V;
admin_field(_, _) -> undefined.
validate_admin_updates(Updates) ->
lists:filter(fun validate_admin_update/1, Updates).
validate_admin_update({nickname, V}) when is_binary(V); V =:= undefined -> true;
validate_admin_update({avatar_url, V}) when is_binary(V); V =:= undefined -> true;
validate_admin_update({timezone, V}) when is_binary(V); V =:= undefined -> true;
validate_admin_update({language, V}) when is_binary(V); V =:= undefined -> true;
validate_admin_update({phone, V}) when is_binary(V); V =:= undefined -> true;
validate_admin_update({preferences, V}) when is_map(V); V =:= undefined -> true;
validate_admin_update(_) -> false.