package cn.axzo.workflow.starter.mq.broadcast.filter;

import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.workflow.common.constant.BpmnConstants;
import org.springframework.core.Ordered;

/**
 * 一个基于某个具体的 MQ 消息的过滤接口
 *
 * @author wangli
 * @since 2024/6/5 16:08
 */
public interface BasicMessageQueueFilter<T> extends Ordered {

    /**
     * 基于具体的 {@link Event.EventCode#module} 下的自定义的 MQ 过滤器
     *
     * @param event   事件原对象
     * @param context event 上下文对象，包含 msgId，headers 等信息，其中 <br/>
     *                有 MQ 消息归属哪个应用，使用 {@link BpmnConstants#MQ_OWNERSHIP_APPLICATION} 获取值;<br/>
     *                还有 MQ 消息归属哪个业务 ID，使用 {@link BpmnConstants#MQ_OWNERSHIP_PROCESS_DEFINITION_KEY} 获取值.
     *                <p>获取归属应用示例：
     *                <pre>String owner_application = new String(context.getHeaders().getOrDefault(MQ_OWNERSHIP_APPLICATION, new byte[0]), StandardCharsets.UTF_8);</pre>
     * @param data    payload 被转换后的目标对象
     * @return 返回 true 时，将<strong color=orange>跳过</strong>该 {@link Event} 消息，不进行消费
     */
    default boolean doFilter(Event event, EventConsumer.Context context, T data) {
        return false;
    }
}
