RequestContextFilter.java

package fr.avenirsesr.portfolio.api.infrastructure.context;

import fr.avenirsesr.portfolio.api.domain.model.enums.ELanguage;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

@Component("userRequestContextFilter")
@Slf4j
public class RequestContextFilter extends OncePerRequestFilter {
  @Override
  protected void doFilterInternal(
      HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {

    try {
      var languageCode = Optional.ofNullable(request.getHeader("Accept-Language"));
      if (languageCode.isEmpty()) {
        log.error(
            "Accept-Language header not present, using fallback language {}", ELanguage.FALLBACK);
        languageCode = Optional.of(ELanguage.FALLBACK.getCode());
      }
      ELanguage preferredLanguage = ELanguage.fromCode(languageCode.get());

      RequestContext.set(new RequestData(preferredLanguage));

      filterChain.doFilter(request, response);
    } finally {
      RequestContext.clear();
    }
  }
}