
package com.tmerclub.cloud.search.listener;

import com.tmerclub.cloud.api.product.feign.SkuFeignClient;
import com.tmerclub.cloud.api.product.feign.SpuFeignClient;
import com.tmerclub.cloud.common.cache.constant.CacheNames;
import com.tmerclub.cloud.common.cache.util.RedisUtil;
import com.tmerclub.cloud.common.product.vo.SkuVO;
import com.tmerclub.cloud.common.util.BeanUtil;
import com.tmerclub.cloud.search.bo.SkuBO;
import com.tmerclub.cloud.search.canal.model.CanalBinLogResult;
import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * @author tmerclub
 * @date 2020/11/13
 */
@Component
public class SkuCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor<SkuBO> {

    private static final Logger log = LoggerFactory.getLogger(SkuCanalListener.class);

    @DubboReference
    private SpuFeignClient spuFeignClient;
    @DubboReference
    private SkuFeignClient skuFeignClient;

    /**
     * 插入商品，此时插入es
     */
    @Override
    protected void processInsertInternal(CanalBinLogResult<SkuBO> result) {
        // 更新之后的数据
        SkuBO afterData = result.getAfterData();
        // 供应商sku插入时，需要更新代销商品的数据 --
        // 没有供应商skuId的不一定就是供应商商品，但有供应商skuId一定为null，此处过滤一部分sku
        // 如果在此处判断是否为供应商sku，需要查询spu的数据，也就是至少一次的查询，所以这里简单过滤下就好了，不做spu查询
        if (Objects.isNull(afterData.getSupplierSkuId())) {
            spuFeignClient.processSupplierSkuInsert(afterData.getSpuId(), afterData.getSkuId());
        }
    }

    /**
     * 更新商品，删除商品索引，再重新构建一个
     */
    @Override
    protected void processUpdateInternal(CanalBinLogResult<SkuBO> result) {
        //更新前的数据
        SkuVO beforeData = BeanUtil.map(result.getBeforeData(), SkuVO.class);
        // 更新之后的数据
        SkuVO afterData = BeanUtil.map(result.getAfterData(), SkuVO.class);
        log.info("更新sku before:{}, after:{}", beforeData, afterData);
        // 更新sku信息
        skuFeignClient.processSkuUpdate(beforeData, afterData);

        // 批量删除与sku关联的缓存信息
        RedisUtil.del(CacheNames.SKU_WITH_ATTR_LIST_KEY + CacheNames.UNION + afterData.getSpuId(),
                CacheNames.SKU_KEY + CacheNames.UNION + afterData.getSkuId());
    }
}
