public static void messageReceived(Holder holder, ChannelHandlerContext ctx, User user, StringMessage message) { int dashId = Integer.parseInt(message.body); //todo all this is very ugly, however takes 5 min for implementation, also this is rare feature DashBoard dash = user.profile.getDashByIdOrThrow(dashId); DashBoard copiedDash = CopyUtil.deepCopy(dash); copiedDash.eraseWidgetValues(); String json = JsonParser.toJsonRestrictiveDashboard(copiedDash); String qrToken = TokenGeneratorUtil.generateNewToken(); holder.blockingIOProcessor.executeDB(() -> { MessageBase result; try { boolean insertStatus = holder.dbManager.insertClonedProject(qrToken, json); if (insertStatus || holder.fileManager.writeCloneProjectToDisk(qrToken, json)) { result = makeASCIIStringMessage(GET_CLONE_CODE, message.id, qrToken); } else { log.error("Creating clone project failed for {}", user.email); result = serverError(message.id); } } catch (Exception e) { log.error("Error cloning project.", e); result = serverError(message.id); } ctx.writeAndFlush(result, ctx.voidPromise()); }); } }
@GET @Path("{token}/qr") @Metric(HTTP_QR) public Response getQR(@PathParam("token") String token) { TokenValue tokenValue = tokenManager.getTokenValueByToken(token); if (tokenValue == null) { log.debug("Requested token {} not found.", token); return badRequest("Invalid token."); } DashBoard dash = tokenValue.dash; String qrToken = TokenGeneratorUtil.generateNewToken(); String json = JsonParser.toJsonRestrictiveDashboard(dash); blockingIOProcessor.executeDB(() -> { try { boolean insertStatus = dbManager.insertClonedProject(qrToken, json); if (!insertStatus && !fileManager.writeCloneProjectToDisk(qrToken, json)) { log.error("Creating clone project failed for {}", tokenValue.user.email); } } catch (Exception e) { log.error("Error cloning project for {}.", tokenValue.user.email, e); } }); //todo generate QR on client side. String cloneQrString = "blynk://token/clone/" + qrToken + "?server=" + host + "&port=" + httpsPort; byte[] qrDataBinary = QRCode.from(cloneQrString).to(ImageType.PNG).stream().toByteArray(); return ok(qrDataBinary, "image/png"); }