@Override
public TagDefinitionModelDao inTransaction(final EntitySqlDaoWrapperFactory<EntitySqlDao> entitySqlDaoWrapperFactory) throws Exception {
final TagDefinitionSqlDao tagDefinitionSqlDao = entitySqlDaoWrapperFactory.become(TagDefinitionSqlDao.class);
final TagDefinitionModelDao existingDefinition = tagDefinitionSqlDao.getByName(definitionName, context);
if (existingDefinition != null) {
throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_ALREADY_EXISTS, definitionName);
}
final TagDefinitionModelDao tagDefinition = new TagDefinitionModelDao(context.getCreatedDate(), definitionName, description);
tagDefinitionSqlDao.create(tagDefinition, context);
final boolean isControlTag = TagModelDaoHelper.isControlTag(tagDefinition.getName());
final TagDefinitionInternalEvent tagDefinitionEvent;
if (isControlTag) {
tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition,
context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
} else {
tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition,
context.getAccountRecordId(), context.getTenantRecordId(), context.getUserToken());
}
try {
bus.postFromTransaction(tagDefinitionEvent, entitySqlDaoWrapperFactory.getSqlDao());
} catch (PersistentBus.EventBusException e) {
log.warn("Failed to post tag definition creation event for tag " + tagDefinition.getId(), e);
}
return tagDefinition;
}
});