Рефакторинг обработчиков. Часть 1 #21
This commit is contained in:
@@ -1,14 +1,15 @@
|
||||
-module(core_admin).
|
||||
-include("records.hrl").
|
||||
-export([create/3, get_by_email/1, get_by_id/1, list_all/0,
|
||||
update_role/2, block/1, unblock/1, generate_id/0, update_last_login/1]).
|
||||
update_role/2, block/1, unblock/1, update_last_login/1]).
|
||||
-export([update/2]).
|
||||
|
||||
create(Email, Password, Role) ->
|
||||
case get_by_email(Email) of
|
||||
{ok, _} ->
|
||||
{error, email_exists};
|
||||
{error, not_found} ->
|
||||
Id = generate_id(),
|
||||
Id = infra_utils:generate_id(16),
|
||||
{ok, Hash} = argon2:hash(Password),
|
||||
Now = calendar:universal_time(),
|
||||
Admin = #admin{
|
||||
@@ -24,6 +25,22 @@ create(Email, Password, Role) ->
|
||||
{ok, Admin}
|
||||
end.
|
||||
|
||||
%% Обновление администратора (любые поля)
|
||||
update(AdminId, Updates) ->
|
||||
F = fun() ->
|
||||
case mnesia:read(admin, AdminId) of
|
||||
[] -> {error, not_found};
|
||||
[Admin] ->
|
||||
UpdatedAdmin = apply_updates(Admin, Updates),
|
||||
mnesia:write(UpdatedAdmin),
|
||||
{ok, UpdatedAdmin}
|
||||
end
|
||||
end,
|
||||
case mnesia:transaction(F) of
|
||||
{atomic, Result} -> Result;
|
||||
{aborted, Reason} -> {error, Reason}
|
||||
end.
|
||||
|
||||
get_by_email(Email) ->
|
||||
Match = #admin{email = Email, _ = '_'},
|
||||
case mnesia:dirty_match_object(Match) of
|
||||
@@ -73,5 +90,23 @@ update_status(Id, Status) ->
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
generate_id() ->
|
||||
base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}).
|
||||
%%%===================================================================
|
||||
%%% ВНУТРЕННИЕ ФУНКЦИИ
|
||||
%%%===================================================================
|
||||
|
||||
apply_updates(Admin, []) -> Admin;
|
||||
apply_updates(Admin, [{Field, Value} | Rest]) ->
|
||||
NewAdmin = case Field of
|
||||
email -> Admin#admin{email = Value};
|
||||
password_hash -> Admin#admin{password_hash = Value};
|
||||
role -> Admin#admin{role = Value};
|
||||
status -> Admin#admin{status = Value};
|
||||
nickname -> Admin#admin{nickname = Value};
|
||||
avatar_url -> Admin#admin{avatar_url = Value};
|
||||
timezone -> Admin#admin{timezone = Value};
|
||||
language -> Admin#admin{language = Value};
|
||||
phone -> Admin#admin{phone = Value};
|
||||
preferences -> Admin#admin{preferences = Value};
|
||||
_ -> Admin
|
||||
end,
|
||||
apply_updates(NewAdmin#admin{updated_at = calendar:universal_time()}, Rest).
|
||||
Reference in New Issue
Block a user