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

/**
 * 对象级权限服务。
 */
public interface ObjectPermissionService {

    /**
     * 返回支持的对象类型。
     */
    String getObjectType();

    /**
     * 校验当前登录用户是否具备对象权限。
     *
     * @param objectId 对象编号
     * @param permission 权限码
     * @param memberOnly 是否只要求成员身份
     */
    void checkPermission(Long objectId, String permission, boolean memberOnly);

    /**
     * 判断当前登录用户是否具备指定对象上的指定权限码（非抛模式）。
     *
     * 与 {@link #checkPermission(Long, String, boolean)} 区别：
     * 本方法不抛异常，纯返回 boolean，用于"无权限就走降级路径"而非"无权限就 403"的场景。
     *
     * @param objectId   对象 ID（如 projectId）
     * @param permission 权限码，如 {@code project:task:query}
     * @return true=具备，false=不具备
     */
    boolean hasPermission(Long objectId, String permission);

    /**
     * 可访问性门禁：当前登录用户是否「能进入」该对象（显式成员 OR 数据范围 scope 兜底）。
     * 不可访问（含对象不存在）一律抛 ..._OBJECT_PERMISSION_DENIED，不暴露对象是否存在（见 spec §3.3）。
     *
     * @param objectId 对象编号
     */
    void checkAccessible(Long objectId);

    /**
     * 读路径鉴权（成员 OR 可见性配置兜底）：
     * 成员凭 permission 权限码放行；非成员 / 成员无该权限码时，凭用户可见性配置（通道 3，
     * type=all 或方向命中）放行；都不满足抛 ..._OBJECT_PERMISSION_DENIED。
     * 仅用于对象内读接口，不调超管短路 / 组织负责人通道 / 完整数据范围。
     *
     * @param objectId   对象编号（如 projectId）
     * @param permission 权限码，如 {@code project:task:query}
     */
    void checkPermissionOrVisibility(Long objectId, String permission);

}
