Subversion Repositories SmartDukaan

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
21285 kshitij.so 1
package com.spice.profitmandi.web.processor;
2
 
3
import java.time.LocalDateTime;
26706 amit.gupta 4
import java.util.ArrayList;
26656 amit.gupta 5
import java.util.HashMap;
21285 kshitij.so 6
import java.util.List;
26656 amit.gupta 7
import java.util.Map;
21285 kshitij.so 8
import java.util.Random;
9
 
26712 amit.gupta 10
import org.apache.logging.log4j.LogManager;
11
import org.apache.logging.log4j.Logger;
21285 kshitij.so 12
import org.springframework.beans.factory.annotation.Autowired;
26649 amit.gupta 13
import org.springframework.beans.factory.annotation.Value;
26657 amit.gupta 14
import org.springframework.mail.javamail.JavaMailSender;
21285 kshitij.so 15
import org.springframework.stereotype.Component;
16
 
26709 amit.gupta 17
import com.fasterxml.jackson.annotation.JsonProperty;
21285 kshitij.so 18
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
21499 kshitij.so 19
import com.spice.profitmandi.common.util.Utils;
26656 amit.gupta 20
import com.spice.profitmandi.common.web.client.RestClient;
21735 ashik.ali 21
import com.spice.profitmandi.dao.entity.dtr.Otp;
22
import com.spice.profitmandi.dao.enumuration.dtr.OtpType;
23
import com.spice.profitmandi.dao.repository.dtr.OtpRepository;
26712 amit.gupta 24
import com.spice.profitmandi.service.scheme.SchemeServiceImpl;
21285 kshitij.so 25
import com.spice.profitmandi.web.res.OTPResponse;
26
 
27
@Component
26087 tejbeer 28
public class OtpProcessor {
21285 kshitij.so 29
 
26712 amit.gupta 30
	private static final Logger LOGGER = LogManager.getLogger(SchemeServiceImpl.class);
26710 amit.gupta 31
	private static final String SMS_GATEWAY = "http://sms.smartdukaan.com/index.php/sms/templatesms";
21285 kshitij.so 32
	private static final int len = 5;
26087 tejbeer 33
	private static final String numbers = "0123456789";
23309 amit.gupta 34
	private static final String text = "Dear Customer, {0} is the OTP that you have requested to login into SmartDukaan. Don't share your OTP with anyone.";
21285 kshitij.so 35
 
36
	@Autowired
37
	OtpRepository otpRepository;
26711 amit.gupta 38
 
39
	@Autowired
40
	JavaMailSender mailSender;
41
 
26649 amit.gupta 42
	@Value("${prod}")
43
	private boolean prodEnv;
21285 kshitij.so 44
 
26711 amit.gupta 45
	@Autowired
46
	RestClient restClient;
26649 amit.gupta 47
 
26087 tejbeer 48
	private String getOtp() {
21285 kshitij.so 49
		Random rndm_method = new Random();
50
		char[] otp = new char[len];
51
 
26087 tejbeer 52
		for (int i = 0; i < len; i++) {
21285 kshitij.so 53
			otp[i] = numbers.charAt(rndm_method.nextInt(numbers.length()));
54
		}
55
		return String.valueOf(otp);
56
	}
57
 
26087 tejbeer 58
	public OTPResponse generateOtp(String email, String phone, OtpType otpType)
59
			throws Exception, ProfitMandiBusinessException {
21285 kshitij.so 60
		OTPResponse otpResponse = new OTPResponse();
23273 ashik.ali 61
		List<Otp> otps = otpRepository.selectAllByEmailWithTime(email);
21285 kshitij.so 62
		String otp = null;
26087 tejbeer 63
		if (otps.size() >= 5) {
21285 kshitij.so 64
			otpResponse.setReference_id(0);
65
			otpResponse.setResult(false);
66
			otpResponse.setMessage("Maximum limit reached for the day");
67
			return otpResponse;
68
		}
26087 tejbeer 69
		if (!otps.isEmpty()) {
70
			if (otps.get(0).getCreatedOn().isAfter(LocalDateTime.now().minusMinutes(2))) {
21285 kshitij.so 71
				otpResponse.setMessage("OTP generated less than 2 minutes ago");
72
				otpResponse.setReference_id(otps.get(0).getId());
73
				otpResponse.setResult(true);
21299 kshitij.so 74
				otpResponse.setOtp(otps.get(0).getOtp());
21285 kshitij.so 75
				return otpResponse;
26087 tejbeer 76
			} else if (otps.get(0).getCreatedOn().isAfter(LocalDateTime.now().minusMinutes(10))) {
21285 kshitij.so 77
				otp = otps.get(0).getOtp();
26087 tejbeer 78
			} else {
21285 kshitij.so 79
				;
80
			}
81
		}
26087 tejbeer 82
		if (otp == null || otp.isEmpty()) {
21285 kshitij.so 83
			otp = getOtp();
84
		}
26087 tejbeer 85
 
23273 ashik.ali 86
		Otp otp_bean = new Otp();
87
		otp_bean.setEmail(email);
88
		otp_bean.setMobile(phone);
89
		otp_bean.setOtp(otp);
90
		otp_bean.setOtpType(otpType);
91
		otp_bean.setCreatedOn(LocalDateTime.now());
92
		otp_bean.setExpiryTimestamp(LocalDateTime.now().plusMinutes(10));
93
		otpRepository.persist(otp_bean);
26711 amit.gupta 94
		if (prodEnv) {
26657 amit.gupta 95
			sendOtp(otp_bean);
96
		}
26087 tejbeer 97
 
23273 ashik.ali 98
		otpResponse.setReference_id(otp_bean.getId());
21285 kshitij.so 99
		otpResponse.setMessage("OTP generated successfully");
100
		otpResponse.setResult(true);
23273 ashik.ali 101
		otpResponse.setOtp(otp_bean.getOtp());
21285 kshitij.so 102
		return otpResponse;
103
	}
104
 
26087 tejbeer 105
	public OTPResponse validateOtp(String email, int reference_id, String otp_number)
106
			throws Exception, ProfitMandiBusinessException {
21285 kshitij.so 107
		OTPResponse otpResponse = new OTPResponse();
23420 ashik.ali 108
		Otp otp = otpRepository.selectById(reference_id);
26087 tejbeer 109
		otp.setTryCount(otp.getTryCount() + 1);
21285 kshitij.so 110
		otpResponse.setReference_id(reference_id);
26087 tejbeer 111
		if (!otp.getEmail().equalsIgnoreCase(email) || !otp.getOtp().equalsIgnoreCase(otp_number)) {
21285 kshitij.so 112
			otpResponse.setMessage("Invalid otp");
113
			otpResponse.setResult(false);
23273 ashik.ali 114
			otpRepository.persist(otp);
21285 kshitij.so 115
			return otpResponse;
116
		}
26087 tejbeer 117
		if (otp.isExpired() || otp.isVerified() || otp.getExpiryTimestamp().isBefore(LocalDateTime.now())) {
21285 kshitij.so 118
			otpResponse.setMessage("OTP expired");
119
			otpResponse.setResult(false);
120
			return otpResponse;
121
		}
26087 tejbeer 122
		if (otp.getTryCount() > 5) {
21285 kshitij.so 123
			otpResponse.setMessage("Maximum try count reached");
124
			otpResponse.setResult(false);
125
			return otpResponse;
126
		}
127
		otp.setExpired(true);
128
		otp.setVerified(true);
23273 ashik.ali 129
		otpRepository.persist(otp);
21285 kshitij.so 130
		otpResponse.setMessage("OTP validated successfully");
131
		otpResponse.setResult(true);
132
		return otpResponse;
133
	}
26087 tejbeer 134
 
26657 amit.gupta 135
	private void sendOtp(Otp otp) throws Exception {
136
		String msg = java.text.MessageFormat.format(text, otp.getOtp());
26706 amit.gupta 137
		String otpString = otp.getOtp();
26657 amit.gupta 138
		Utils.sendMailWithAttachments(mailSender, otp.getEmail(), null, "One Time Password - Smartdukaan", msg, null);
26706 amit.gupta 139
		try {
140
			this.sendSms(otpString, otp.getMobile());
26087 tejbeer 141
		} catch (Exception e) {
21499 kshitij.so 142
			e.printStackTrace();
26706 amit.gupta 143
		}
26087 tejbeer 144
 
21499 kshitij.so 145
	}
26711 amit.gupta 146
 
26656 amit.gupta 147
	public void sendSms(String text, String mobileNumber) throws Exception {
26706 amit.gupta 148
		Map<String, String> headersMap = new HashMap<>();
149
		headersMap.put("Content-Type", "application/json");
150
		headersMap.put("apikey", "b866f7-c6c483-682ff5-054420-ad9e2c");
151
		SmsMessage smsMessage = new SmsMessage();
26711 amit.gupta 152
 
26706 amit.gupta 153
		Message message = new Message();
154
		message.setNumber(mobileNumber);
155
 
156
		Map<String, String> map = new HashMap<>();
26709 amit.gupta 157
		map.put("F1", text);
26706 amit.gupta 158
		message.setText(map);
26711 amit.gupta 159
 
26706 amit.gupta 160
		List<Message> messages = new ArrayList<>();
161
		messages.add(message);
26711 amit.gupta 162
 
26706 amit.gupta 163
		smsMessage.setMessage(messages);
26711 amit.gupta 164
 
26712 amit.gupta 165
		String response = restClient.postJson(SMS_GATEWAY, smsMessage, headersMap);
166
		LOGGER.info(response);
167
 
26656 amit.gupta 168
	}
26711 amit.gupta 169
 
26706 amit.gupta 170
	class SmsMessage {
26707 amit.gupta 171
		private String sender = "SMTDKN";
26711 amit.gupta 172
		@JsonProperty(value = "templateid")
26706 amit.gupta 173
		private String templateId = "54";
26711 amit.gupta 174
 
26706 amit.gupta 175
		private List<Message> message;
26711 amit.gupta 176
 
177
		@JsonProperty(value = "messagetype")
178
		private String messageType = "TXT";
179
 
26706 amit.gupta 180
		@Override
181
		public String toString() {
26711 amit.gupta 182
			return "SmsMessage [sender=" + sender + ", templateId=" + templateId + ", message=" + message
183
					+ ", messageType=" + messageType + "]";
26706 amit.gupta 184
		}
26711 amit.gupta 185
 
186
 
187
 
188
		public String getMessageType() {
189
			return messageType;
190
		}
191
 
192
 
193
 
194
		public void setMessageType(String messageType) {
195
			this.messageType = messageType;
196
		}
197
 
198
 
199
 
26706 amit.gupta 200
		public String getSender() {
201
			return sender;
202
		}
26711 amit.gupta 203
 
26706 amit.gupta 204
		public void setSender(String sender) {
205
			this.sender = sender;
206
		}
26711 amit.gupta 207
 
26706 amit.gupta 208
		public String getTemplateId() {
209
			return templateId;
210
		}
26711 amit.gupta 211
 
26706 amit.gupta 212
		public void setTemplateId(String templateId) {
213
			this.templateId = templateId;
214
		}
26711 amit.gupta 215
 
26706 amit.gupta 216
		public List<Message> getMessage() {
217
			return message;
218
		}
26711 amit.gupta 219
 
26706 amit.gupta 220
		public void setMessage(List<Message> message) {
221
			this.message = message;
222
		}
26711 amit.gupta 223
 
26706 amit.gupta 224
	}
26711 amit.gupta 225
 
26706 amit.gupta 226
	class Message {
227
		private String number;
26711 amit.gupta 228
 
26706 amit.gupta 229
		public String getNumber() {
230
			return number;
231
		}
26711 amit.gupta 232
 
26706 amit.gupta 233
		public void setNumber(String number) {
234
			this.number = number;
235
		}
26711 amit.gupta 236
 
26706 amit.gupta 237
		private Map<String, String> text;
26711 amit.gupta 238
 
26706 amit.gupta 239
		@Override
240
		public String toString() {
26711 amit.gupta 241
			return "Message [number=" + number + ", text=" + text + "]";
26706 amit.gupta 242
		}
26711 amit.gupta 243
 
26706 amit.gupta 244
		public Map<String, String> getText() {
245
			return text;
246
		}
26711 amit.gupta 247
 
26706 amit.gupta 248
		public void setText(Map<String, String> text) {
249
			this.text = text;
250
		}
26711 amit.gupta 251
 
26706 amit.gupta 252
	}
21285 kshitij.so 253
 
254
}