Skip to content

Commit

Permalink
add sort parameters to entity profile endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
NielsCW committed Jan 3, 2025
1 parent cc732c0 commit 4d66982
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 8 deletions.
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,9 +1,12 @@
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.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.querydsl.mapping.CollectionFiltersMapping;
import com.fasterxml.jackson.annotation.JsonValue;
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, List<Property> properties) {
var property = properties.get(properties.size() - 1);
Expand Down Expand Up @@ -69,6 +74,16 @@ public Optional<AttributeRepresentationModel> toModel(RootResourceInformation in
filter.getFilterType()))
.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(information, properties))
Expand All @@ -79,6 +94,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.jackson.JacksonBasedContainer;
import com.contentgrid.spring.data.rest.mapping.persistent.ThroughAssociationsContainer;
Expand Down Expand Up @@ -27,16 +28,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)
// .wrapWith(JacksonBasedContainer::new)
;
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

0 comments on commit 4d66982

Please sign in to comment.