Рефакторинг обработчиков. Финальное тестирование #21
This commit is contained in:
@@ -14,6 +14,9 @@
|
||||
}
|
||||
]}
|
||||
]},
|
||||
{mnesia, [
|
||||
{dir, "data/Mnesia.eventhub@${NODE_NAME}"}
|
||||
]},
|
||||
{ cowboy_swagger, [
|
||||
{ static_files, "./_build/default/lib/cowboy_swagger/priv/swagger" }
|
||||
]}
|
||||
|
||||
+13
-37
@@ -4,8 +4,6 @@
|
||||
|
||||
start(_StartType, _StartArgs) ->
|
||||
pg:start_link(),
|
||||
application:ensure_all_started(mnesia),
|
||||
application:ensure_all_started(cowboy),
|
||||
case infra_sup:start_link() of
|
||||
{ok, Pid} ->
|
||||
% Определяем список узлов кластера, если режим CLUSTER_MODE=true
|
||||
@@ -22,7 +20,7 @@ start(_StartType, _StartArgs) ->
|
||||
lists:prefix("eventhub-node", Name)];
|
||||
_ -> []
|
||||
end
|
||||
end, IPs),
|
||||
end, IPs),
|
||||
% Исключаем свой узел, чтобы не подключаться к самому себе
|
||||
AllNodes -- [node()];
|
||||
_ -> []
|
||||
@@ -40,15 +38,16 @@ start(_StartType, _StartArgs) ->
|
||||
io:format("~nCluster: discovered nodes ~p, joining cluster~n", [Nodes]),
|
||||
application:set_env(eventhub, extra_db_nodes, Nodes)
|
||||
end,
|
||||
application:ensure_all_started(mnesia),
|
||||
ok = infra_mnesia:init_tables(),
|
||||
ok = infra_mnesia:wait_for_tables(),
|
||||
calendar_html_renderer:init_cache(),
|
||||
application:ensure_all_started(cowboy),
|
||||
start_http(), % Пользовательский API (8080)
|
||||
start_admin_http(), % Административный API (8445)
|
||||
start_swagger_http(), % Swagger UI и спецификация (8447)
|
||||
application:ensure_all_started(prometheus),
|
||||
application:ensure_all_started(prometheus_cowboy),
|
||||
init_default_admins(),
|
||||
{ok, Pid};
|
||||
Error ->
|
||||
Error
|
||||
@@ -91,7 +90,11 @@ start_http() ->
|
||||
]),
|
||||
Middlewares = [cowboy_router, cowboy_handler],
|
||||
Env = #{dispatch => Dispatch},
|
||||
cowboy:start_clear(http, [{port, Port}], #{env => Env, middlewares => Middlewares}),
|
||||
cowboy:start_clear(http, [{port, Port}],
|
||||
#{env => Env, middlewares => Middlewares,
|
||||
metrics_callback => fun prometheus_cowboy2_instrumenter:observe/1,
|
||||
stream_handlers => [cowboy_metrics_h, cowboy_stream_h]
|
||||
}),
|
||||
io:format("HTTP server started on port ~p~n", [Port]).
|
||||
|
||||
%% ===================================================================
|
||||
@@ -139,7 +142,11 @@ start_admin_http() ->
|
||||
|
||||
Middlewares = [cowboy_router, cowboy_handler],
|
||||
Env = #{dispatch => Dispatch},
|
||||
cowboy:start_clear(admin_http, [{port, PortAdmin}], #{env => Env, middlewares => Middlewares}),
|
||||
cowboy:start_clear(admin_http, [{port, PortAdmin}],
|
||||
#{env => Env, middlewares => Middlewares,
|
||||
metrics_callback => fun prometheus_cowboy2_instrumenter:observe/1,
|
||||
stream_handlers => [cowboy_metrics_h, cowboy_stream_h]
|
||||
}),
|
||||
io:format("Admin HTTP server started on port ~p~n", [PortAdmin]),
|
||||
|
||||
% WebSocket для пользователей
|
||||
@@ -170,37 +177,6 @@ start_swagger_http() ->
|
||||
cowboy:start_clear(swagger_http, [{port, PortSwagger}], #{env => Env, middlewares => Middlewares}),
|
||||
io:format("Swagger HTTP server started on port ~p~n", [PortSwagger]).
|
||||
|
||||
%% ---------- Инициализация администраторов ----------
|
||||
init_default_admins() ->
|
||||
case core_admin:list_all() of
|
||||
[] ->
|
||||
% Суперадмин
|
||||
SuperEmail = list_to_binary(os:getenv("ADMIN_SUPER_EMAIL", "superadmin@eventhub.local")),
|
||||
SuperPass = list_to_binary(os:getenv("ADMIN_SUPER_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(SuperEmail, SuperPass, superadmin),
|
||||
io:format("Default superadmin created: ~s~n", [SuperEmail]),
|
||||
|
||||
% Админ
|
||||
AdminEmail = list_to_binary(os:getenv("ADMIN_EMAIL", "admin@eventhub.local")),
|
||||
AdminPass = list_to_binary(os:getenv("ADMIN_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(AdminEmail, AdminPass, admin),
|
||||
io:format("Default admin created: ~s~n", [AdminEmail]),
|
||||
|
||||
% Модератор
|
||||
ModerEmail = list_to_binary(os:getenv("ADMIN_MODER_EMAIL", "moderator@eventhub.local")),
|
||||
ModerPass = list_to_binary(os:getenv("ADMIN_MODER_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(ModerEmail, ModerPass, moderator),
|
||||
io:format("Default moderator created: ~s~n", [ModerEmail]),
|
||||
|
||||
% Поддержка
|
||||
SupportEmail = list_to_binary(os:getenv("ADMIN_SUPPORT_EMAIL", "support@eventhub.local")),
|
||||
SupportPass = list_to_binary(os:getenv("ADMIN_SUPPORT_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(SupportEmail, SupportPass, support),
|
||||
io:format("Default support created: ~s~n", [SupportEmail]);
|
||||
_ ->
|
||||
io:format("Admins already exist. Skipping creation.~n")
|
||||
end.
|
||||
|
||||
get_env_int(Key, Default) ->
|
||||
case application:get_env(eventhub, Key, Default) of
|
||||
Val when is_list(Val) -> list_to_integer(Val);
|
||||
|
||||
@@ -94,8 +94,8 @@ serve_ui(Api, Req) ->
|
||||
-spec serve_json(admin | user, cowboy_req:req()) -> {ok, cowboy_req:req(), any()}.
|
||||
serve_json(Api, Req) ->
|
||||
Trails = case Api of
|
||||
admin -> trails:admin();
|
||||
user -> trails:user()
|
||||
admin -> eventhub_trails:admin();
|
||||
user -> eventhub_trails:user()
|
||||
end,
|
||||
OpenApi = #{
|
||||
openapi => <<"3.0.3">>,
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
-include("records.hrl").
|
||||
|
||||
-export([start_link/0, init_tables/0, wait_for_tables/0]).
|
||||
-export([start_link/0, init_tables/0, wait_for_tables/0, wait_for_table/1]).
|
||||
-export([add_cluster_nodes/1]).
|
||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||
terminate/2, code_change/3]).
|
||||
@@ -54,6 +54,8 @@ handle_call(init_tables, _From, State) ->
|
||||
case ExtraNodes of
|
||||
[] ->
|
||||
ok = maybe_recreate_schema();
|
||||
%% ok = migration_engine:init_migrations_table(),
|
||||
%% _ = migration_engine:apply_pending(); //todo выключил - обваливает кластер, нужно разбираться
|
||||
_ ->
|
||||
ok = join_cluster(ExtraNodes)
|
||||
end,
|
||||
@@ -61,8 +63,7 @@ handle_call(init_tables, _From, State) ->
|
||||
ok = create_indices(),
|
||||
ok = stats_collector:subscribe(),
|
||||
ok = start_cleanup_timer(),
|
||||
ok = migration_engine:init_migrations_table(),
|
||||
_ = migration_engine:apply_pending(),
|
||||
init_default_admins(),
|
||||
{reply, ok, State};
|
||||
|
||||
handle_call({add_nodes, Nodes}, _From, State) ->
|
||||
@@ -91,7 +92,7 @@ maybe_recreate_schema() ->
|
||||
MnesiaDir = mnesia:system_info(directory),
|
||||
case filelib:is_dir(MnesiaDir) of
|
||||
false ->
|
||||
io:format("Mnesia directory not found. Creating fresh schema...~n"),
|
||||
io:format("Mnesia directory (~s) not found. Creating fresh schema...~n", [MnesiaDir]),
|
||||
mnesia:stop(),
|
||||
mnesia:delete_schema([node()]),
|
||||
mnesia:create_schema([node()]),
|
||||
@@ -184,6 +185,37 @@ prune_dead_nodes() ->
|
||||
catch mnesia:del_table_copy(schema, Node)
|
||||
end, DeadNodes).
|
||||
|
||||
%% ---------- Инициализация администраторов ----------
|
||||
init_default_admins() ->
|
||||
case core_admin:list_all() of
|
||||
[] ->
|
||||
% Суперадмин
|
||||
SuperEmail = list_to_binary(os:getenv("ADMIN_SUPER_EMAIL", "superadmin@eventhub.local")),
|
||||
SuperPass = list_to_binary(os:getenv("ADMIN_SUPER_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(SuperEmail, SuperPass, superadmin),
|
||||
io:format("Default superadmin created: ~s~n", [SuperEmail]),
|
||||
|
||||
% Админ
|
||||
AdminEmail = list_to_binary(os:getenv("ADMIN_EMAIL", "admin@eventhub.local")),
|
||||
AdminPass = list_to_binary(os:getenv("ADMIN_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(AdminEmail, AdminPass, admin),
|
||||
io:format("Default admin created: ~s~n", [AdminEmail]),
|
||||
|
||||
% Модератор
|
||||
ModerEmail = list_to_binary(os:getenv("ADMIN_MODER_EMAIL", "moderator@eventhub.local")),
|
||||
ModerPass = list_to_binary(os:getenv("ADMIN_MODER_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(ModerEmail, ModerPass, moderator),
|
||||
io:format("Default moderator created: ~s~n", [ModerEmail]),
|
||||
|
||||
% Поддержка
|
||||
SupportEmail = list_to_binary(os:getenv("ADMIN_SUPPORT_EMAIL", "support@eventhub.local")),
|
||||
SupportPass = list_to_binary(os:getenv("ADMIN_SUPPORT_PASSWORD", "123456")),
|
||||
{ok, _} = core_admin:create(SupportEmail, SupportPass, support),
|
||||
io:format("Default support created: ~s~n", [SupportEmail]);
|
||||
_ ->
|
||||
io:format("Admins already exist. Skipping creation.~n")
|
||||
end.
|
||||
|
||||
%% ===================================================================
|
||||
%% Создание / открытие таблиц
|
||||
%% ===================================================================
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||
terminate/2, code_change/3]).
|
||||
|
||||
-define(TABLE, schema_migrations).
|
||||
-define(TABLE, schema_migration).
|
||||
|
||||
%% ------------------------------
|
||||
%% API
|
||||
@@ -49,6 +49,7 @@ handle_call(init_table, _From, State) ->
|
||||
{type, set}
|
||||
])
|
||||
end,
|
||||
infra_mnesia:wait_for_table(?TABLE),
|
||||
{reply, ok, State};
|
||||
|
||||
handle_call(apply_pending, _From, State) ->
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-module(trails).
|
||||
-module(eventhub_trails).
|
||||
-export([admin/0, user/0, all/0]).
|
||||
|
||||
admin() ->
|
||||
Reference in New Issue
Block a user