package com.njcn.rdms.module.project.framework.security.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 对象级权限校验注解。
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckObjectPermission {

    /**
     * 对象类型，例如 product。
     */
    String objectType();

    /**
     * 对象编号 SpEL 表达式。
     */
    String objectId();

    /**
     * 对象权限码。
     */
    String permission() default "";

    /**
     * 是否仅校验成员身份。
     */
    boolean memberOnly() default false;

    /**
     * 是否走「可访问性门禁」：显式成员 OR 数据范围 scope 兜底（与 getXxxContext 入口口径一致）。
     * 为 true 时切面调用 checkAccessible，忽略 permission / memberOnly（优先级 accessible > memberOnly > permission）。
     */
    boolean accessible() default false;

    /**
     * 读路径专用：成员凭 {@link #permission()} 查询权限码，否则凭「用户可见性配置」(system_user_visibility_config) 兜底。
     * 为 true 时切面调用 checkPermissionOrVisibility，需与 permission 同时给值。
     * 优先级：accessible > visibilityFallback > memberOnly > permission。仅用于读接口，写路径禁用。
     */
    boolean visibilityFallback() default false;

}
