package cc.blynk.server.application.handlers.main.logic; import cc.blynk.server.Holder; import cc.blynk.server.core.BlockingIOProcessor; import cc.blynk.server.core.dao.UserDao; import cc.blynk.server.core.model.AppName; import cc.blynk.server.core.model.DashBoard; 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.JsonParser; 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.GET_PROJECT_BY_TOKEN; import static cc.blynk.server.core.protocol.enums.Response.NOT_ALLOWED; import static cc.blynk.utils.BlynkByteBufUtil.makeBinaryMessage; import static cc.blynk.utils.BlynkByteBufUtil.makeResponse; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 2/1/2015. * */ public class GetProjectByTokenLogic { private static final Logger log = LogManager.getLogger(GetProjectByTokenLogic.class); private final BlockingIOProcessor blockingIOProcessor; private final DBManager dbManager; private final UserDao userDao; public GetProjectByTokenLogic(Holder holder) { this.blockingIOProcessor = holder.blockingIOProcessor; this.dbManager = holder.dbManager; this.userDao = holder.userDao; } public void messageReceived(ChannelHandlerContext ctx, User user, StringMessage message) { String token = message.body; blockingIOProcessor.executeDB(() -> { FlashedToken dbFlashedToken = dbManager.selectFlashedToken(token); if (dbFlashedToken == null) { log.error("{} token not exists for app {}.", token, user.appName); ctx.writeAndFlush(makeResponse(message.id, NOT_ALLOWED), ctx.voidPromise()); return; } User publishUser = userDao.getByName(dbFlashedToken.email, AppName.BLYNK); DashBoard dash = publishUser.profile.getDashById(dbFlashedToken.dashId); if (dash == null) { log.error("Dash with {} id not exists in dashboards.", dbFlashedToken.dashId); ctx.writeAndFlush(makeResponse(message.id, NOT_ALLOWED), ctx.voidPromise()); return; } write(ctx, JsonParser.gzipDashRestrictive(dash), message.id); }); } public static void write(ChannelHandlerContext ctx, byte[] data, int msgId) { if (ctx.channel().isWritable()) { ByteBuf outputMsg = makeBinaryMessage(GET_PROJECT_BY_TOKEN, msgId, data); ctx.writeAndFlush(outputMsg, ctx.voidPromise()); } } }