MessageStoreRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.model.messagestore.ServiceCall;
import com.tradecloud.dto.integrationmessage.IntegrationMessageSearch;
import com.tradecloud.repository.MessageStoreRepository;
import com.tradecloud.repository.base.impl.CriteriaOperation;
import com.tradecloud.repository.base.impl.CriteriaValue;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;

/**
 * Tracking incoming+outcoming Message Store.
 */
@Repository
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class MessageStoreRepositoryImpl extends RepositoryBaseImpl<ServiceCall, IntegrationMessageSearch> implements MessageStoreRepository {

   private final String countOrderDailyMessage = """
        SELECT COUNT(s.id)
        FROM servicecall s
        WHERE s.reference = :reference
          AND s.operation IN (:operations)
          AND s.created >= CURRENT_DATE
          AND s.created < CURRENT_DATE + INTERVAL '1 day'
    """;

    @Override
    public ServiceCall findByUniqueConversationId(String uniqueConversationId) {

        List<ServiceCall> matchingServiceCalls = (List<ServiceCall>)
                findByNamedQueryAndNamedParam("findServiceCallByUniqueConversationId", "uniqueConversationId", uniqueConversationId);

        if (matchingServiceCalls.size() == 0) {
            return null;
        } else {
            return matchingServiceCalls.get(0);
        }
    }

    @Override
    public List<ServiceCall> findByUserNameAndOperation(String userName, String operationName) {

        String[] parameters = {userName, operationName};

        List<ServiceCall> matchingServiceCalls = (List<ServiceCall>)
                findByNamedQueryAndNamedParam("findServiceCallsByUserNameAndOperation", new String[]{"userName,operation"}, (Object[]) parameters);

        return matchingServiceCalls;
    }

    @Override
    protected Collection<CriteriaValue> mapFieldsToValues(IntegrationMessageSearch search) {
        Collection<CriteriaValue> fields = new LinkedHashSet<CriteriaValue>();
        if (search != null) {
            if (search.getFromHours() != null && search.getFromHours() > 0) {
                search.getFrom().setHours(search.getFromHours());
            }
            if (search.getFromMinutes() != null && search.getFromMinutes() > 0) {
                search.getFrom().setMinutes(search.getFromMinutes());
            }
            if (search.getFromSeconds() != null && search.getFromSeconds() > 0) {
                search.getFrom().setSeconds(search.getFromSeconds());
            }
            if (search.getToHours() != null && search.getToHours() > 0) {
                search.getTo().setHours(search.getToHours());
            }
            if (search.getToMinutes() != null && search.getToMinutes() > 0) {
                search.getTo().setMinutes(search.getToMinutes());
            }
            if (search.getToSeconds() != null && search.getToSeconds() > 0) {
                search.getTo().setSeconds(search.getToSeconds());
            }
        }
//      fields.add(new CriteriaValue(CriteriaOperation.LIKE, "replayUser", StringUtils.lowerCase(search.getUserName())));
        fields.add(new CriteriaValue(CriteriaOperation.LIKE, "userName", StringUtils.lowerCase(search.getUserName())));
        fields.add(new CriteriaValue(CriteriaOperation.LIKE, "replayUser", StringUtils.lowerCase(search.getReplayUser())));
        fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "operation", search.getOperation()));
        fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "type", search.getType()));
        fields.add(new CriteriaValue(CriteriaOperation.GREATER_THAN, "created", search.getFrom()));
        fields.add(new CriteriaValue(CriteriaOperation.LESS_THAN, "created", search.getTo()));
        fields.add(new CriteriaValue(CriteriaOperation.EQUALS_IGNORE_CASE, "messageState", search.getMessageState()));
        fields.add(new CriteriaValue(CriteriaOperation.LIKE, "reference", StringUtils.lowerCase(search.getReference())));

        if (search.getPayloadValueEnum() != null) {
            fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "payloadValueEnum", search.getPayloadValueEnum()));
        }

        if (search.getPayloadValue() != null) {
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, "payloadValue", StringUtils.lowerCase(search.getPayloadValue())));
        }

        if(search.getErrorMessage()!=null){
            fields.add(new CriteriaValue(CriteriaOperation.LIKE, "errorMessage", StringUtils.lowerCase(search.getErrorMessage())));
        }

        if(search.getAdditionalInfo()!=null && !search.getAdditionalInfo().isEmpty()){
            fields.add(new CriteriaValue(CriteriaOperation.EQUALS, "additionalInfo", search.getAdditionalInfo()));
        }

        return fields;
    }

    @Override
    public long countOrderDailyMessage(String orderReference, List<String> operations) {

        return ((Number) getSessionCustom()
                .createNativeQuery(countOrderDailyMessage)
                .setParameter("reference", orderReference)
                .setParameterList("operations", operations)
                .getSingleResult()).longValue();
    }

}