@SuppressWarnings("unchecked")
    @ExecuteOn(TaskExecutors.IO)
    @Get("tags")
    @Operation(tags = {"Blueprint Tags"}, summary = "List blueprint tags matching the filter")
    public List<BlueprintTagItem> blueprintTags(
        @Parameter(description = "A string filter to get tags with matching blueprints only") @Nullable @QueryValue(value = "q") Optional<String> q,
        HttpRequest<?> httpRequest
    ) throws URISyntaxException {
        return fastForwardToKestraApi(httpRequest, "/v1/blueprints/tags", Argument.of(List.class, BlueprintTagItem.class));
    }
@SuppressWarnings("unchecked")
    @Test
    void blueprintTags(WireMockRuntimeInfo wmRuntimeInfo) {
        stubFor(get(urlMatching("/v1/blueprints/tags.*"))
            .willReturn(aResponse()
                .withHeader("Content-Type", "application/json")
                .withBodyFile("blueprint-tags.json"))
        );

        List<BlueprintController.BlueprintTagItem> blueprintTags = client.toBlocking().retrieve(
            HttpRequest.GET("/api/v1/blueprints/community/tags?q=someQuery"),
            Argument.of(List.class, BlueprintController.BlueprintTagItem.class)
        );

        assertThat(blueprintTags.size(), is(3));
        assertThat(blueprintTags.getFirst().getId(), is("3"));
        assertThat(blueprintTags.getFirst().getName(), is("Cloud"));
        assertThat(blueprintTags.getFirst().getPublishedAt(), is(Instant.parse("2023-06-01T08:37:10.171Z")));

        WireMock wireMock = wmRuntimeInfo.getWireMock();
        wireMock.verifyThat(getRequestedFor(urlEqualTo("/v1/blueprints/tags?q=someQuery")));
    }