package com.boco.nbd.wios.wx.permisson;

import com.boco.nbd.wios.manage.service.impl.TokenService;
import com.boco.nbd.wios.manage.util.SpringContextUtil;
import com.ihidea.core.support.exception.ServiceException;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @author kevin
 * @create 2020/11/27
 */
@Component
@Aspect
public class WxPermissionAspect implements Ordered {

    @Autowired
    private TokenService tokenService;

    @Before(value = "@within(WxPermission) || @annotation(WxPermission)")
    public void beforeMethod(JoinPoint joinPoint){
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Method method = signature.getMethod();
        WxPermission wxPermission = method.getAnnotation(WxPermission.class);
        if(wxPermission == null){
            wxPermission = method.getDeclaringClass().getAnnotation(WxPermission.class);
        }
        if(wxPermission != null && wxPermission.require()){
            String token = SpringContextUtil.getToken();
            if(StringUtils.isBlank(token) || !tokenService.verifyWxToken(token)){
                throw new ServiceException("401", "登录失效,请重新登录");
            }
        }
    }

    @Override
    public int getOrder() {
        return Integer.MAX_VALUE;
    }
}