Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions src/services/p3photoservice.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
*******************************************************************************/
#include "p3photoservice.h"
#include "rsitems/rsphotoitems.h"
#include "rsitems/rsgxscommentitems.h"
#include "retroshare/rsgxsflags.h"
#include <retroshare/rsidentity.h>

RsPhoto *rsPhoto = NULL;

Expand Down Expand Up @@ -349,3 +351,120 @@ bool p3PhotoService::getAlbums(const std::list<RsGxsGroupId> &groupIds,
return getAlbum(token, albums) && !albums.empty();
}

bool p3PhotoService::getRelatedComments(const RsGxsGroupId& gid, const std::set<RsGxsMessageId>& messageIds, std::vector<RsGxsComment> &comments)
{
std::vector<RsGxsGrpMsgIdPair> msgIds;

for (auto& msg : messageIds)
msgIds.push_back(RsGxsGrpMsgIdPair(gid, msg));

RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_MSG_RELATED_DATA;
opts.mOptions = RS_TOKREQOPT_MSG_THREAD | RS_TOKREQOPT_MSG_LATEST;

uint32_t token;
if (!requestMsgRelatedInfo(token, opts, msgIds) || waitToken(token) != RsTokenService::COMPLETE)
return false;

return getRelatedComments(token, comments);
}

bool p3PhotoService::voteForComment(const RsGxsGroupId& postGroupId, const RsGxsMessageId& postMsgId,
const RsGxsMessageId& postCommentId, const RsGxsId& authorId,
RsGxsVoteType tVote,
RsGxsMessageId& voteId, std::string& errorMessage)
{
// Basic checks
if(!rsIdentity->isOwnId(authorId))
{
errorMessage = "Vote submitted with an ID that is not yours!";
return false;
}

// Retrieve the parent message metadata and check if it's already voted
uint32_t meta_token;
RsTokReqOptions opts;
GxsMsgReq msgReq;
msgReq[postGroupId] = { postCommentId };
opts.mReqType = GXS_REQUEST_TYPE_MSG_META;

if (!requestMsgInfo(meta_token, opts, msgReq) || waitToken(meta_token) != RsTokenService::COMPLETE)
{
errorMessage = "GXS operation failed while retrieving parent message.";
return false;
}

GxsMsgMetaMap msgMetaInfo;
if (!RsGenExchange::getMsgMeta(meta_token, msgMetaInfo) || msgMetaInfo.size() != 1 || msgMetaInfo.begin()->second.size() != 1)
{
errorMessage = "Failure to find parent post!";
return false;
}

if (msgMetaInfo.begin()->second.front().mMsgStatus & GXS_SERV::GXS_MSG_STATUS_VOTE_MASK)
{
errorMessage = "Post has already been voted";
return false;
}

// Create the vote
RsGxsVote vote_msg;
vote_msg.mMeta.mGroupId = postGroupId;
vote_msg.mMeta.mThreadId = postMsgId;
vote_msg.mMeta.mParentId = postCommentId;
vote_msg.mMeta.mAuthorId = authorId;
vote_msg.mVoteType = (tVote == RsGxsVoteType::UP) ? GXS_VOTE_UP : GXS_VOTE_DOWN;

RsGxsVoteItem* msgItem = new RsGxsVoteItem(getServiceInfo().serviceTypeUInt16());
msgItem->mMsg = vote_msg;
msgItem->meta = vote_msg.mMeta;

uint32_t vote_token;
publishMsg(vote_token, msgItem);

if (waitToken(vote_token) != RsTokenService::COMPLETE)
{
errorMessage = "GXS operation failed while publishing vote.";
return false;
}

RsMsgMetaData vote_meta;
if (!RsGenExchange::getPublishedMsgMeta(vote_token, vote_meta))
{
errorMessage = "Failure getting generated vote data.";
return false;
}

voteId = vote_meta.mMsgId;

// Update the parent message vote status
uint32_t status_token;
uint32_t vote_flag = (vote_msg.mVoteType == GXS_VOTE_UP) ? GXS_SERV::GXS_MSG_STATUS_VOTE_UP : GXS_SERV::GXS_MSG_STATUS_VOTE_DOWN;
setMsgStatusFlags(status_token, RsGxsGrpMsgIdPair(postGroupId, postCommentId), vote_flag, GXS_SERV::GXS_MSG_STATUS_VOTE_MASK);

if (waitToken(status_token) != RsTokenService::COMPLETE)
{
errorMessage = "GXS operation failed while updating vote status.";
return false;
}

return true;
}

bool p3PhotoService::setCommentReadStatus(const RsGxsGrpMsgIdPair& msgId, bool read)
{
uint32_t mask = GXS_SERV::GXS_MSG_STATUS_GUI_NEW | GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD;
uint32_t status = read ? 0 : GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD;

uint32_t token;
setMsgStatusFlags(token, msgId, status, mask);

if (waitToken(token) != RsTokenService::COMPLETE)
return false;

RsGxsGrpMsgIdPair p;
acknowledgeMsg(token, p);

return true;
}

9 changes: 9 additions & 0 deletions src/services/p3photoservice.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,15 @@ class p3PhotoService : public RsGenExchange, public RsPhoto
return true;
}

/* Blocking versions of RsGxsCommentService */
virtual bool getRelatedComments(const RsGxsGroupId& gid, const std::set<RsGxsMessageId>& msgIds, std::vector<RsGxsComment> &comments) override;
virtual bool voteForComment(const RsGxsGroupId& postGroupId, const RsGxsMessageId& postMsgId,
const RsGxsMessageId& postCommentId, const RsGxsId& authorId,
RsGxsVoteType vote,
RsGxsMessageId& voteId = RS_DEFAULT_STORAGE_PARAM(RsGxsMessageId),
std::string& errorMessage = RS_DEFAULT_STORAGE_PARAM(std::string)) override;
virtual bool setCommentReadStatus(const RsGxsGrpMsgIdPair& msgId, bool read) override;


// Blocking versions.
virtual bool createComment(RsGxsComment &msg) override
Expand Down
Loading