Ролевая модель и аудит Часть 1.
This commit is contained in:
63
src/core/core_admin.erl
Normal file
63
src/core/core_admin.erl
Normal file
@@ -0,0 +1,63 @@
|
||||
-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]).
|
||||
|
||||
create(Email, Password, Role) ->
|
||||
Id = generate_id(),
|
||||
{ok, Hash} = argon2:hash(Password),
|
||||
Now = calendar:universal_time(),
|
||||
Admin = #admin{
|
||||
id = Id,
|
||||
email = Email,
|
||||
password_hash = Hash,
|
||||
role = Role,
|
||||
status = active,
|
||||
created_at = Now,
|
||||
updated_at = Now
|
||||
},
|
||||
mnesia:dirty_write(Admin),
|
||||
{ok, Admin}.
|
||||
|
||||
get_by_email(Email) ->
|
||||
Match = #admin{email = Email, _ = '_'},
|
||||
case mnesia:dirty_match_object(Match) of
|
||||
[Admin] -> {ok, Admin};
|
||||
[] -> {error, not_found}
|
||||
end.
|
||||
|
||||
get_by_id(Id) ->
|
||||
case mnesia:dirty_read({admin, Id}) of
|
||||
[Admin] -> {ok, Admin};
|
||||
[] -> {error, not_found}
|
||||
end.
|
||||
|
||||
list_all() ->
|
||||
mnesia:dirty_match_object(#admin{_ = '_'}).
|
||||
|
||||
update_role(Id, NewRole) when is_atom(NewRole) ->
|
||||
case get_by_id(Id) of
|
||||
{ok, Admin} ->
|
||||
Updated = Admin#admin{role = NewRole, updated_at = calendar:universal_time()},
|
||||
mnesia:dirty_write(Updated),
|
||||
{ok, Updated};
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
block(Id) ->
|
||||
update_status(Id, blocked).
|
||||
|
||||
unblock(Id) ->
|
||||
update_status(Id, active).
|
||||
|
||||
update_status(Id, Status) ->
|
||||
case get_by_id(Id) of
|
||||
{ok, Admin} ->
|
||||
Updated = Admin#admin{status = Status, updated_at = calendar:universal_time()},
|
||||
mnesia:dirty_write(Updated),
|
||||
{ok, Updated};
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
generate_id() ->
|
||||
base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}).
|
||||
Reference in New Issue
Block a user