package cc.blynk.server.application.handlers.main.logic; import cc.blynk.server.core.BlockingIOProcessor; import cc.blynk.server.core.model.auth.User; import cc.blynk.server.core.protocol.model.messages.ResponseMessage; import cc.blynk.server.core.protocol.model.messages.StringMessage; import cc.blynk.server.db.DBManager; import cc.blynk.server.db.model.Redeem; 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.Response.NOT_ALLOWED; import static cc.blynk.server.core.protocol.enums.Response.OK; /** * Handler responsible for handling redeem logic. Unlocks premium content for predefined tokens. * Used for kickstarter backers and other companies that paid for redeeming. * * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 02.03.16. */ public class RedeemLogic { private static final Logger log = LogManager.getLogger(RedeemLogic.class); private final BlockingIOProcessor blockingIOProcessor; private final DBManager dbManager; public RedeemLogic(DBManager dbManager, BlockingIOProcessor blockingIOProcessor) { this.blockingIOProcessor = blockingIOProcessor; this.dbManager = dbManager; } public void messageReceived(ChannelHandlerContext ctx, User user, StringMessage message) { String redeemToken = message.body; blockingIOProcessor.executeDB(() -> ctx.writeAndFlush(verifyToken(message, redeemToken, user), ctx.voidPromise())); } private ResponseMessage verifyToken(StringMessage message, String redeemToken, User user) { try { Redeem redeem = dbManager.selectRedeemByToken(redeemToken); if (redeem != null) { if (redeem.isRedeemed && redeem.email.equals(user.email)) { return new ResponseMessage(message.id, OK); } else if (!redeem.isRedeemed && dbManager.updateRedeem(user.email, redeemToken)) { unlockContent(user, redeem.reward); return new ResponseMessage(message.id, OK); } } } catch (Exception e) { log.debug("Error redeeming token.", e); } return new ResponseMessage(message.id, NOT_ALLOWED); } private void unlockContent(User user, int reward) { user.purchaseEnergy(reward); log.info("Unlocking content for {}. Reward {}.", user.email, reward); } }