とりあえず、サーバ側の実装してみた。
requestSendMessage時に発行するmethodはmessages.modifyにした。
で対応するサービスは、MessageServiceのcreateMessage。
messages.modifyがクライアントから飛んでくると、必ずcreateMessageが呼ばれる、
のではなく、msgCollIdなるパラメータに何かしらの値が入っているとき、
のみらしい。
msgCollIdというのは、どうもMessageを束ねるもののIDらしい。よくわかんないけど。
とりあえず使わないので考えない。
クライアントからはダミーのmsgCollIdを送付するようにして、messages.modifyのときは
必ずcreateMessageが呼ばれるようにした。
で、以下createMessageの実装。
public Future<Void> createMessage(UserId userId, String appId, String msgCollId, Message message,
SecurityToken token) throws ProtocolException {
logic.createMessage(userId, appId, msgCollId, message, token);
return ImmediateFuture.newInstance(null);
}
こんだけ。
何も考えずにlogicへパス。
でlogic。
public void createMessage(UserId userId, String appId, String msgCollId, Message message,
SecurityToken token) throws ProtocolException {
logger.info("メッセージ生成開始:");
String viewerId = token.getViewerId();
String ownerId = token.getOwnerId();
GmsPerson viewer = null;
try {
if (StringUtils.hasText(viewerId)) {
viewer = gmsPersonDao.selectByLoginId(viewerId);
}
}
catch (ObjectRetrievalFailureException ex) {
}
if (viewer == null) {
if (logger.isDebugEnabled()) {
logger.debug("Guestは送信できない:");
}
throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
"Guestのため、送信できない");
}
if (! isInstalledGadget(viewer, token.getModuleId())) {
if (logger.isDebugEnabled()) {
logger.debug("ガジェット未インストール:"
+ "viewerId:[" + viewer.getLoginId() + "]:"
+ "ガジェットID:[" + token.getModuleId() + "]"
);
}
throw new ProtocolException(HttpServletResponse.SC_FORBIDDEN,
"未インストールのため、送信できない:loginid:[" + viewer.getLoginId() + "]");
}
GmsPerson owner = gmsPersonDao.selectByLoginId(ownerId);
String fromLoginId = userId.getUserId(token);
GmsPerson fromUser = gmsPersonDao.selectByLoginId(fromLoginId);
for (String recip: message.getRecipients()) {
GmsMessage gmsMessage = new GmsMessage();
gmsMessage.setId(UuidGenerator.compress(UuidGenerator.generate()));
gmsMessage.setFromPersonId(fromUser.getId());
UserId toUserId = new UserId(UserId.Type.jsonValueOf(recip), recip);
String recipLoginId = toUserId.getUserId(token);
GmsPerson recipPerson = gmsPersonDao.selectByLoginId(recipLoginId);
gmsMessage.setToPersonId(recipPerson.getId());
if (StringUtils.hasText(message.getBody())) {
gmsMessage.setBody(message.getBody());
}
else {
gmsMessage.setBody("");
}
gmsMessage.setBodyId("");
if (StringUtils.hasText(message.getTitle())) {
gmsMessage.setTitle(message.getTitle());
}
else {
gmsMessage.setTitle("");
}
gmsMessage.setTitleId("");
gmsMessage.setType(message.getType().toString());
gmsMessage.setCreatedAt(new Timestamp(System.currentTimeMillis()));
gmsMessageDao.insert(gmsMessage);
}
logger.info("メッセージ生成終了:");
}
へっぽこだけどまぁいいや。
ただ単にmessageテーブルにinsert。
チェックとは考えてない。
lockedDomain機能を有効にしてガジェット毎に別ドメインにしているので、
認証済みクッキーは飛んでこない。なので、securityTokenのみでチェックしている。
で、実行と。
ちゃんとDBに保存された。
.
0 コメント:
コメントを投稿