Broadleaf Microservices
  • v1.0.0-latest-prod

Tenant Services Release Notes for 2.1.0-GA

Tip
The 2.x versions are Spring Boot 3 compatible.

Requirements

  • JDK 17 is required for Broadleaf release trains 2.0.0-GA, and beyond.

Important Updates

  • This version includes all changes up to 2.0.1 Release Notes

  • Added admin metadata views to support managing Application Catalogs at the Application level.

  • Add new catalog type, SEARCH_GROUP.

    • Search Groups allow inheritance and override behavior support for Search Settings, Facets, and Sort Options. There can only be one Search Group per Application. Therefore, one is automatically created and assigned when a new Application is provisioned.

      • The automatic creation of a Search Group is gated by the new property broadleaf.tenant.application.initialize-search-group-catalog-for-new-applications-enabled, and is defaulted to true.

    • Migration scripts are included automatically to set up a Search Group for any existing Applications. They are also included below for convenience.

Scripts to Set Up Search Groups

Note
These are included in liquibase changesets already and will be run automatically along with schema changes.
Postgres
INSERT INTO BLC_TENANT_CATALOG (
    ID,
    CATALOG_NAME,
    CATALOG_LEVEL,
    CATALOG_LOCALE,
    DEFAULT_CURRENCY,
    TRK_ARCHIVED,
    TRK_TENANT_ID,
    TYPE,
    OWNING_APPLICATION
    )
SELECT CONCAT(SUBSTRING(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    CONCAT(APP.NAME, ADDL_INFO.NAME_PART, ' Search Group'),
    ADDL_INFO.CATALOG_LEVEL,
    APP.DEFAULT_LOCALE,
    APP.DEFAULT_CURRENCY,
    APP.TRK_ARCHIVED,
    APP.TRK_TENANT_ID,
    'SEARCH_GROUP',
    CASE WHEN ADDL_INFO.OWNED = 1 THEN APP.ID END
FROM BLC_TENANT_APPLICATION APP
         CROSS JOIN (SELECT ID_PART, CATALOG_LEVEL, NAME_PART, OWNED
                     FROM (VALUES
                               ('_SG_MAIN', 2, ' ', 0),
                               ('_SG_IMPL', 3, ' Implicit', 1))
                         T(ID_PART, CATALOG_LEVEL, NAME_PART, OWNED)) AS ADDL_INFO
WHERE APP.ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
/* Add Parents */
INSERT INTO BLC_TENANT_CATALOG_REF (
    ID,
    MUTABILITY_TYPE,
    NAME,
    PARENT_CATALOG_ID,
    CHILD_CATALOG_ID,
    PARENTS_ORDER
    )
SELECT CONCAT(SUBSTRING(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    'CUSTOMIZABLE',
    CONCAT(APP.NAME, ADDL_INFO.NAME_PART, ' Search Group'),
    CASE WHEN ADDL_INFO.PARENT IS NULL
             THEN CONCAT(SUBSTRING(APP.ID, 0, 28), '_SG_MAIN')
         ELSE ADDL_INFO.PARENT END,
    CONCAT(SUBSTRING(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    0
FROM BLC_TENANT_APPLICATION APP
         CROSS JOIN (SELECT ID_PART, CATALOG_LEVEL, NAME_PART, OWNED, PARENT
                     FROM (VALUES
                               ('_SG_MAIN', 2, ' ', 0, '01HHZFNK69YQPX70CB28KK7SFD'),
                               ('_SG_IMPL', 3, ' Implicit', 1, NULL)
                           ) T(ID_PART, CATALOG_LEVEL, NAME_PART, OWNED, PARENT)) AS ADDL_INFO
WHERE APP.ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
/* Notifications */
INSERT INTO BLC_NOTIFICATION_STATE (
    ID,
    CONTAINER,
    ENTITY_TYPE,
    CHANGE_TIMESTAMP,
    ACKED,
    STOPPED,
    ATTEMPTS,
    NOTIFICATION_NAME
    )
SELECT CONCAT(SUBSTRING(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    CONCAT(SUBSTRING(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    'com.broadleafcommerce.tenant.provider.jpa.domain.JpaTenantCatalog',
    CURRENT_TIMESTAMP,
    'N',
    'N',
    0,
    'PERSISTENCE'
FROM BLC_TENANT_APPLICATION APP
         CROSS JOIN (SELECT ID_PART, CATALOG_LEVEL, NAME_PART, OWNED
                     FROM (VALUES
                               ('_SG_MAIN', 2, ' ', 0),
                               ('_SG_IMPL', 3, ' Implicit', 1)
                           ) T(ID_PART, CATALOG_LEVEL, NAME_PART, OWNED)) AS ADDL_INFO
WHERE APP.ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
/* Add to App */
INSERT INTO BLC_TENANT_APPLICATION_CATALOG (
    APPLICATION_ID,
    CATALOG_STATUS,
    CONTEXT_ID,
    EXCLUDE_FROM_ADD,
    IMPLICIT,
    MUTABILITY_TYPE,
    NAME,
    VISIBLE_AS_ASSIGNED,
    ISOLATED_CATALOGS_ORDER,
    TYPE
    )
SELECT APP.ID,
    'ONLINE',
    CONCAT(SUBSTRING(APP.ID, 0, 28), '_SG_MAIN'),
    'N',
    CONCAT(SUBSTRING(APP.ID, 0, 28), '_SG_IMPL'),
    'CUSTOMIZABLE',
    CONCAT(APP.NAME, ' Search Group'),
    'Y',
    APP_CAT.MAX_ORDER + 1,
    'SEARCH_CATALOG'
FROM BLC_TENANT_APPLICATION APP
         LEFT JOIN (SELECT APPLICATION_ID, MAX(ISOLATED_CATALOGS_ORDER) AS MAX_ORDER
                    FROM BLC_TENANT_APPLICATION_CATALOG
                    GROUP BY APPLICATION_ID) APP_CAT ON APP_CAT.APPLICATION_ID = APP.ID
WHERE ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
Oracle
/* New Search Group Per Site plus Implicit */
INSERT INTO BLC_TENANT_CATALOG (
    ID,
    CATALOG_NAME,
    CATALOG_LEVEL,
    CATALOG_LOCALE,
    DEFAULT_CURRENCY,
    TRK_ARCHIVED,
    TRK_TENANT_ID,
    TYPE,
    OWNING_APPLICATION
    )
SELECT CONCAT(SUBSTR(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    CONCAT(CONCAT(APP.NAME, ADDL_INFO.NAME_PART), ' Search Group'),
    ADDL_INFO.CATALOG_LEVEL,
    APP.DEFAULT_LOCALE,
    APP.DEFAULT_CURRENCY,
    APP.TRK_ARCHIVED,
    APP.TRK_TENANT_ID,
    'SEARCH_GROUP',
    CASE WHEN ADDL_INFO.OWNED = 1 THEN APP.ID END
FROM BLC_TENANT_APPLICATION APP
         CROSS JOIN (SELECT ID_PART, CATALOG_LEVEL, NAME_PART, OWNED
                     FROM ((SELECT '_SG_MAIN' ID_PART, 2 CATALOG_LEVEL, ' ' NAME_PART, 0 OWNED
                            FROM DUAL)
                           UNION ALL
                           (SELECT '_SG_IMPL', 3, ' Implicit', 1 FROM DUAL))) ADDL_INFO
WHERE APP.ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
/* Add Parents */
INSERT INTO BLC_TENANT_CATALOG_REF (
    ID,
    MUTABILITY_TYPE,
    NAME,
    PARENT_CATALOG_ID,
    CHILD_CATALOG_ID,
    PARENTS_ORDER
    )
SELECT CONCAT(SUBSTR(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    'CUSTOMIZABLE',
    CONCAT(CONCAT(APP.NAME, ADDL_INFO.NAME_PART), ' Search Group'),
    CASE WHEN ADDL_INFO.PARENT IS NULL
             THEN CONCAT(SUBSTR(APP.ID, 0, 28), '_SG_MAIN')
         ELSE ADDL_INFO.PARENT END,
    CONCAT(SUBSTR(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    0
FROM BLC_TENANT_APPLICATION APP
         CROSS JOIN (SELECT ID_PART, CATALOG_LEVEL, NAME_PART, OWNED, PARENT
                     FROM ((SELECT '_SG_MAIN' ID_PART, 2 CATALOG_LEVEL, ' ' NAME_PART, 0 OWNED, '01HHZFNK69YQPX70CB28KK7SFD' PARENT FROM DUAL)
                           UNION ALL
                           (SELECT '_SG_IMPL', 3, ' Implicit', 1, NULL FROM DUAL))) ADDL_INFO
WHERE APP.ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
/* Notifications */
INSERT INTO BLC_NOTIFICATION_STATE (
    ID,
    CONTAINER,
    ENTITY_TYPE,
    CHANGE_TIMESTAMP,
    ACKED,
    STOPPED,
    ATTEMPTS,
    NOTIFICATION_NAME
    )
SELECT CONCAT(SUBSTR(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    CONCAT(SUBSTR(APP.ID, 0, 28), ADDL_INFO.ID_PART),
    'com.broadleafcommerce.tenant.provider.jpa.domain.JpaTenantCatalog',
    CURRENT_TIMESTAMP,
    'N',
    'N',
    0,
    'PERSISTENCE'
FROM BLC_TENANT_APPLICATION APP
         CROSS JOIN (SELECT ID_PART, CATALOG_LEVEL, NAME_PART, OWNED
                     FROM ((SELECT '_SG_MAIN' ID_PART, 2 CATALOG_LEVEL, ' ' NAME_PART, 0 OWNED FROM DUAL)
                           UNION ALL
                           (SELECT '_SG_IMPL', 3, ' Implicit', 1 FROM DUAL))) ADDL_INFO
WHERE APP.ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');
/* Add to App */
INSERT INTO BLC_TENANT_APPLICATION_CATALOG (
    APPLICATION_ID,
    CATALOG_STATUS,
    CONTEXT_ID,
    EXCLUDE_FROM_ADD,
    IMPLICIT,
    MUTABILITY_TYPE,
    NAME,
    VISIBLE_AS_ASSIGNED,
    ISOLATED_CATALOGS_ORDER,
    TYPE
    )
SELECT APP.ID,
    'ONLINE',
    CONCAT(SUBSTR(APP.ID, 0, 28), '_SG_MAIN'),
    'N',
    CONCAT(SUBSTR(APP.ID, 0, 28), '_SG_IMPL'),
    'CUSTOMIZABLE',
    CONCAT(APP.NAME, ' Search Group'),
    'Y',
    APP_CAT.MAX_ORDER + 1,
    'SEARCH_CATALOG'
FROM BLC_TENANT_APPLICATION APP
         LEFT JOIN (SELECT APPLICATION_ID, MAX(ISOLATED_CATALOGS_ORDER) AS MAX_ORDER
                    FROM BLC_TENANT_APPLICATION_CATALOG
                    GROUP BY APPLICATION_ID) APP_CAT ON APP_CAT.APPLICATION_ID = APP.ID
WHERE ID NOT IN
      (SELECT APPLICATION_ID FROM BLC_TENANT_APPLICATION_CATALOG WHERE TYPE = 'SEARCH_GROUP');