package io.kaif.web; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import io.kaif.model.account.AccountAccessToken; import io.kaif.service.AccountService; import io.kaif.web.support.AccessDeniedException; public class AccountAccessTokenArgumentResolver implements HandlerMethodArgumentResolver { private final AccountService accountService; public AccountAccessTokenArgumentResolver(AccountService accountService) { this.accountService = accountService; } @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType() == AccountAccessToken.class; } @Override public AccountAccessToken resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String token = webRequest.getHeader(AccountAccessToken.HEADER_KEY); // we only verify in memory for all request http method // service layer should decide check database if mutation is critical return accountService.tryDecodeAccessToken(token).orElseThrow(AccessDeniedException::new); } }