@RequiredArgsConstructor
public class CustomProductMetadataRoutesAutoConfiguration {
private final CatalogMetadataProperties properties;
@Bean
public ComponentRouteLocator productMetadataRoutes(RoutesBuilder routesBuilder) {
RoutesSpec routes = routesBuilder.routes();
addRoutes("catalog:products:%s", "SUPER_ADMIN_VIEW");
addRoutes("merchandiser:catalog:products:%s", "MERCHANDISER_ADMIN_VIEW");
return routes.build();
}
private void addRoutes(String componentId, String scope) {
routes.route("/products", r -> r.componentId(componentId.formatted("browse"))
.scope(scope)
.scope(ProductScopes.PRODUCT)
.allMatchScopes());
getAvailableProductTypes().forEach(type -> {
routes.route("/products/%s/create".formatted(type.name()),
r -> r.componentId(componentId.formatted(type.name() + ":create"))
.scope(scope)
.scope(ProductScopes.PRODUCT)
.allMatchScopes());
routes.route("/products/%s/:id".formatted(type.name()),
r -> r.componentId(componentId.formatted(type.name() + ":update"))
.scope(scope)
.scope(ProductScopes.PRODUCT)
.allMatchScopes());
});
}
private List<DefaultProductType> getAvailableProductTypes() {
return Arrays.stream(values())
.filter(t -> properties.getActiveProductTypes().contains(t.name()))
.collect(Collectors.toList());
}
}