All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.mosip.registration.service.template.impl.NotificationServiceImpl Maven / Gradle / Ivy

package io.mosip.registration.service.template.impl;

import static io.mosip.registration.constants.RegistrationConstants.APPLICATION_ID;
import static io.mosip.registration.constants.RegistrationConstants.APPLICATION_NAME;
import static io.mosip.registration.constants.RegistrationConstants.EMAIL_SERVICE;
import static io.mosip.registration.constants.RegistrationConstants.EMAIL_SUBJECT;
import static io.mosip.registration.constants.RegistrationConstants.NOTIFICATION_SERVICE;
import static io.mosip.registration.constants.RegistrationConstants.SMS_SERVICE;

import java.net.SocketTimeoutException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.ResourceAccessException;

import io.mosip.kernel.core.exception.ExceptionUtils;
import io.mosip.kernel.core.logger.spi.Logger;
import io.mosip.kernel.core.util.DateUtils;
import io.mosip.kernel.core.util.StringUtils;
import io.mosip.registration.audit.AuditManagerService;
import io.mosip.registration.config.AppConfig;
import io.mosip.registration.constants.AuditEvent;
import io.mosip.registration.constants.AuditReferenceIdTypes;
import io.mosip.registration.constants.Components;
import io.mosip.registration.constants.RegistrationConstants;
import io.mosip.registration.context.SessionContext;
import io.mosip.registration.dto.ErrorResponseDTO;
import io.mosip.registration.dto.NotificationDTO;
import io.mosip.registration.dto.ResponseDTO;
import io.mosip.registration.dto.SuccessResponseDTO;
import io.mosip.registration.exception.RegBaseCheckedException;
import io.mosip.registration.exception.RegistrationExceptionConstants;
import io.mosip.registration.service.template.NotificationService;
import io.mosip.registration.util.restclient.ServiceDelegateUtil;

/**
 * SMS and Email notification service
 * 
 * @author Dinesh Ashokan
 *
 */
@Service
public class NotificationServiceImpl implements NotificationService {

	/**
	 * Instance of LOGGER
	 */
	private static final Logger LOGGER = AppConfig.getLogger(NotificationServiceImpl.class);

	/**
	 * Instance of {@code AuditFactory}
	 */
	@Autowired
	private AuditManagerService auditFactory;

	/**
	 * serviceDelegateUtil which processes the HTTPRequestDTO requests
	 */
	@Autowired
	private ServiceDelegateUtil serviceDelegateUtil;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * io.mosip.registration.service.NotificationService#sendSMS(java.lang.String,
	 * java.lang.String, java.lang.String)
	 */
	@Override
	public ResponseDTO sendSMS(String message, String number, String regId) throws RegBaseCheckedException {

		LOGGER.info(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID, "sendSMS Method called");
		ResponseDTO responseDTO = new ResponseDTO();
		if (mandatoryCheck(message, number)) {
			NotificationDTO smsdto = new NotificationDTO();
			Map requestMap = new HashMap<>();
			requestMap.put("message", message);
			requestMap.put("number", number);
			smsdto.setRequest(requestMap);
			smsdto.setRequesttime(DateUtils.formatToISOString(DateUtils.getUTCCurrentDateTime()));
			sendNotification(regId, responseDTO, smsdto, SMS_SERVICE, RegistrationConstants.OTP_VALIDATION_SUCCESS);
		} else {
			LOGGER.error(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID,"Message and Number can not be null");
			throw new RegBaseCheckedException(
					RegistrationExceptionConstants.NOTIFICATION_MANDATORY_CHECK_SMS_EXCEPTION.getErrorCode(),
					RegistrationExceptionConstants.NOTIFICATION_MANDATORY_CHECK_SMS_EXCEPTION.getErrorMessage());
		}
		return responseDTO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * io.mosip.registration.service.NotificationService#sendEmail(java.lang.String,
	 * java.lang.String, java.lang.String)
	 */
	@Override
	public ResponseDTO sendEmail(String message, String emailId, String regId) throws RegBaseCheckedException {

		LOGGER.info(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID, "sendEmail Method called");
		ResponseDTO responseDTO = new ResponseDTO();
		if (mandatoryCheck(message, emailId)) {
			auditFactory.audit(AuditEvent.NOTIFICATION_STATUS, Components.NOTIFICATION_SERVICE,
					SessionContext.userContext().getUserId(), AuditReferenceIdTypes.USER_ID.getReferenceTypeId());
			LinkedMultiValueMap emailDetails = new LinkedMultiValueMap<>();
			emailDetails.add("mailTo", emailId);
			emailDetails.add("mailSubject", EMAIL_SUBJECT);
			emailDetails.add("mailContent", message);

			sendNotification(regId, responseDTO, emailDetails, EMAIL_SERVICE,
					RegistrationConstants.OTP_VALIDATION_SUCCESS);
		} else {
			LOGGER.error(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID,"Message and Email can not be null");
			throw new RegBaseCheckedException(
					RegistrationExceptionConstants.NOTIFICATION_MANDATORY_CHECK_EMAIL_EXCEPTION.getErrorCode(),
					RegistrationExceptionConstants.NOTIFICATION_MANDATORY_CHECK_EMAIL_EXCEPTION.getErrorMessage());
		}
		return responseDTO;
	}

	private boolean mandatoryCheck(String message, String id) {
		return !StringUtils.isEmpty(message) && !StringUtils.isEmpty(id);
	}

	/**
	 * To send notification
	 * @param regId
	 * @param responseDTO
	 * @param object
	 * @param service
	 * @param expectedStatus
	 */
	@SuppressWarnings("unchecked")
	private void sendNotification(String regId, ResponseDTO responseDTO, Object object, String service,
			String expectedStatus) {
		StringBuilder sb;
		try {
			Map>> response = (Map>>) serviceDelegateUtil
					.post(service, object, RegistrationConstants.JOB_TRIGGER_POINT_USER);
			if (response != null && response.get(RegistrationConstants.RESPONSE) != null) {
				Map resMap = (Map) response
						.get(RegistrationConstants.RESPONSE);
				String res = (String) resMap.get(RegistrationConstants.UPLOAD_STATUS);
				if (res.contains(expectedStatus)) {
					LOGGER.info(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID, resMap.toString());
					auditFactory.audit(AuditEvent.NOTIFICATION_STATUS, Components.NOTIFICATION_SERVICE,
							SessionContext.userContext().getUserId(),
							AuditReferenceIdTypes.USER_ID.getReferenceTypeId());
					// creating success response
					SuccessResponseDTO successResponseDTO = new SuccessResponseDTO();
					successResponseDTO.setMessage(RegistrationConstants.OTP_VALIDATION_SUCCESS);
					responseDTO.setSuccessResponseDTO(successResponseDTO);
				}
			} else if (response != null) {
				String errorMessage = Optional.ofNullable(response.get(RegistrationConstants.ERRORS))
						.filter(list -> !list.isEmpty()).flatMap(list -> list.stream()
								.filter(map -> map.containsKey(RegistrationConstants.ERROR_MSG)).findAny())
						.map(map -> map.get(RegistrationConstants.ERROR_MSG)).orElse("");

				ErrorResponseDTO errorResponseDTO = new ErrorResponseDTO();
				errorResponseDTO.setMessage(errorMessage);
				List errorResponse = new ArrayList<>();
				errorResponse.add(errorResponseDTO);
				responseDTO.setErrorResponseDTOs(errorResponse);

				LOGGER.info(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID, errorMessage);
				auditFactory.audit(AuditEvent.NOTIFICATION_STATUS, Components.NOTIFICATION_SERVICE,
						SessionContext.userContext().getUserId(), AuditReferenceIdTypes.USER_ID.getReferenceTypeId());
			}
		} catch (Exception exception) {
			sb = new StringBuilder();
			sb.append("Exception in sending ").append(service.toUpperCase()).append(" Notification - ")
					.append(exception.getMessage());

			LOGGER.error(NOTIFICATION_SERVICE, APPLICATION_NAME, APPLICATION_ID,
					exception.getMessage() + ExceptionUtils.getStackTrace(exception));
			auditFactory.audit(AuditEvent.NOTIFICATION_STATUS, Components.NOTIFICATION_SERVICE,
					SessionContext.userContext().getUserId(), AuditReferenceIdTypes.USER_ID.getReferenceTypeId());

			// creating error response
			ErrorResponseDTO errorResponseDTO = new ErrorResponseDTO();
			errorResponseDTO.setMessage("Unable to send " + service.toUpperCase() + " Notification");
			List errorResponse = new ArrayList<>();
			errorResponse.add(errorResponseDTO);
			responseDTO.setErrorResponseDTOs(errorResponse);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy