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

This commit is contained in:
2026-05-11 21:51:45 +03:00
parent 6403f061df
commit 61bb44ab4a
31 changed files with 8391 additions and 1480 deletions

View File

@@ -1,12 +1,32 @@
%%%-------------------------------------------------------------------
%%% @doc Обработчик документации Swagger.
%%%
%%% Раздаёт Swagger UI и спецификации OpenAPI для
%%% административного и клиентского API.
%%%
%%% GET / индексная страница с выбором API
%%% GET /admin/ Swagger UI для административного API
%%% GET /admin/swagger.json OpenAPI-спецификация (admin)
%%% GET /client/ Swagger UI для клиентского API
%%% GET /client/swagger.json OpenAPI-спецификация (client)
%%% @end
%%%-------------------------------------------------------------------
-module(swagger_docs_handler).
-behaviour(cowboy_handler).
-export([init/2]).
%%% cowboy_handler callback
-spec init(cowboy_req:req(), any()) -> {ok, cowboy_req:req(), any()}.
init(Req, _Opts) ->
Path = cowboy_req:path(Req),
handle(Path, Req).
%%--------------------------------------------------------------------
%% Роутинг путей
%%--------------------------------------------------------------------
-spec handle(binary(), cowboy_req:req()) -> {ok, cowboy_req:req(), any()}.
handle(<<"/">>, Req) ->
serve_index(Req);
handle(<<"/admin">>, Req) ->
@@ -25,7 +45,11 @@ handle(_, Req) ->
cowboy_req:reply(404, #{}, <<"Not Found">>, Req),
{ok, [], []}.
%% Главная страница с выбором API
%%--------------------------------------------------------------------
%% Главная страница
%%--------------------------------------------------------------------
-spec serve_index(cowboy_req:req()) -> {ok, cowboy_req:req(), any()}.
serve_index(Req) ->
Html = <<"<!DOCTYPE html>
<html>
@@ -41,7 +65,11 @@ serve_index(Req) ->
cowboy_req:reply(200, #{<<"content-type">> => <<"text/html">>}, Html, Req),
{ok, Html, []}.
%% Swagger UI для конкретного API
%%--------------------------------------------------------------------
%% Swagger UI
%%--------------------------------------------------------------------
-spec serve_ui(admin | client, cowboy_req:req()) -> {ok, cowboy_req:req(), any()}.
serve_ui(Api, Req) ->
{Title, SpecUrl} = case Api of
admin -> {<<"EventHub Admin API">>, <<"/admin/swagger.json">>};
@@ -59,7 +87,11 @@ serve_ui(Api, Req) ->
cowboy_req:reply(200, #{<<"content-type">> => <<"text/html">>}, Html, Req),
{ok, Html, []}.
%% Генерация OpenAPI JSON
%%--------------------------------------------------------------------
%% OpenAPI JSON
%%--------------------------------------------------------------------
-spec serve_json(admin | client, cowboy_req:req()) -> {ok, cowboy_req:req(), any()}.
serve_json(Api, Req) ->
Trails = case Api of
admin -> trails:admin();
@@ -81,6 +113,11 @@ serve_json(Api, Req) ->
cowboy_req:reply(200, #{<<"content-type">> => <<"application/json">>}, Json, Req),
{ok, Json, []}.
%%--------------------------------------------------------------------
%% Вспомогательные функции
%%--------------------------------------------------------------------
-spec build_paths([map()]) -> map().
build_paths(Trails) ->
lists:foldl(fun(Trail, Acc) ->
Path = maps:get(path, Trail, <<"/">>),
@@ -91,6 +128,7 @@ build_paths(Trails) ->
maps:merge_with(fun(_, V1, V2) -> maps:merge(V1, V2) end, Acc, #{Path => PathItem})
end, #{}, Trails).
-spec redirect_to_slash(binary(), cowboy_req:req()) -> {ok, cowboy_req:req(), any()}.
redirect_to_slash(Location, Req) ->
cowboy_req:reply(301, #{<<"location">> => Location}, <<>>, Req),
{ok, [], []}.