
package org.jeecg.modules.workFlow.flowlong.engine;

import org.jeecg.modules.workFlow.flowlong.engine.assist.Assert;
import org.jeecg.modules.workFlow.flowlong.engine.core.FlowCreator;
import org.jeecg.modules.workFlow.flowlong.engine.entity.FlwTaskActor;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * 任务访问策略类
 * <p>
 * 用于判断给定的创建人员是否允许执行某个任务
 * </p>
 *

 */
public interface TaskAccessStrategy {

    /**
     * 根据创建人ID、参与者集合判断是否允许访问所属任务
     *
     * @param userId     用户ID
     * @param taskActors 参与者列表
     * @return 被允许参与者 {@link FlwTaskActor}
     */
    FlwTaskActor isAllowed(String userId, List<FlwTaskActor> taskActors);

    /**
     * 获取指定合法参与者对象
     * <p>
     * 被使用在：分配任务，解决委派任务 场景
     * </p>
     *
     * @param taskId      当前任务ID
     * @param taskActors  通过任务ID查询到的任务参与者列表
     * @param flowCreator 任务参与者
     * @return {@link FlwTaskActor}
     */
    default FlwTaskActor getAllowedFlwTaskActor(Long taskId, FlowCreator flowCreator, List<FlwTaskActor> taskActors) {
        Optional<FlwTaskActor> taskActorOpt = taskActors.stream().filter(t -> Objects.equals(t.getActorId(), flowCreator.getCreateId())).findFirst();
        Assert.isTrue(!taskActorOpt.isPresent(), "Not authorized to perform this task");
        return taskActorOpt.get();
    }
}
