Index: src/main/groovy/com/lemanscorp/mqconsumer/services/CategoryService.groovy =================================================================== diff -u -rbbf2e5405d63748b1584efc46c75fc36f48d22d7 -rb5233bc4254a324d783ba04f720ed46335cb364c --- src/main/groovy/com/lemanscorp/mqconsumer/services/CategoryService.groovy (.../CategoryService.groovy) (revision bbf2e5405d63748b1584efc46c75fc36f48d22d7) +++ src/main/groovy/com/lemanscorp/mqconsumer/services/CategoryService.groovy (.../CategoryService.groovy) (revision b5233bc4254a324d783ba04f720ed46335cb364c) @@ -1,129 +1,129 @@ -package com.lemanscorp.mqconsumer.services - -import java.sql.ResultSet - -import com.lemanscorp.mqconsumer.domains.Category -import com.lemanscorp.mqconsumer.domains.CategoryAttributeValue -import groovy.util.logging.Slf4j -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.jdbc.core.RowMapper -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate -import org.springframework.stereotype.Service -import org.springframework.transaction.support.TransactionTemplate - -@Slf4j -@Service -class CategoryService { - - @Autowired - NamedParameterJdbcTemplate usDigiJdbcTemplate - - @Autowired - @Qualifier("europeDigiJdbcTemplate") - NamedParameterJdbcTemplate euDigiJdbcTemplate - - @Autowired - @Qualifier("europeDigiTransactionTemplate") - TransactionTemplate euDigiTransactionTemplate - - void createOrUpdate(Integer id) { - Category category = getCategoryById(id) - updateAndSequence(category) - } - - void move(Integer id) { - Category category = getCategoryById(id) - List categories = usDigiJdbcTemplate.query( - category.parentCategoryId ? CATEGORY_BY_PARENT_CATEGORY_SELECT_SQL : TOP_LEVEL_CATEGORIES, - [categoryId: category.parentCategoryId], - categoryMapper - ) - euDigiJdbcTemplate.batchUpdate(CATEGORY_UPSERT_SQL, categories.collect { new BeanPropertySqlParameterSource(it)} as BeanPropertySqlParameterSource[]) - } - - private void updateAndSequence(Category category) { - euDigiTransactionTemplate.execute { - try { - euDigiJdbcTemplate.update(CATEGORY_UPSERT_SQL, category.properties) - euDigiJdbcTemplate.queryForList(CATEGORY_SEQUENCE_UPDATE_SQL, [categoryId: category.id]) - } catch (Exception e) { - log.error('Exception while updating or creating category', e) - it.setRollbackOnly() - throw new Exception("Could not update/create Category") - } - } - } - - private Category getCategoryById(Integer id) { - usDigiJdbcTemplate.queryForObject(CATEGORY_SELECT_SQL, category(id), categoryMapper) - } - - private RowMapper categoryMapper = { ResultSet rs, row -> - new Category( - id: (Integer) rs.getObject("categoryId"), - catalogInstanceId: (Integer) rs.getObject("catalogInstanceId"), - categoryName: rs.getString("categoryName"), - description: rs.getString("description"), - pageNumberStart: (Integer) rs.getObject("pageNumberStart"), - pageNumberEnd: (Integer) rs.getObject("pageNumberEnd"), - parentCategoryId: (Integer) rs.getObject("parentCategoryId"), - primaryMediaId: (Integer) rs.getObject("primaryMediaId"), - sequence: (Integer) rs.getObject("sequence"), - source: (Integer) rs.getObject("source"), - sourceId: (Integer) rs.getObject("sourceId"), - effectiveDate: rs.getDate("effectiveDate"), - dateCreated: rs.getDate("dateCreated"), - createdBy: rs.getString("createdBy"), - lastUpdated: rs.getDate("lastUpdated"), - lastUpdatedBy: rs.getString("lastUpdatedBy"), - dateDeleted: rs.getDate("dateDeleted") ? new Date() : null, - deletedBy: rs.getString("deletedBy"), - version: (Integer) rs.getObject("version") - ) - } - - private Map category(Integer id) { [categoryId: id] } - - private static final String CATEGORY_SELECT_SQL = "SELECT * FROM Category WHERE categoryId = :categoryId" - - private static final String CATEGORY_BY_PARENT_CATEGORY_SELECT_SQL = "SELECT * FROM Category WHERE parentCategoryId = :categoryId AND dateDeleted IS NULL" - - private static final String TOP_LEVEL_CATEGORIES = "SELECT * FROM Category WHERE parentCategoryId IS NULL AND dateDeleted IS NULL" - - private static final String CATEGORY_SEQUENCE_UPDATE_SQL = "EXEC dbo.spCategoryUpdateSequence @categoryId = :categoryId" - - private static final String CATEGORY_UPSERT_SQL = """ - SET Identity_Insert [Category] ON; - MERGE Category c - USING (SELECT :id AS id) source - ON c.categoryId = source.id - WHEN matched THEN - UPDATE SET - catalogInstanceId = :catalogInstanceId, - categoryName = :categoryName, - description = :description, - pageNumberStart = :pageNumberStart, - pageNumberEnd = :pageNumberEnd, - parentCategoryId = :parentCategoryId, - primaryMediaId = :primaryMediaId, - sequence = :sequence, - source = :source, - sourceId = :sourceId, - effectiveDate = :effectiveDate, - dateCreated = :dateCreated, - createdBy = :createdBy, - lastUpdated = :lastUpdated, - lastUpdatedBy = :lastUpdatedBy, - dateDeleted = :dateDeleted, - deletedBy = :deletedBy, - version = :version - WHEN NOT matched THEN - INSERT (categoryId, catalogInstanceId, categoryName, description, pageNumberStart, pageNumberEnd, parentCategoryId, primaryMediaId, - sequence, source, sourceId, effectiveDate, dateCreated, createdBy, lastUpdated, lastUpdatedBy, dateDeleted, deletedBy, version) - VALUES(:id, :catalogInstanceId, :categoryName, :description, :pageNumberStart, :pageNumberEnd, :parentCategoryId, :primaryMediaId, - :sequence, :source, :sourceId, :effectiveDate, :dateCreated, :createdBy, :lastUpdated, :lastUpdatedBy, :dateDeleted, :deletedBy, :version); - SET Identity_Insert [Category] OFF; - """ -} +package com.lemanscorp.mqconsumer.services + +import java.sql.ResultSet + +import com.lemanscorp.mqconsumer.domains.Category +import com.lemanscorp.mqconsumer.domains.CategoryAttributeValue +import groovy.util.logging.Slf4j +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.jdbc.core.RowMapper +import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate +import org.springframework.stereotype.Service +import org.springframework.transaction.support.TransactionTemplate + +@Slf4j +@Service +class CategoryService { + + @Autowired + NamedParameterJdbcTemplate usDigiJdbcTemplate + + @Autowired + @Qualifier("europeDigiJdbcTemplate") + NamedParameterJdbcTemplate euDigiJdbcTemplate + + @Autowired + @Qualifier("europeDigiTransactionTemplate") + TransactionTemplate euDigiTransactionTemplate + + void createOrUpdate(Integer id) { + Category category = getCategoryById(id) + updateAndSequence(category) + } + + void move(Integer id) { + Category category = getCategoryById(id) + List categories = usDigiJdbcTemplate.query( + category.parentCategoryId ? CATEGORY_BY_PARENT_CATEGORY_SELECT_SQL : TOP_LEVEL_CATEGORIES, + [categoryId: category.parentCategoryId], + categoryMapper + ) + euDigiJdbcTemplate.batchUpdate(CATEGORY_UPSERT_SQL, categories.collect { new BeanPropertySqlParameterSource(it)} as BeanPropertySqlParameterSource[]) + } + + private void updateAndSequence(Category category) { + euDigiTransactionTemplate.execute { + try { + euDigiJdbcTemplate.update(CATEGORY_UPSERT_SQL, category.properties) + euDigiJdbcTemplate.queryForList(CATEGORY_SEQUENCE_UPDATE_SQL, [categoryId: category.id]) + } catch (Exception e) { + log.error('Exception while updating or creating category', e) + it.setRollbackOnly() + throw new Exception("Could not update/create Category") + } + } + } + + private Category getCategoryById(Integer id) { + usDigiJdbcTemplate.queryForObject(CATEGORY_SELECT_SQL, category(id), categoryMapper) + } + + private RowMapper categoryMapper = { ResultSet rs, row -> + new Category( + id: (Integer) rs.getObject("categoryId"), + catalogInstanceId: (Integer) rs.getObject("catalogInstanceId"), + categoryName: rs.getString("categoryName"), + description: rs.getString("description"), + pageNumberStart: (Integer) rs.getObject("pageNumberStart"), + pageNumberEnd: (Integer) rs.getObject("pageNumberEnd"), + parentCategoryId: (Integer) rs.getObject("parentCategoryId"), + primaryMediaId: (Integer) rs.getObject("primaryMediaId"), + sequence: (Integer) rs.getObject("sequence"), + source: (Integer) rs.getObject("source"), + sourceId: (Integer) rs.getObject("sourceId"), + effectiveDate: rs.getDate("effectiveDate"), + dateCreated: rs.getTimestamp("dateCreated"), + createdBy: rs.getString("createdBy"), + lastUpdated: rs.getTimestamp("lastUpdated"), + lastUpdatedBy: rs.getString("lastUpdatedBy"), + dateDeleted: rs.getTimestamp("dateDeleted") ? new Date() : null, + deletedBy: rs.getString("deletedBy"), + version: (Integer) rs.getObject("version") + ) + } + + private Map category(Integer id) { [categoryId: id] } + + private static final String CATEGORY_SELECT_SQL = "SELECT * FROM Category WHERE categoryId = :categoryId" + + private static final String CATEGORY_BY_PARENT_CATEGORY_SELECT_SQL = "SELECT * FROM Category WHERE parentCategoryId = :categoryId AND dateDeleted IS NULL" + + private static final String TOP_LEVEL_CATEGORIES = "SELECT * FROM Category WHERE parentCategoryId IS NULL AND dateDeleted IS NULL" + + private static final String CATEGORY_SEQUENCE_UPDATE_SQL = "EXEC dbo.spCategoryUpdateSequence @categoryId = :categoryId" + + private static final String CATEGORY_UPSERT_SQL = """ + SET Identity_Insert [Category] ON; + MERGE Category c + USING (SELECT :id AS id) source + ON c.categoryId = source.id + WHEN matched THEN + UPDATE SET + catalogInstanceId = :catalogInstanceId, + categoryName = :categoryName, + description = :description, + pageNumberStart = :pageNumberStart, + pageNumberEnd = :pageNumberEnd, + parentCategoryId = :parentCategoryId, + primaryMediaId = :primaryMediaId, + sequence = :sequence, + source = :source, + sourceId = :sourceId, + effectiveDate = :effectiveDate, + dateCreated = :dateCreated, + createdBy = :createdBy, + lastUpdated = :lastUpdated, + lastUpdatedBy = :lastUpdatedBy, + dateDeleted = :dateDeleted, + deletedBy = :deletedBy, + version = :version + WHEN NOT matched THEN + INSERT (categoryId, catalogInstanceId, categoryName, description, pageNumberStart, pageNumberEnd, parentCategoryId, primaryMediaId, + sequence, source, sourceId, effectiveDate, dateCreated, createdBy, lastUpdated, lastUpdatedBy, dateDeleted, deletedBy, version) + VALUES(:id, :catalogInstanceId, :categoryName, :description, :pageNumberStart, :pageNumberEnd, :parentCategoryId, :primaryMediaId, + :sequence, :source, :sourceId, :effectiveDate, :dateCreated, :createdBy, :lastUpdated, :lastUpdatedBy, :dateDeleted, :deletedBy, :version); + SET Identity_Insert [Category] OFF; + """ +}