package org.zstack.core.webhook; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.Platform; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.MessageSafe; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.SQL; import org.zstack.core.db.SQLBatchWithReturn; import org.zstack.core.db.UpdateQuery; import org.zstack.header.AbstractService; import org.zstack.header.core.webhooks.*; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; /** * Created by xing5 on 2017/5/7. */ public class WebhookManagerImpl extends AbstractService implements WebhookManager { @Autowired private DatabaseFacade dbf; @Autowired private CloudBus bus; @Override public boolean start() { return true; } @Override public boolean stop() { return true; } @Override @MessageSafe public void handleMessage(Message msg) { if (msg instanceof APIMessage) { handleApiMessage((APIMessage) msg); } else { handleLocalMessage(msg); } } private void handleLocalMessage(Message msg) { bus.dealWithUnknownMessage(msg); } private void handleApiMessage(APIMessage msg) { if (msg instanceof APICreateWebhookMsg) { handle((APICreateWebhookMsg) msg); } else if (msg instanceof APIDeleteWebhookMsg) { handle((APIDeleteWebhookMsg) msg); } else if (msg instanceof APIUpdateWebhookMsg) { handle((APIUpdateWebhookMsg) msg); } else { bus.dealWithUnknownMessage(msg); } } private void handle(APIUpdateWebhookMsg msg) { WebhookVO vo = new SQLBatchWithReturn<WebhookVO>() { @Override protected WebhookVO scripts() { UpdateQuery q = sql(WebhookVO.class); q.eq(WebhookVO_.uuid, msg.getUuid()); boolean update = false; if (msg.getName() != null) { q.set(WebhookVO_.name, msg.getName()); update = true; } if (msg.getDescription() != null) { q.set(WebhookVO_.description, msg.getDescription()); update = true; } if (msg.getUrl() != null) { q.set(WebhookVO_.url, msg.getUrl()); update = true; } if (msg.getType() != null) { q.set(WebhookVO_.type, msg.getType()); update = true; } if (msg.getOpaque() != null) { q.set(WebhookVO_.opaque, msg.getOpaque()); update = true; } if (update) { q.update(); } return findByUuid(msg.getUuid(), WebhookVO.class); } }.execute(); APIUpdateWebhookEvent evt = new APIUpdateWebhookEvent(msg.getId()); evt.setInventory(WebhookInventory.valueOf(vo)); bus.publish(evt); } private void handle(APIDeleteWebhookMsg msg) { APIDeleteWebhookEvent evt = new APIDeleteWebhookEvent(msg.getId()); SQL.New(WebhookVO.class).eq(WebhookVO_.uuid, msg.getUuid()).hardDelete(); bus.publish(evt); } private void handle(APICreateWebhookMsg msg) { WebhookVO vo = new WebhookVO(); vo.setUuid(msg.getResourceUuid() == null ? Platform.getUuid() : msg.getResourceUuid()); vo.setName(msg.getName()); vo.setDescription(msg.getDescription()); vo.setUrl(msg.getUrl()); vo.setType(msg.getType()); vo.setOpaque(msg.getOpaque()); vo = dbf.persistAndRefresh(vo); APICreateWebhookEvent evt = new APICreateWebhookEvent(msg.getId()); evt.setInventory(WebhookInventory.valueOf(vo)); bus.publish(evt); } @Override public String getId() { return bus.makeLocalServiceId(WebhookConstants.SERVICE_ID); } }