fix(mnesia): per-slot volumes hint and harden verification lookup.
Avoid shared Mnesia dir across replicas; make get_or_create_token and CT verify_user resilient to brief cross-node lag. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -402,13 +402,25 @@ create_event(Token, CalId, Params) ->
|
||||
|
||||
%% @doc Подтверждает email пользователя, используя админский эндпоинт
|
||||
%% для получения верификационного токена и публичный /v1/verify.
|
||||
%% Retries briefly: IFT Traefik may hit another replica before Mnesia settles.
|
||||
-spec verify_user(AdminToken :: binary(), UserId :: binary()) -> ok.
|
||||
verify_user(AdminToken, UserId) ->
|
||||
#{<<"token">> := Token} = admin_get(
|
||||
<<"/v1/admin/users/", UserId/binary, "/verification-token">>, AdminToken),
|
||||
{ok, 200, _, _} = client_request(post, <<"/v1/verify">>, <<>>,
|
||||
jsx:encode(#{<<"token">> => Token})),
|
||||
ok.
|
||||
verify_user(AdminToken, UserId, 8).
|
||||
|
||||
verify_user(AdminToken, UserId, RetriesLeft) ->
|
||||
Path = <<"/v1/admin/users/", UserId/binary, "/verification-token">>,
|
||||
case admin_request(get, Path, AdminToken) of
|
||||
{ok, 200, _, Body} ->
|
||||
#{<<"token">> := Token} = jsx:decode(list_to_binary(Body), [return_maps]),
|
||||
{ok, 200, _, _} = client_request(post, <<"/v1/verify">>, <<>>,
|
||||
jsx:encode(#{<<"token">> => Token})),
|
||||
ok;
|
||||
{ok, 404, _, _} when RetriesLeft > 1 ->
|
||||
timer:sleep(100),
|
||||
verify_user(AdminToken, UserId, RetriesLeft - 1);
|
||||
Other ->
|
||||
error({verify_user_failed, UserId, Other})
|
||||
end.
|
||||
|
||||
%%%===================================================================
|
||||
%%% Внутренние функции
|
||||
|
||||
Reference in New Issue
Block a user