Skip to content
Draft
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 @@ -90,7 +90,7 @@ public HalFormsConfiguration customize(HalFormsConfiguration configuration) {
}

@Value
private static class SortOption {
public static class SortOption {

String property;

Expand All @@ -113,7 +113,7 @@ public String getDirection() {

@Getter
@RequiredArgsConstructor
private class SortPropertyMetadata implements PropertyMetadata {
public class SortPropertyMetadata implements PropertyMetadata {

private final List<SortOption> sortOptions;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ public class AttributeRepresentationModel extends RepresentationModel<AttributeR
@Builder.Default
private final Collection<SearchParamRepresentationModel> searchParams = List.of();

@JsonIgnore
@Builder.Default
private final Collection<SortParamRepresentationModel> sortParams = List.of();

@JsonIgnore
@Builder.Default
private final Collection<AttributeRepresentationModel> attributes = List.of();
Expand All @@ -56,6 +60,7 @@ public CollectionModel<EmbeddedWrapper> getEmbeddeds() {
return CollectionModel.of(List.of(
embeddedWrappers.wrap(constraints, BlueprintLinkRelations.CONSTRAINT),
embeddedWrappers.wrap(searchParams, BlueprintLinkRelations.SEARCH_PARAM),
embeddedWrappers.wrap(sortParams, BlueprintLinkRelations.SORT_PARAM),
embeddedWrappers.wrap(attributes, BlueprintLinkRelations.ATTRIBUTE)
));
}
Expand All @@ -72,4 +77,16 @@ public static class SearchParamRepresentationModel {
String type;

}

@Builder
@Getter
@AllArgsConstructor
@Relation(BlueprintLinkRelations.SORT_PARAM_STRING)
public static class SortParamRepresentationModel {

String name;
@JsonInclude(Include.NON_EMPTY)
String title;
String direction;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.contentgrid.spring.data.rest.webmvc.blueprint;

import com.contentgrid.spring.data.querydsl.sort.CollectionFilterSortHalFormsPayloadMetadataContributor;
import com.contentgrid.spring.data.querydsl.sort.CollectionFilterSortHalFormsPayloadMetadataContributor.SortPropertyMetadata;
import com.contentgrid.spring.data.rest.mapping.Container;
import com.contentgrid.spring.data.rest.mapping.Property;
import com.contentgrid.spring.data.rest.mapping.jackson.JacksonBasedProperty;
import com.contentgrid.spring.data.rest.validation.AllowedValues;
import com.contentgrid.spring.data.rest.webmvc.blueprint.AttributeRepresentationModel.SearchParamRepresentationModel;
import com.contentgrid.spring.data.rest.webmvc.blueprint.AttributeRepresentationModel.SortParamRepresentationModel;
import com.contentgrid.spring.data.support.auditing.v1.UserMetadata;
import com.contentgrid.spring.querydsl.mapping.CollectionFiltersMapping;
import jakarta.persistence.Embedded;
Expand All @@ -21,6 +24,8 @@ public class AttributeRepresentationModelAssembler {

private final CollectionFiltersMapping collectionFiltersMapping;
private final MessageResolver messageResolver;
private final CollectionFilterSortHalFormsPayloadMetadataContributor
collectionFilterSortHalFormsPayloadMetadataContributor;

public Optional<AttributeRepresentationModel> toModel(RootResourceInformation information, Container container, List<Property> propertyPath) {
var property = propertyPath.get(propertyPath.size() - 1);
Expand Down Expand Up @@ -70,6 +75,16 @@ public Optional<AttributeRepresentationModel> toModel(RootResourceInformation in
.build())
.forEachOrdered(searchParams::add);

var sortParams = new ArrayList<SortParamRepresentationModel>();
var metadataStream = collectionFilterSortHalFormsPayloadMetadataContributor.contributeToSearchForm(information.getDomainType());
metadataStream.filter(SortPropertyMetadata.class::isInstance)
.map(SortPropertyMetadata.class::cast)
.flatMap(metadata -> metadata.getSortOptions().stream())
.filter(option -> jsonProperty.getName().equals(option.getProperty()))
.map(option -> new SortParamRepresentationModel(option.getValue(), option.getPrompt(),
option.getDirection()))
.forEachOrdered(sortParams::add);

var attribute = AttributeRepresentationModel.builder()
.name(jsonProperty.getName())
.title(readTitle(container, property))
Expand All @@ -80,6 +95,7 @@ public Optional<AttributeRepresentationModel> toModel(RootResourceInformation in
.attributes(attributes)
.constraints(constraints)
.searchParams(searchParams)
.sortParams(sortParams)
.build();

return Optional.of(attribute);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ public class BlueprintLinkRelations {
public static final String CONSTRAINT_STRING = CURIE + ":constraint";
public static final LinkRelation SEARCH_PARAM = HalLinkRelation.curied(CURIE, "search-param");
public static final String SEARCH_PARAM_STRING = CURIE + ":search-param";
public static final LinkRelation SORT_PARAM = HalLinkRelation.curied(CURIE, "sort-param");
public static final String SORT_PARAM_STRING = CURIE + ":sort-param";
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.contentgrid.spring.data.rest.webmvc.blueprint;

import com.contentgrid.spring.data.querydsl.sort.CollectionFilterSortHalFormsPayloadMetadataContributor;
import com.contentgrid.spring.data.rest.hal.CurieProviderCustomizer;
import com.contentgrid.spring.querydsl.mapping.CollectionFiltersMapping;
import org.springframework.context.annotation.Bean;
Expand All @@ -21,9 +22,10 @@ CurieProviderCustomizer dataModelCurieProvider() {
EntityRepresentationModelAssembler entityRepresentationModelAssembler(
Repositories repositories, MessageResolver messageResolver,
RepositoryRestConfiguration repositoryRestConfiguration, ResourceMappings resourceMappings,
CollectionFiltersMapping collectionFiltersMapping
CollectionFiltersMapping collectionFiltersMapping,
CollectionFilterSortHalFormsPayloadMetadataContributor contributor
) {
return new EntityRepresentationModelAssembler(repositories, messageResolver, repositoryRestConfiguration,
resourceMappings, collectionFiltersMapping);
resourceMappings, collectionFiltersMapping, contributor);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.contentgrid.spring.data.rest.webmvc.blueprint;

import com.contentgrid.spring.data.querydsl.sort.CollectionFilterSortHalFormsPayloadMetadataContributor;
import com.contentgrid.spring.data.rest.mapping.DomainTypeMapping;
import com.contentgrid.spring.data.rest.mapping.persistent.ThroughAssociationsContainer;
import com.contentgrid.spring.data.rest.mapping.rest.DataRestBasedContainer;
Expand All @@ -26,16 +27,21 @@ public class EntityRepresentationModelAssembler implements
private final AttributeRepresentationModelAssembler attributeAssembler;
private final RelationRepresentationModelAssembler relationAssembler;

public EntityRepresentationModelAssembler(Repositories repositories, MessageResolver messageResolver,
RepositoryRestConfiguration repositoryRestConfiguration, ResourceMappings resourceMappings,
CollectionFiltersMapping collectionFiltersMapping) {
public EntityRepresentationModelAssembler(
Repositories repositories,
MessageResolver messageResolver,
RepositoryRestConfiguration repositoryRestConfiguration,
ResourceMappings resourceMappings,
CollectionFiltersMapping collectionFiltersMapping,
CollectionFilterSortHalFormsPayloadMetadataContributor contributor
) {
this.domainTypeMapping = new DomainTypeMapping(repositories)
.wrapWith(container -> new ThroughAssociationsContainer(container, repositories, 1))
.wrapWith(DataRestBasedContainer::new)
// no JacksonBasedContainer because we still need to access the java property names
;
this.messageResolver = messageResolver;
this.attributeAssembler = new AttributeRepresentationModelAssembler(collectionFiltersMapping, messageResolver);
this.attributeAssembler = new AttributeRepresentationModelAssembler(collectionFiltersMapping, messageResolver, contributor);
this.relationAssembler = new RelationRepresentationModelAssembler(repositoryRestConfiguration, resourceMappings, messageResolver);
}

Expand Down
Loading
Loading