package com.zsc.edu.gateway.framework.mybatisplus;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 数据权限注解切面
 */
@Aspect
@Component
public class DataScopeAspect {

    /**
     * 环绕通知，拦截带有 @DataPermission 注解的方法
     * @param joinPoint
     * @throws Throwable
     */
    @Around("@annotation(DataPermission)()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        // 获取方法上的 @DataPermission 注解
        DataPermission dataPermission = method.getAnnotation(DataPermission.class);

        if (dataPermission != null) {
            // 将注解信息存储在上下文中，供 MyBatis 拦截器使用
            DataPermissionContext.set(dataPermission);
        }

        try {
            // 执行目标方法
            return joinPoint.proceed();
        } finally {
            // 方法执行完毕，清除数据权限上下文，避免内存泄露
            DataPermissionContext.clear();
        }
    }
}
