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(core): made sure self links at document level use service-url-provider as base url #815

Merged
merged 1 commit into from
Jun 3, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import io.crnk.core.engine.information.resource.ResourceInformation;
import io.crnk.core.engine.internal.utils.JsonApiUrlBuilder;
import io.crnk.core.engine.internal.utils.PreconditionUtil;
import io.crnk.core.engine.internal.utils.StringUtils;
import io.crnk.core.engine.internal.utils.UrlUtils;
import io.crnk.core.engine.properties.PropertiesProvider;
import io.crnk.core.engine.query.QueryAdapter;
import io.crnk.core.engine.query.QueryContext;
Expand Down Expand Up @@ -136,14 +138,14 @@ private LinksInformation enrichSelfLink(LinksInformation linksInformation, Query
HttpRequestContext requestContext = queryContext.getRequestContext();
if (requestContext != null && (linksInformation == null || linksInformation instanceof SelfLinksInformation)) {
SelfLinksInformation selfLinksInformation = (SelfLinksInformation) linksInformation;
URI requestUri = requestContext.getRequestUri();
if ((selfLinksInformation == null || selfLinksInformation.getSelf() == null) && requestUri != null) {
String requestUri = queryContext.getRequestUri();
if ((selfLinksInformation == null || selfLinksInformation.getSelf() == null) && !StringUtils.isBlank(requestUri)) {
if (selfLinksInformation == null) {
selfLinksInformation = new DefaultSelfLinksInformation();
linksInformation = selfLinksInformation;
}

JsonApiUrlBuilder.UrlParameterBuilder urlBuilder = new JsonApiUrlBuilder.UrlParameterBuilder(requestUri.toString());
JsonApiUrlBuilder.UrlParameterBuilder urlBuilder = new JsonApiUrlBuilder.UrlParameterBuilder(requestUri);
urlBuilder.addQueryParameters(requestContext.getRequestParameters());
selfLinksInformation.setSelf(urlBuilder.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@ public static String concat(String baseUrl, String... paths) {
StringBuilder builder = new StringBuilder();
builder.append(removeTrailingSlash(baseUrl));
for (String path : paths) {
builder.append('/');
builder.append(removeLeadingSlash(path));
if (path != null) {
builder.append('/');
builder.append(removeLeadingSlash(path));
}
}
return builder.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.concurrent.ConcurrentHashMap;

import io.crnk.core.engine.http.HttpRequestContext;
import io.crnk.core.engine.internal.utils.UrlUtils;
import io.crnk.core.engine.registry.ResourceRegistry;
import io.crnk.core.resource.annotations.JsonApiVersion;

Expand Down Expand Up @@ -97,4 +98,11 @@ public void initializeDefaults(ResourceRegistry resourceRegistry) {
setRequestVersion(resourceRegistry.getLatestVersion());
}
}

/**
* @return full URL contains of {@link #getBaseUrl()} and {@link #getRequestPath()}
*/
public String getRequestUri() {
return UrlUtils.concat(getBaseUrl(), getRequestPath());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import io.crnk.core.engine.document.Document;
import io.crnk.core.engine.document.ErrorData;
import io.crnk.core.engine.document.Relationship;
Expand Down Expand Up @@ -76,9 +77,9 @@ public void testSerializeWithoutLinks() {
public void testSerializeRootSelfLink() {
Task task = createTask(2, "sample task");
QueryAdapter adapter = createAdapter(Task.class);
Mockito.when(container.getRequestContextBase().getRequestUri()).thenReturn(URI.create("http://localhost/api/foo"));
// Mockito.when(container.getRequestContextBase().getRequestUri()).thenReturn(URI.create("http://localhost/api/foo"));
Document document = mapper.toDocument(toResponse(task), adapter, mappingConfig).get();
Assert.assertEquals("http://localhost/api/foo", getLinkText(document.getLinks().get("self")));
Assert.assertEquals("http://127.0.0.1", getLinkText(document.getLinks().get("self")));
}

public static class TaskLinks implements LinksInformation {
Expand Down Expand Up @@ -301,6 +302,8 @@ public void testCompactModeWithNullData() {
queryAdapter.setCompactMode(false);
Document standardDocument = mapper.toDocument(new JsonApiResponse(), queryAdapter, mappingConfig).get();

// The only difference standard document only has is a self link
standardDocument.setLinks(null);
Assert.assertEquals(standardDocument, compactDocument);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package io.crnk.example.springboot.simple;

import com.jayway.restassured.RestAssured;
import io.crnk.core.boot.CrnkBoot;
import io.crnk.example.springboot.SpringBootExampleApplication;
import org.junit.Test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.http.HttpStatus.OK;

/**
* Makes sure links are generated based on {@link io.crnk.core.engine.url.ServiceUrlProvider} implementation
*/
@SpringBootTest(
classes = {
SpringBootExampleApplication.class,
SpringBootCustomServiceUrlProviderApplicationTests.TestConfiguration.class
},
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
public class SpringBootCustomServiceUrlProviderApplicationTests extends BaseTest {

@Configuration
static class TestConfiguration {

@Component
class TenantCrnkBootInitBeanPostProcessor implements BeanPostProcessor {

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof CrnkBoot) {
((CrnkBoot) bean).getModuleRegistry().getHttpRequestContextProvider().setServiceUrlProvider(() -> "http://some.org");
}

return bean;
}
}
}

@Test
public void testFindMany() {
RestAssured.given().contentType("application/json").when().get("/api/tasks")
.then()
.body("links.self", equalTo("http://some.org/tasks"))
.body("data[0].links.self", equalTo("http://some.org/tasks/1"))
.body("data[1].links.self", equalTo("http://some.org/tasks/2"))
.body("data[2].links.self", equalTo("http://some.org/tasks/3"));
}

@Test
public void testFindOne() {
RestAssured.given().contentType("application/json").when().get("/api/tasks/1")
.then()
.body("links.self", equalTo("http://some.org/tasks/1"));
}
}