package com.bawei.cache.aspect;

import com.bawei.cache.annotation.CacheRole;
import com.bawei.common.core.exception.ServiceException;
import com.bawei.common.core.utils.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @author DongZl
 * @description: 缓存操作权限切面
 * @Date 2022-10-19 上午 08:36
 */
@Aspect
@Component
public class CacheRuleAsp {

    /**
     * 当前服务的名称
     */
    @Value("${spring.application.name}")
    private String applicationName;


    /**
     * 定义AOP签名 (切入所有使用鉴权注解的方法)
     */
    public static final String POINTCUT_SIGN = "@annotation(com.bawei.cache.annotation.CacheRole)";

    /**
     * 声明AOP切点
     */
    @Pointcut(POINTCUT_SIGN)
    public void pointcut()
    {
    }

    /**
     * 环绕切入
     *
     * @param joinPoint 切面对象
     * @return 底层方法执行后的返回值
     * @throws Throwable 底层方法抛出的异常
     */
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        // 注解鉴权
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 获取注解的方法
        Method method = signature.getMethod();
        // 获取方法上面的注解
        CacheRole cacheRole = method.getAnnotation(CacheRole.class);
        if (cacheRole != null){
            // 判断当前微服务是否要操作权限
            if (!cacheRole.serverName().equals(applicationName)){
                throw new ServiceException(StringUtils.format("当前服务[{}]，无权限操作服务[{}]的缓存",
                        applicationName,
                        cacheRole.serverName()));
            }
        }
        return joinPoint.proceed();
    }
}
