Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: turbo stream processing should use decoration #778

Merged
merged 5 commits into from
Apr 19, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions test-suite/src/test/java/io/micronaut/views/ModelAndViewTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.micronaut.http.HttpStatus;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.client.BlockingHttpClient;
import io.micronaut.http.client.HttpClient;
import io.micronaut.http.client.annotation.Client;
Expand All @@ -37,6 +38,9 @@
import io.micronaut.views.model.ConfigViewModelProcessor;
import io.micronaut.views.model.FruitsController;
import io.micronaut.views.model.ViewModelProcessor;
import io.micronaut.views.turbo.TurboStream;
import io.micronaut.views.turbo.TurboStreamAction;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -180,6 +184,11 @@ void viewModelProcessorsWorkWithControllersReturningPOJOs() {

//and:
assertTrue(html.contains("<h1>config: test</h1>"));

//when:
request = HttpRequest.GET("/turboStreamBuilderWithProrocessor").accept(TurboMediaType.TURBO_STREAM);
sdelamo marked this conversation as resolved.
Show resolved Hide resolved
html = client.retrieve(request, String.class);
assertTrue(html.contains("<h1>config: test</h1>"));
}

@Requires(property = "spec.name", value = "ModelAndViewSpec")
Expand All @@ -190,6 +199,15 @@ static class ViewModelProcessorController {
public Fruit pojoProcessor() {
return new Fruit("orange", "orange");
}


@Produces(TurboMediaType.TURBO_STREAM)
@Get("/turboStreamBuilderWithProrocessor")
sdelamo marked this conversation as resolved.
Show resolved Hide resolved
public TurboStream.Builder turboStreamBuilder() {
return TurboStream.builder()
.action(TurboStreamAction.REPLACE)
.template("fruits-processor", new Fruit("orange", "orange"));
}
}

@Introspected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,16 @@
package io.micronaut.views.turbo;

import io.micronaut.context.annotation.Requires;
import io.micronaut.core.annotation.NextMajorVersion;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.io.Writable;
import io.micronaut.http.HttpRequest;
import io.micronaut.views.ModelAndView;
import io.micronaut.views.ViewsModelDecorator;
import io.micronaut.views.ViewsRendererLocator;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

import java.util.Optional;
Expand All @@ -36,9 +40,30 @@
public class DefaultTurboStreamRenderer implements TurboStreamRenderer {

protected final ViewsRendererLocator viewsRendererLocator;
@Nullable
@NextMajorVersion("remove the nullability annotation")
private final ViewsModelDecorator viewsModelDecorator;

public DefaultTurboStreamRenderer(ViewsRendererLocator viewsRendererLocator) {
/**
*
* @param viewsRendererLocator ViewRendererLocator
* @param viewsModelDecorator Views Model Decorator
*/
@Inject
public DefaultTurboStreamRenderer(ViewsRendererLocator viewsRendererLocator,
ViewsModelDecorator viewsModelDecorator) {
this.viewsRendererLocator = viewsRendererLocator;
this.viewsModelDecorator = viewsModelDecorator;
}

/**
*
* @param viewsRendererLocator View Renderer Locator
* @deprecated Use {@link #DefaultTurboStreamRenderer(ViewsRendererLocator, ViewsModelDecorator)} instead.
*/
@Deprecated
public DefaultTurboStreamRenderer(ViewsRendererLocator viewsRendererLocator) {
this(viewsRendererLocator, null);
}

@Override
Expand All @@ -48,8 +73,13 @@ public Optional<Writable> render(@NonNull TurboStream.Builder builder,
return builder.getTemplateView()
.map(viewName -> {
Object model = builder.getTemplateModel().orElse(null);
return viewsRendererLocator.resolveViewsRenderer(viewName, TurboMediaType.TURBO_STREAM, model)
.flatMap(renderer -> builder.template(renderer.render(viewName, model, request))
ModelAndView<Object> modelAndView = new ModelAndView<>(viewName, model);
if (request != null && viewsModelDecorator != null) {
viewsModelDecorator.decorate(request, modelAndView);
}
Object decoratedModel = modelAndView.getModel().orElse(null);
return viewsRendererLocator.resolveViewsRenderer(viewName, TurboMediaType.TURBO_STREAM, decoratedModel)
.flatMap(renderer -> builder.template(renderer.render(viewName, decoratedModel, request))
.build()
.render());
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.body.MessageBodyWriter;
import io.micronaut.http.codec.CodecException;
import io.micronaut.http.context.ServerRequestContext;
import io.micronaut.views.exceptions.ViewRenderingException;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Singleton;
Expand Down Expand Up @@ -54,7 +55,7 @@ public void writeTo(@NonNull Argument<TurboStream.Builder> type,
@NonNull MutableHeaders outgoingHeaders,
@NonNull OutputStream outputStream) throws CodecException {
outgoingHeaders.set(HttpHeaders.CONTENT_TYPE, TurboMediaType.TURBO_STREAM);
turboStreamRenderer.render(turboStreamBuilder, null)
turboStreamRenderer.render(turboStreamBuilder, ServerRequestContext.currentRequest().orElse(null))
.ifPresent(writable -> {
try {
writable.writeTo(outputStream);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.body.MessageBodyWriter;
import io.micronaut.http.codec.CodecException;
import io.micronaut.http.context.ServerRequestContext;
import io.micronaut.views.exceptions.ViewRenderingException;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Singleton;
Expand Down Expand Up @@ -56,7 +57,7 @@ public void writeTo(@NonNull Argument<List<TurboStream.Builder>> type,
@NonNull OutputStream outputStream) throws CodecException {
outgoingHeaders.set(HttpHeaders.CONTENT_TYPE, TurboMediaType.TURBO_STREAM);
for (TurboStream.Builder builder : turboStreamBuilders) {
turboStreamRenderer.render(builder, null)
turboStreamRenderer.render(builder, ServerRequestContext.currentRequest().orElse(null))
.ifPresent(writable -> {
try {
writable.writeTo(outputStream);
Expand Down
Loading