Рефакторинг обработчиков. Часть 2 #21
This commit is contained in:
@@ -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, [], []}.
|
||||
Reference in New Issue
Block a user