package cc.blynk.server.application.handlers.main.logic;
import cc.blynk.server.Holder;
import cc.blynk.server.application.handlers.main.auth.AppStateHolder;
import cc.blynk.server.core.BlockingIOProcessor;
import cc.blynk.server.core.dao.UserDao;
import cc.blynk.server.core.model.DashBoard;
import cc.blynk.server.core.model.Profile;
import cc.blynk.server.core.model.auth.User;
import cc.blynk.server.core.protocol.model.messages.StringMessage;
import cc.blynk.server.db.DBManager;
import cc.blynk.server.db.model.FlashedToken;
import cc.blynk.utils.ParseUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static cc.blynk.server.core.protocol.enums.Command.LOAD_PROFILE_GZIPPED;
import static cc.blynk.server.core.protocol.enums.Response.ILLEGAL_COMMAND;
import static cc.blynk.server.core.protocol.enums.Response.NO_DATA;
import static cc.blynk.utils.BlynkByteBufUtil.makeBinaryMessage;
import static cc.blynk.utils.BlynkByteBufUtil.makeResponse;
import static cc.blynk.utils.JsonParser.*;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 2/1/2015.
*
*/
public class LoadProfileGzippedLogic {
private static final Logger log = LogManager.getLogger(LoadProfileGzippedLogic.class);
private final UserDao userDao;
private final DBManager dbManager;
private final BlockingIOProcessor blockingIOProcessor;
public LoadProfileGzippedLogic(Holder holder) {
this.userDao = holder.userDao;
this.dbManager = holder.dbManager;
this.blockingIOProcessor = holder.blockingIOProcessor;
}
public void messageReceived(ChannelHandlerContext ctx, AppStateHolder state, StringMessage message) {
//load all
if (message.length == 0) {
Profile profile = state.user.profile;
write(ctx, gzipProfile(profile), message.id);
return;
}
String[] parts = message.body.split(" |\0");
if (parts.length == 1) {
//load specific by id
int dashId = ParseUtil.parseInt(message.body);
DashBoard dash = state.user.profile.getDashByIdOrThrow(dashId);
write(ctx, gzipDash(dash), message.id);
} else {
String token = parts[0];
int dashId = ParseUtil.parseInt(parts[1]);
String publishingEmail = parts[2];
blockingIOProcessor.executeDB(() -> {
try {
FlashedToken flashedToken = dbManager.selectFlashedToken(token);
if (flashedToken != null) {
User publishingUser = userDao.getByName(publishingEmail, state.userKey.appName);
DashBoard dash = publishingUser.profile.getDashByIdOrThrow(dashId);
write(ctx, gzipDashRestrictive(dash), message.id);
}
} catch (Exception e) {
ctx.writeAndFlush(makeResponse(message.id, ILLEGAL_COMMAND), ctx.voidPromise());
log.error("Error getting publishing profile.", e.getMessage());
}
});
}
}
public static void write(ChannelHandlerContext ctx, byte[] data, int msgId) {
if (ctx.channel().isWritable()) {
ByteBuf outputMsg;
if (data == null) {
outputMsg = makeResponse(msgId, NO_DATA);
} else {
outputMsg = makeBinaryMessage(LOAD_PROFILE_GZIPPED, msgId, data);
}
ctx.writeAndFlush(outputMsg, ctx.voidPromise());
}
}
}