package com.rj.tenant;

/**
 * 多租户上下文持有器，用于在当前线程中保存和获取租户ID。
 *
 * <p>
 * 典型使用场景：
 * <ul>
 *     <li>在请求入口（过滤器 / 拦截器）中根据 Header / Token 解析出租户ID并设置；</li>
 *     <li>MyBatis-Plus 的 TenantLineHandler 从此处读取当前租户；</li>
 *     <li>业务代码中偶尔需要获取当前请求所在的租户。</li>
 * </ul>
 * 使用完成后务必调用 {@link #clear()} 清理，避免线程复用导致租户串用。
 * </p>
 */
public final class TenantContextHolder {

    private static final ThreadLocal<String> TENANT_ID_HOLDER = new ThreadLocal<>();

    private TenantContextHolder() {
        // 工具类，禁止实例化
    }

    /**
     * 设置当前线程的租户ID。
     *
     * @param tenantId 租户ID，允许为 null（表示无租户上下文）
     */
    public static void setTenantId(String tenantId) {
        TENANT_ID_HOLDER.set(tenantId);
    }

    /**
     * 获取当前线程的租户ID。
     *
     * @return 当前租户ID，可能为 null
     */
    public static String getTenantId() {
        return TENANT_ID_HOLDER.get();
    }

    /**
     * 清理当前线程保存的租户ID，防止线程复用导致的租户串用。
     */
    public static void clear() {
        TENANT_ID_HOLDER.remove();
    }
}


