Improve channels JSON API v2

list_channels return only with metadata (including the data produced
  very big JSON saturating some client buffer implementation)
add get_channel_info to get full channel data with optional thumbnail
  thumbnail is sent by default but can be avoided adding
  "want_thumbnail":false to the JSON query
rename get_channel to get_channel_content
This commit is contained in:
Gioacchino Mazzurco 2018-06-07 15:00:11 +02:00
parent e81b81dff1
commit 508951d26f
No known key found for this signature in database
GPG key ID: A1FBCA3872E87051
2 changed files with 94 additions and 26 deletions

View file

@ -51,7 +51,8 @@ ChannelsHandler::ChannelsHandler(RsGxsChannels& channels): mChannels(channels)
{ {
addResourceHandler("list_channels", this, addResourceHandler("list_channels", this,
&ChannelsHandler::handleListChannels); &ChannelsHandler::handleListChannels);
addResourceHandler("get_channel", this, &ChannelsHandler::handleGetChannel); addResourceHandler("get_channel_info", this, &ChannelsHandler::handleGetChannelInfo);
addResourceHandler("get_channel_content", this, &ChannelsHandler::handleGetChannelContent);
addResourceHandler("toggle_subscribe", this, &ChannelsHandler::handleToggleSubscription); addResourceHandler("toggle_subscribe", this, &ChannelsHandler::handleToggleSubscription);
addResourceHandler("toggle_auto_download", this, &ChannelsHandler::handleToggleAutoDownload); addResourceHandler("toggle_auto_download", this, &ChannelsHandler::handleToggleAutoDownload);
addResourceHandler("toggle_read", this, &ChannelsHandler::handleTogglePostRead); addResourceHandler("toggle_read", this, &ChannelsHandler::handleTogglePostRead);
@ -62,12 +63,77 @@ ChannelsHandler::ChannelsHandler(RsGxsChannels& channels): mChannels(channels)
void ChannelsHandler::handleListChannels(Request& /*req*/, Response& resp) void ChannelsHandler::handleListChannels(Request& /*req*/, Response& resp)
{ {
RsTokReqOptions opts; RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; opts.mReqType = GXS_REQUEST_TYPE_GROUP_META;
uint32_t token; uint32_t token;
RsTokenService& tChannels = *mChannels.getTokenService(); RsTokenService& tChannels = *mChannels.getTokenService();
tChannels.requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts); tChannels.requestGroupInfo(token, RS_DEPRECATED_TOKREQ_ANSTYPE, opts);
time_t start = time(NULL);
while((tChannels.requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
&&(tChannels.requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
&&((time(NULL) < (start+10)))) rstime::rs_usleep(500*1000);
std::list<RsGroupMetaData> grps;
if( tChannels.requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE
&& mChannels.getGroupSummary(token, grps) )
{
for( RsGroupMetaData& grp : grps )
{
KeyValueReference<RsGxsGroupId> id("channel_id", grp.mGroupId);
KeyValueReference<uint32_t> vis_msg("visible_msg_count", grp.mVisibleMsgCount);
bool own = (grp.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN);
bool subscribed = IS_GROUP_SUBSCRIBED(grp.mSubscribeFlags);
std::string lastPostTsStr = std::to_string(grp.mLastPost);
std::string publishTsStr = std::to_string(grp.mPublishTs);
resp.mDataStream.getStreamToMember()
<< id
<< makeKeyValueReference("name", grp.mGroupName)
<< makeKeyValueReference("last_post_ts", lastPostTsStr)
<< makeKeyValueReference("popularity", grp.mPop)
<< makeKeyValueReference("publish_ts", publishTsStr)
<< vis_msg
<< makeKeyValueReference("group_status", grp.mGroupStatus)
<< makeKeyValueReference("author_id", grp.mAuthorId)
<< makeKeyValueReference("parent_grp_id", grp.mParentGrpId)
<< makeKeyValueReference("own", own)
<< makeKeyValueReference("subscribed", subscribed);
}
resp.setOk();
}
else resp.setFail("Cant get data from GXS!");
}
void ChannelsHandler::handleGetChannelInfo(Request& req, Response& resp)
{
std::string chanIdStr;
req.mStream << makeKeyValueReference("channel_id", chanIdStr);
if(chanIdStr.empty())
{
resp.setFail("channel_id required!");
return;
}
RsGxsGroupId chanId(chanIdStr);
if(chanId.isNull())
{
resp.setFail("Invalid channel_id:" + chanIdStr);
return;
}
bool wantThumbnail = true;
req.mStream << makeKeyValueReference("want_thumbnail", wantThumbnail);
std::list<RsGxsGroupId> groupIds; groupIds.push_back(chanId);
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA;
uint32_t token;
RsTokenService& tChannels = *mChannels.getTokenService();
tChannels.requestGroupInfo( token, RS_DEPRECATED_TOKREQ_ANSTYPE,
opts, groupIds );
time_t start = time(NULL); time_t start = time(NULL);
while((tChannels.requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE) while((tChannels.requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
@ -78,20 +144,16 @@ void ChannelsHandler::handleListChannels(Request& /*req*/, Response& resp)
if( tChannels.requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE if( tChannels.requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE
&& mChannels.getGroupData(token, grps) ) && mChannels.getGroupData(token, grps) )
{ {
for( std::vector<RsGxsChannelGroup>::iterator vit = grps.begin(); for( RsGxsChannelGroup& grp : grps )
vit != grps.end(); ++vit )
{ {
RsGxsChannelGroup& grp = *vit;
KeyValueReference<RsGxsGroupId> id("channel_id", grp.mMeta.mGroupId); KeyValueReference<RsGxsGroupId> id("channel_id", grp.mMeta.mGroupId);
KeyValueReference<uint32_t> vis_msg("visible_msg_count", grp.mMeta.mVisibleMsgCount); KeyValueReference<uint32_t> vis_msg("visible_msg_count", grp.mMeta.mVisibleMsgCount);
bool own = (grp.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN); bool own = (grp.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN);
bool subscribed = IS_GROUP_SUBSCRIBED(grp.mMeta.mSubscribeFlags); bool subscribed = IS_GROUP_SUBSCRIBED(grp.mMeta.mSubscribeFlags);
std::string lastPostTsStr = std::to_string(grp.mMeta.mLastPost); std::string lastPostTsStr = std::to_string(grp.mMeta.mLastPost);
std::string publishTsStr = std::to_string(grp.mMeta.mPublishTs); std::string publishTsStr = std::to_string(grp.mMeta.mPublishTs);
std::string thumbnail_base64; StreamBase& rgrp(resp.mDataStream.getStreamToMember());
Radix64::encode(grp.mImage.mData, grp.mImage.mSize, thumbnail_base64); rgrp << id
resp.mDataStream.getStreamToMember()
<< id
<< makeKeyValueReference("name", grp.mMeta.mGroupName) << makeKeyValueReference("name", grp.mMeta.mGroupName)
<< makeKeyValueReference("last_post_ts", lastPostTsStr) << makeKeyValueReference("last_post_ts", lastPostTsStr)
<< makeKeyValueReference("popularity", grp.mMeta.mPop) << makeKeyValueReference("popularity", grp.mMeta.mPop)
@ -103,8 +165,14 @@ void ChannelsHandler::handleListChannels(Request& /*req*/, Response& resp)
<< makeKeyValueReference("description", grp.mDescription) << makeKeyValueReference("description", grp.mDescription)
<< makeKeyValueReference("own", own) << makeKeyValueReference("own", own)
<< makeKeyValueReference("subscribed", subscribed) << makeKeyValueReference("subscribed", subscribed)
<< makeKeyValueReference("thumbnail_base64_png", thumbnail_base64)
<< makeKeyValueReference("auto_download", grp.mAutoDownload); << makeKeyValueReference("auto_download", grp.mAutoDownload);
if(wantThumbnail)
{
std::string thumbnail_base64;
Radix64::encode(grp.mImage.mData, grp.mImage.mSize, thumbnail_base64);
rgrp << makeKeyValueReference("thumbnail_base64_png", thumbnail_base64);
}
} }
resp.setOk(); resp.setOk();
@ -112,7 +180,7 @@ void ChannelsHandler::handleListChannels(Request& /*req*/, Response& resp)
else resp.setFail("Cant get data from GXS!"); else resp.setFail("Cant get data from GXS!");
} }
void ChannelsHandler::handleGetChannel(Request& req, Response& resp) void ChannelsHandler::handleGetChannelContent(Request& req, Response& resp)
{ {
std::string chanIdStr; std::string chanIdStr;
req.mStream << makeKeyValueReference("channel_id", chanIdStr); req.mStream << makeKeyValueReference("channel_id", chanIdStr);
@ -120,7 +188,6 @@ void ChannelsHandler::handleGetChannel(Request& req, Response& resp)
{ {
resp.setFail("channel_id required!"); resp.setFail("channel_id required!");
return; return;
} }
RsGxsGroupId chanId(chanIdStr); RsGxsGroupId chanId(chanIdStr);

View file

@ -30,7 +30,8 @@ struct ChannelsHandler : ResourceRouter
private: private:
void handleListChannels(Request& req, Response& resp); void handleListChannels(Request& req, Response& resp);
void handleGetChannel(Request& req, Response& resp); void handleGetChannelInfo(Request& req, Response& resp);
void handleGetChannelContent(Request& req, Response& resp);
void handleToggleSubscription(Request& req, Response& resp); void handleToggleSubscription(Request& req, Response& resp);
void handleCreateChannel(Request& req, Response& resp); void handleCreateChannel(Request& req, Response& resp);
void handleToggleAutoDownload(Request& req, Response& resp); void handleToggleAutoDownload(Request& req, Response& resp);