Spring: Difference between revisions

From Chorke Wiki
Jump to navigation Jump to search
Line 113: Line 113:
{|
{|
| valign="top" |
| valign="top" |
* [https://blog.trifork.com/2018/08/28/spring-data-native-queries-and-projections-in-kotlin/ Spring Data Native Queries & Projections in Kotlin]
* [https://keepgrowing.in/tools/how-to-add-x-xsrf-token-header-to-postman-requests/ Spring » Postman » Add X-XSRF-TOKEN header]
* [https://keepgrowing.in/tools/how-to-add-x-xsrf-token-header-to-postman-requests/ Add X-XSRF-TOKEN header to Postman requests]
* [https://blog.trifork.com/2018/08/28/spring-data-native-queries-and-projections-in-kotlin/ Spring » Kotlin » Native Queries & Projections]
* [https://stackoverflow.com/questions/6349421/ Jackson to de-serialize an array of objects]
* [https://stackoverflow.com/questions/45230898/ Spring » Path Variable with Multiple Slash]
* [https://stackoverflow.com/questions/45230898/ Spring Path Variable with Multiple Slash]
* [https://stackoverflow.com/questions/6349421/ Spring » Jackson to de-serialize an array]
* [https://www.baeldung.com/spring-template-engines Template Engines for Spring]
* [https://openjdk.java.net/jeps/368 Spring » New escape sequences]
* [https://www.baeldung.com/spring-template-engines Spring » Template Engines]
* [https://stackshare.io/stackups/mustache-vs-twig Spring » Mustache vs Twig]
* [https://stackoverflow.com/questions/67531284/ Spring » Ant Path Match]
* [https://stackoverflow.com/questions/67531284/ Spring » Ant Path Match]
* [https://openjdk.java.net/jeps/368 New escape sequences]
* [https://spring.io/guides/tutorials/spring-boot-kotlin/ Spring » Kotlin]
* [https://spring.io/guides/tutorials/spring-boot-kotlin/ Spring Boot Kotlin]
* [https://stackshare.io/stackups/mustache-vs-twig Mustache vs Twig]


| valign="top" |
| valign="top" |

Revision as of 07:00, 7 February 2024

Object Storage File Path

@RestController
@RequestMapping("/api/file")
public class FileController {
    @Autowired
    FileService fileService;

    /**
     * File download requests handler
     *
     * @param prefix of relative file path
     *    <ul>
     *        <li>certificates/Policy-8691-191939b9-526b-4933-b05c-61e672609dcc.pdf</li>
     *        <li>certificates/extras/Policy_Wording.pdf</li>
     *    </ul>
     */
    @GetMapping("/{prefix}/**")
    public void fetch(
            @PathVariable("prefix") final String prefix,
            final HttpServletResponse response,
            final HttpServletRequest request
    ) {
        String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        String name = (!ObjectUtils.isEmpty(prefix)) ? path.substring(path.indexOf(prefix)) : null;
        try {
            if (!ObjectUtils.isEmpty(name)) {
                InputStream inputStream = fileService.fetch(name);
                OutputStream outputStream = response.getOutputStream();
                IOUtils.copy(inputStream, outputStream);
            } else throw new FileNotFoundException(name);
        } catch (IOException e) {
            throw new InternalServerException(e.getMessage(), e);
        }
    }
}

ReactJS Route

@Configuration
public class WebConfig implements WebMvcConfigurer {
    public static final String FORWARD_INDEX_HTML = "forward:/index.html";
    public static final String[] PATH_OR_PATTERNS = {
            "/",
            "/{x:[\\w\\-]+}",
            "/{x:^(?!api$).*$}/*/{y:[\\w\\-]+}"
    };
    
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        Arrays.stream(PATH_OR_PATTERNS).forEach(path -> {
            registry.addViewController(path).setViewName(FORWARD_INDEX_HTML);
        });
    }
}
@Controller
public class HomeController {
    public static final String FORWARD_INDEX_HTML = "forward:/index.html";

    /*
    @RequestMapping(
            value = {
                    "/",
                    "/**",
                    "/{lang:en|my}",
                    "/{lang:en|my}/**",
                    "/{route:^(?!api$).*$}",
                    "/{route:^(?!api$).*$}/**"
            },
            method = {RequestMethod.GET, RequestMethod.POST}
    )
    public ModelAndView index(
            final HttpServletRequest request,
            @PathVariable Optional<String> lang,
            @PathVariable Optional<String> route
    ) throws Exception {
        return new ModelAndView(FORWARD_INDEX_HTML);
    }*/


    @ResponseBody
    @RequestMapping(
            value = {
                    "/",
                    "/**",
                    "/{lang:en|my}",
                    "/{lang:en|my}/**",
                    "/{route:^(?!api$).*$}",
                    "/{route:^(?!api$).*$}/**"
            },
            method = {RequestMethod.GET, RequestMethod.POST}
    )
    public Map<String, String> index(
            final HttpServletRequest request,
            @PathVariable Optional<String> lang,
            @PathVariable Optional<String> route
    ) {
        String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
        Map<String, String> response = new HashMap<>();
        response.put("route", route.orElse(""));
        response.put("lang", lang.orElse(""));
        response.put("path", path);
        return response;
    }
}

References