package cc.blynk.server.application.handlers.main.logic.dashboard.device; import cc.blynk.server.application.handlers.main.auth.AppStateHolder; import cc.blynk.server.core.dao.SessionDao; import cc.blynk.server.core.dao.TokenManager; import cc.blynk.server.core.model.DashBoard; import cc.blynk.server.core.model.auth.Session; import cc.blynk.server.core.model.device.Device; import cc.blynk.server.core.protocol.exceptions.IllegalCommandException; import cc.blynk.server.core.protocol.model.messages.StringMessage; import cc.blynk.utils.ArrayUtil; import cc.blynk.utils.ParseUtil; import io.netty.channel.ChannelHandlerContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import static cc.blynk.utils.BlynkByteBufUtil.ok; import static cc.blynk.utils.StringUtils.split2; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 01.02.16. */ public class DeleteDeviceLogic { private static final Logger log = LogManager.getLogger(DeleteDeviceLogic.class); private final TokenManager tokenManager; private final SessionDao sessionDao; public DeleteDeviceLogic(TokenManager tokenManager, SessionDao sessionDao) { this.tokenManager = tokenManager; this.sessionDao = sessionDao; } public void messageReceived(ChannelHandlerContext ctx, AppStateHolder state, StringMessage message) { String[] split = split2(message.body); if (split.length < 2) { throw new IllegalCommandException("Wrong income message format."); } int dashId = ParseUtil.parseInt(split[0]) ; int deviceId = ParseUtil.parseInt(split[1]); if (deviceId == 0) { throw new IllegalCommandException("You are not allowed to remove device with id 0."); } DashBoard dash = state.user.profile.getDashByIdOrThrow(dashId); log.debug("Deleting device with id {}.", deviceId); int existingDeviceIndex = dash.getDeviceIndexById(deviceId); Device device = dash.devices[existingDeviceIndex]; tokenManager.deleteDevice(device); Session session = sessionDao.userSession.get(state.userKey); session.closeHardwareChannelByDeviceId(dashId, deviceId); dash.devices = ArrayUtil.remove(dash.devices, existingDeviceIndex, Device.class); dash.updatedAt = System.currentTimeMillis(); state.user.lastModifiedTs = dash.updatedAt; ctx.writeAndFlush(ok(message.id), ctx.voidPromise()); } }