feat(delayed): add i18n support for delayed

This commit is contained in:
firest 2022-04-19 18:12:42 +08:00
parent f69b21d020
commit d02ac812e6
4 changed files with 212 additions and 40 deletions

View File

@ -0,0 +1,164 @@
emqx_delayed_api {
view_status_api {
desc {
en: "Get delayed status"
zh: "查看慢订阅状态"
}
}
update_api {
desc {
en: "Enable or disable delayed, set max delayed messages"
zh: "开启或者关闭功能,或者设置延迟消息数量上限"
}
}
update_success {
desc {
en: "Enable or disable delayed successfully"
zh: "开启或者关闭功能操作成功"
}
}
illegality_limit {
desc {
en: "Max limit illegality"
zh: "数量上限不合法"
}
}
get_message_api {
desc {
en: "View delayed message"
zh: "查看延迟消息"
}
}
node {
desc {
en: "The node where message from"
zh: "消息的来源节点"
}
}
msgid {
desc {
en: "Delayed Message ID"
zh: "延迟消息 ID"
}
}
bad_msgid_format {
desc {
en: "Bad Message ID format"
zh: "消息 ID 格式错误"
}
}
msgid_not_found {
desc {
en: "Message ID not found"
zh: "未找到对应消息"
}
}
delete_api {
desc {
en: "Delete delayed message"
zh: "删除延迟消息"
}
}
list_api {
desc {
en: "List delayed messages"
zh: "查看延迟消息列表"
}
}
view_page {
desc {
en: "View page"
zh: "查看的页数"
}
}
view_limit {
desc {
en: "Page limit"
zh: "每页数量"
}
}
count {
desc {
en: "Count of delayed messages"
zh: "延迟消息总数"
}
}
publish_at {
desc {
en: "Clinet publish message time, in RFC 3339 format"
zh: "客户端发送时间, RFC 3339 格式"
}
}
delayed_interval {
desc {
en: "Delayed interval(second)"
zh: "延迟时间(秒)"
}
}
delayed_remaining {
desc {
en: "Delayed remaining(second)"
zh: "剩余时间(秒)"
}
}
expected_at {
desc {
en: "Expect publish time, in RFC 3339 format"
zh: "期望的发送时间, RFC 3339 格式"
}
}
topic {
desc {
en: "Topic"
zh: "主题"
}
}
qos {
desc {
en: "QoS"
zh: "QoS"
}
}
from_clientid {
desc {
en: "From ClientID"
zh: "消息的 ClientID"
}
}
from_username {
desc {
en: "From Username"
zh: "消息的 Username"
}
}
payload {
desc {
en: "Payload, base64 encoded. Payload will be set to 'PAYLOAD_TO_LARGE' if its length is larger than 2048 bytes"
zh: "消息内容, base64 格式。如果消息的大小超过 2048 字节,则消息内容会被设置为 'PAYLOAD_TO_LARGE'"
}
}
}

View File

@ -71,4 +71,17 @@ all全部重写主题"""
} }
} }
enable {
desc {
en: "Enable this feature"
zh: "是否开启该功能"
}
}
max_delayed_messages {
desc {
en: "Maximum number of delayed messages (0 is no limit)."
zh: "延迟消息的数量上限(0 代表无限)"
}
}
} }

View File

@ -19,13 +19,11 @@
-behaviour(minirest_api). -behaviour(minirest_api).
-include_lib("typerefl/include/types.hrl"). -include_lib("typerefl/include/types.hrl").
-include_lib("hocon/include/hoconsc.hrl").
-include("emqx_modules.hrl"). -include("emqx_modules.hrl").
-import(hoconsc, [mk/2, ref/1, ref/2]). -import(hoconsc, [mk/2, ref/1, ref/2]).
-define(MAX_PAYLOAD_LENGTH, 2048).
-define(PAYLOAD_TOO_LARGE, <<"PAYLOAD_TOO_LARGE">>).
-export([ -export([
status/2, status/2,
delayed_messages/2, delayed_messages/2,
@ -43,6 +41,9 @@
-export([api_spec/0]). -export([api_spec/0]).
-define(MAX_PAYLOAD_LENGTH, 2048).
-define(PAYLOAD_TOO_LARGE, <<"PAYLOAD_TOO_LARGE">>).
-define(INTERNAL_ERROR, 'INTERNAL_ERROR'). -define(INTERNAL_ERROR, 'INTERNAL_ERROR').
-define(BAD_REQUEST, 'BAD_REQUEST'). -define(BAD_REQUEST, 'BAD_REQUEST').
@ -65,24 +66,23 @@ schema("/mqtt/delayed") ->
'operationId' => status, 'operationId' => status,
get => #{ get => #{
tags => ?API_TAG_MQTT, tags => ?API_TAG_MQTT,
description => <<"Get delayed status">>, description => ?DESC(view_status_api),
summary => <<"Get delayed status">>,
responses => #{ responses => #{
200 => ref(emqx_modules_schema, "delayed") 200 => ref(emqx_modules_schema, "delayed")
} }
}, },
put => #{ put => #{
tags => ?API_TAG_MQTT, tags => ?API_TAG_MQTT,
description => <<"Enable or disable delayed, set max delayed messages">>, description => ?DESC(update_api),
'requestBody' => ref(emqx_modules_schema, "delayed"), 'requestBody' => ref(emqx_modules_schema, "delayed"),
responses => #{ responses => #{
200 => mk( 200 => mk(
ref(emqx_modules_schema, "delayed"), ref(emqx_modules_schema, "delayed"),
#{desc => <<"Enable or disable delayed successfully">>} #{desc => ?DESC(update_success)}
), ),
400 => emqx_dashboard_swagger:error_codes( 400 => emqx_dashboard_swagger:error_codes(
[?BAD_REQUEST], [?BAD_REQUEST],
<<"Max limit illegality">> ?DESC(illegality_limit)
) )
} }
} }
@ -92,47 +92,47 @@ schema("/mqtt/delayed/messages/:node/:msgid") ->
'operationId' => delayed_message, 'operationId' => delayed_message,
get => #{ get => #{
tags => ?API_TAG_MQTT, tags => ?API_TAG_MQTT,
description => <<"Get delayed message">>, description => ?DESC(get_message_api),
parameters => [ parameters => [
{node, {node,
mk( mk(
binary(), binary(),
#{in => path, desc => <<"The node where message from">>} #{in => path, desc => ?DESC(node)}
)}, )},
{msgid, mk(binary(), #{in => path, desc => <<"Delay message ID">>})} {msgid, mk(binary(), #{in => path, desc => ?DESC(msgid)})}
], ],
responses => #{ responses => #{
200 => ref("message_without_payload"), 200 => ref("message_without_payload"),
400 => emqx_dashboard_swagger:error_codes( 400 => emqx_dashboard_swagger:error_codes(
[?MESSAGE_ID_SCHEMA_ERROR, ?INVALID_NODE], [?MESSAGE_ID_SCHEMA_ERROR, ?INVALID_NODE],
<<"Bad MsgId format">> ?DESC(bad_msgid_format)
), ),
404 => emqx_dashboard_swagger:error_codes( 404 => emqx_dashboard_swagger:error_codes(
[?MESSAGE_ID_NOT_FOUND], [?MESSAGE_ID_NOT_FOUND],
<<"MsgId not found">> ?DESC(msgid_not_found)
) )
} }
}, },
delete => #{ delete => #{
tags => ?API_TAG_MQTT, tags => ?API_TAG_MQTT,
description => <<"Delete delayed message">>, description => ?DESC(delete_api),
parameters => [ parameters => [
{node, {node,
mk( mk(
binary(), binary(),
#{in => path, desc => <<"The node where message from">>} #{in => path, desc => ?DESC(node)}
)}, )},
{msgid, mk(binary(), #{in => path, desc => <<"Delay message ID">>})} {msgid, mk(binary(), #{in => path, desc => ?DESC(msgid)})}
], ],
responses => #{ responses => #{
204 => <<"Delete delayed message success">>, 204 => <<"Delete delayed message success">>,
400 => emqx_dashboard_swagger:error_codes( 400 => emqx_dashboard_swagger:error_codes(
[?MESSAGE_ID_SCHEMA_ERROR, ?INVALID_NODE], [?MESSAGE_ID_SCHEMA_ERROR, ?INVALID_NODE],
<<"Bad MsgId format">> ?DESC(bad_msgid_format)
), ),
404 => emqx_dashboard_swagger:error_codes( 404 => emqx_dashboard_swagger:error_codes(
[?MESSAGE_ID_NOT_FOUND], [?MESSAGE_ID_NOT_FOUND],
<<"MsgId not found">> ?DESC(msgid_not_found)
) )
} }
} }
@ -142,16 +142,16 @@ schema("/mqtt/delayed/messages") ->
'operationId' => delayed_messages, 'operationId' => delayed_messages,
get => #{ get => #{
tags => ?API_TAG_MQTT, tags => ?API_TAG_MQTT,
description => <<"List delayed messages">>, description => ?DESC(list_api),
parameters => [ref(emqx_dashboard_swagger, page), ref(emqx_dashboard_swagger, limit)], parameters => [ref(emqx_dashboard_swagger, page), ref(emqx_dashboard_swagger, limit)],
responses => #{ responses => #{
200 => 200 =>
[ [
{data, mk(hoconsc:array(ref("message")), #{})}, {data, mk(hoconsc:array(ref("message")), #{})},
{meta, [ {meta, [
{page, mk(pos_integer(), #{})}, {page, mk(pos_integer(), #{desc => ?DESC(view_page)})},
{limit, mk(pos_integer(), #{})}, {limit, mk(pos_integer(), #{desc => ?DESC(view_limit)})},
{count, mk(non_neg_integer(), #{})} {count, mk(non_neg_integer(), #{desc => ?DESC(count)})}
]} ]}
] ]
} }
@ -160,24 +160,20 @@ schema("/mqtt/delayed/messages") ->
fields("message_without_payload") -> fields("message_without_payload") ->
[ [
{msgid, mk(integer(), #{desc => <<"Message Id (MQTT message id hash)">>})}, {msgid, mk(integer(), #{desc => ?DESC(msgid)})},
{node, mk(binary(), #{desc => <<"The node where message from">>})}, {node, mk(binary(), #{desc => ?DESC(node)})},
{publish_at, mk(binary(), #{desc => <<"Client publish message time, rfc 3339">>})}, {publish_at, mk(binary(), #{desc => ?DESC(publish_at)})},
{delayed_interval, mk(pos_integer(), #{desc => <<"Delayed interval, second">>})}, {delayed_interval, mk(pos_integer(), #{desc => ?DESC(delayed_interval)})},
{delayed_remaining, mk(non_neg_integer(), #{desc => <<"Delayed remaining, second">>})}, {delayed_remaining, mk(non_neg_integer(), #{desc => ?DESC(delayed_remaining)})},
{expected_at, mk(binary(), #{desc => <<"Expect publish time, rfc 3339">>})}, {expected_at, mk(binary(), #{desc => ?DESC(expected_at)})},
{topic, mk(binary(), #{desc => <<"Topic">>, example => <<"/sys/#">>})}, {topic, mk(binary(), #{desc => ?DESC(topic), example => <<"/sys/#">>})},
{qos, mk(emqx_schema:qos(), #{desc => <<"QoS">>})}, {qos, mk(emqx_schema:qos(), #{desc => ?DESC(qos)})},
{from_clientid, mk(binary(), #{desc => <<"From ClientId">>})}, {from_clientid, mk(binary(), #{desc => ?DESC(from_clientid)})},
{from_username, mk(binary(), #{desc => <<"From Username">>})} {from_username, mk(binary(), #{desc => ?DESC(from_username)})}
]; ];
fields("message") -> fields("message") ->
PayloadDesc = io_lib:format(
"Payload, base64 encoded. Payload will be set to ~p if its length is larger than ~p",
[?PAYLOAD_TOO_LARGE, ?MAX_PAYLOAD_LENGTH]
),
fields("message_without_payload") ++ fields("message_without_payload") ++
[{payload, mk(binary(), #{desc => iolist_to_binary(PayloadDesc)})}]. [{payload, mk(binary(), #{desc => ?DESC(payload)})}].
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% HTTP API %% HTTP API

View File

@ -42,9 +42,8 @@ fields("telemetry") ->
[{enable, hoconsc:mk(boolean(), #{default => false, desc => "Enable telemetry."})}]; [{enable, hoconsc:mk(boolean(), #{default => false, desc => "Enable telemetry."})}];
fields("delayed") -> fields("delayed") ->
[ [
{enable, hoconsc:mk(boolean(), #{default => false, desc => "Enable `delayed` module."})}, {enable, hoconsc:mk(boolean(), #{default => false, desc => ?DESC(enable)})},
{max_delayed_messages, {max_delayed_messages, sc(integer(), #{desc => ?DESC(max_delayed_messages)})}
sc(integer(), #{desc => "Maximum number of delayed messages (0 is no limit)."})}
]; ];
fields("rewrite") -> fields("rewrite") ->
[ [