implementing polymorphism when inserting into various different types of tables
This commit is contained in:
@@ -4,15 +4,14 @@ package com.safeqr.app.qrcode.service;
|
||||
import com.safeqr.app.constants.CommonConstants;
|
||||
import com.safeqr.app.qrcode.dto.QRCodePayload;
|
||||
import com.safeqr.app.qrcode.dto.response.BaseScanResponse;
|
||||
import com.safeqr.app.qrcode.dto.response.URLResponse;
|
||||
import com.safeqr.app.qrcode.entity.QRCode;
|
||||
import com.safeqr.app.qrcode.entity.QRCodeType;
|
||||
import com.safeqr.app.qrcode.entity.QRCodeURL;
|
||||
import com.safeqr.app.qrcode.entity.ScanHistory;
|
||||
import com.safeqr.app.qrcode.entity.QRCodeEntity;
|
||||
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
|
||||
import com.safeqr.app.qrcode.entity.ScanHistoryEntity;
|
||||
import com.safeqr.app.qrcode.model.factory.QRCodeFactoryProvider;
|
||||
import com.safeqr.app.qrcode.model.QRCodeModel;
|
||||
import com.safeqr.app.qrcode.repository.QRCodeRepository;
|
||||
import com.safeqr.app.qrcode.repository.QRCodeTypeRepository;
|
||||
import com.safeqr.app.qrcode.repository.ScanHistoryRepository;
|
||||
import com.safeqr.app.qrcode.repository.URLRepository;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -20,52 +19,48 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.net.URL;
|
||||
|
||||
@Service
|
||||
public class QRCodeTypeService {
|
||||
private static final Logger logger = LoggerFactory.getLogger(QRCodeTypeService.class);
|
||||
|
||||
private final QRCodeFactoryProvider qrCodeFactoryProvider;
|
||||
|
||||
@Autowired
|
||||
public QRCodeTypeService(QRCodeFactoryProvider qrCodeFactoryProvider) {
|
||||
this.qrCodeFactoryProvider = qrCodeFactoryProvider;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Autowired
|
||||
private QRCodeTypeRepository qrCodeTypeRepository;
|
||||
@Autowired
|
||||
private ScanHistoryRepository scanHistoryRepository;
|
||||
@Autowired
|
||||
private QRCodeRepository qrCodeRepository;
|
||||
@Autowired
|
||||
private URLRepository urlRepository;
|
||||
|
||||
|
||||
@Autowired
|
||||
private URLVerificationService urlVerificationService;
|
||||
@Autowired
|
||||
private SafeBrowsingService safeBrowsingService;
|
||||
|
||||
private List<QRCodeType> configs;
|
||||
private QRCodeType defaultQRCodeType;
|
||||
private List<QRCodeTypeEntity> configs;
|
||||
private QRCodeTypeEntity defaultQRCodeTypeEntity;
|
||||
|
||||
@PostConstruct
|
||||
public void loadQRCodeTypes() {
|
||||
// Fetch all QR Code Types from the database
|
||||
configs = qrCodeTypeRepository.findAll();
|
||||
// Set the default QR Code Type
|
||||
defaultQRCodeType = configs.stream()
|
||||
defaultQRCodeTypeEntity = configs.stream()
|
||||
.filter(config -> config.getType().equals(CommonConstants.DEFAULT_QR_CODE_TYPE))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public List<QRCodeType> getAllTypes() {
|
||||
public List<QRCodeTypeEntity> getAllTypes() {
|
||||
return configs;
|
||||
}
|
||||
|
||||
@@ -74,10 +69,10 @@ public class QRCodeTypeService {
|
||||
logger.info("scanQRCode: userId={}, data={}", userId, data);
|
||||
|
||||
// Get the QR Code Type
|
||||
QRCodeType qrType = getQRCodeType(data);
|
||||
QRCodeTypeEntity qrType = getQRCodeType(data);
|
||||
|
||||
// Insert the QR Code into main qrcode table
|
||||
QRCode scannedQR = qrCodeRepository.save(QRCode.builder()
|
||||
QRCodeEntity scannedQR = qrCodeRepository.save(QRCodeEntity.builder()
|
||||
.userId(userId)
|
||||
.contents(data)
|
||||
.qrCodeTypeId(qrType.getId())
|
||||
@@ -87,49 +82,52 @@ public class QRCodeTypeService {
|
||||
// Insert into Scan History table if userId is not null
|
||||
logger.info("scanQRCode: scannedQR new ID={}", scannedQR.getId());
|
||||
if (userId != null) {
|
||||
scanHistoryRepository.save(ScanHistory.builder()
|
||||
scanHistoryRepository.save(ScanHistoryEntity.builder()
|
||||
.qrCodeId(scannedQR.getId())
|
||||
.userId(userId)
|
||||
.scanStatus(ScanHistory.ScanStatus.ACTIVE)
|
||||
.scanStatus(ScanHistoryEntity.ScanStatus.ACTIVE)
|
||||
.build());
|
||||
}
|
||||
// Insert into various tables
|
||||
return insertIntoRespectiveTable(scannedQR, qrType);
|
||||
|
||||
QRCodeModel qrCodeModel = qrCodeFactoryProvider.createQRCodeInstance(scannedQR, qrType);
|
||||
qrCodeModel.insertDB();
|
||||
|
||||
return BaseScanResponse.builder().qrcode(qrCodeModel).build();
|
||||
}
|
||||
private QRCodeType getQRCodeType(String data) {
|
||||
private QRCodeTypeEntity getQRCodeType(String data) {
|
||||
return configs.stream()
|
||||
.filter(config -> data.toLowerCase().startsWith(config.getPrefix().toLowerCase()))
|
||||
.findFirst()
|
||||
.orElse(defaultQRCodeType);
|
||||
.orElse(defaultQRCodeTypeEntity);
|
||||
}
|
||||
|
||||
private BaseScanResponse insertIntoRespectiveTable(QRCode qrCode, QRCodeType qrCodeType) {
|
||||
String contents = qrCode.getContents();
|
||||
try {
|
||||
QRCodeURL urlObj = urlVerificationService.breakdownURL(contents);
|
||||
List<String> redirectChain = urlVerificationService.countAndTrackRedirects(contents);
|
||||
urlObj.setQrCodeId(qrCode.getId());
|
||||
urlObj.setRedirect(redirectChain.size() - 1);
|
||||
urlObj.setRedirectChain(redirectChain);
|
||||
|
||||
// Insert into URL table
|
||||
urlRepository.save(urlObj);
|
||||
|
||||
return URLResponse.builder().scannedQRCode(qrCode).qrCode(qrCodeType).details(urlObj).build();
|
||||
} catch (IOException | URISyntaxException e) {
|
||||
logger.error("Error: ", e);
|
||||
}
|
||||
|
||||
return BaseScanResponse.builder()
|
||||
.scannedQRCode(qrCode)
|
||||
.qrCode(qrCodeType)
|
||||
.build();
|
||||
}
|
||||
// private BaseScanResponse insertIntoRespectiveTable(QRCodeEntity qrCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) {
|
||||
// String contents = qrCodeEntity.getContents();
|
||||
// try {
|
||||
// QRCodeURLEntity urlObj = urlVerificationService.breakdownURL(contents);
|
||||
// List<String> redirectChain = urlVerificationService.countAndTrackRedirects(contents);
|
||||
// urlObj.setQrCodeId(qrCodeEntity.getId());
|
||||
// urlObj.setRedirect(redirectChain.size() - 1);
|
||||
// urlObj.setRedirectChain(redirectChain);
|
||||
//
|
||||
// // Insert into URL table
|
||||
// urlRepository.save(urlObj);
|
||||
//
|
||||
// return URLResponse.builder().scannedQRCode(qrCodeEntity).qrCode(qrCodeTypeEntity).details(urlObj).build();
|
||||
// } catch (IOException | URISyntaxException e) {
|
||||
// logger.error("Error: ", e);
|
||||
// }
|
||||
//
|
||||
// return BaseScanResponse.builder()
|
||||
// .scannedQRCode(qrCodeEntity)
|
||||
// .qrCode(qrCodeTypeEntity)
|
||||
// .build();
|
||||
// }
|
||||
|
||||
public Mono<String> detectType(QRCodePayload payload) {
|
||||
String data = payload.getData();
|
||||
|
||||
for (QRCodeType config : configs) {
|
||||
for (QRCodeTypeEntity config : configs) {
|
||||
if (data.startsWith(config.getPrefix())) {
|
||||
if ("URL".equals(config.getType())) {
|
||||
try
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.safeqr.app.qrcode.service;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class TextVerificationService {
|
||||
private static final Logger logger = LoggerFactory.getLogger(TextVerificationService.class);
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package com.safeqr.app.qrcode.service;
|
||||
import com.safeqr.app.constants.CommonConstants;
|
||||
import com.safeqr.app.qrcode.dto.QRCodePayload;
|
||||
import com.safeqr.app.qrcode.dto.URLVerificationResponse;
|
||||
import com.safeqr.app.qrcode.entity.QRCodeURL;
|
||||
import com.safeqr.app.qrcode.entity.QRCodeURLEntity;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -20,10 +20,10 @@ public class URLVerificationService {
|
||||
private static final Logger logger = LoggerFactory.getLogger(URLVerificationService.class);
|
||||
|
||||
// Function to breakdown URL into subdomain, domain, topLevelDomain, query params, fragment
|
||||
public QRCodeURL breakdownURL(String urlString) throws MalformedURLException, URISyntaxException {
|
||||
public QRCodeURLEntity breakdownURL(String urlString) throws MalformedURLException, URISyntaxException {
|
||||
URI uri = new URI(urlString);
|
||||
URL url = uri.toURL();
|
||||
QRCodeURL urlObj = new QRCodeURL();
|
||||
QRCodeURLEntity urlObj = new QRCodeURLEntity();
|
||||
|
||||
String host = url.getHost();
|
||||
// split host into subdomain, domain, topLevelDomain
|
||||
@@ -65,7 +65,7 @@ public class URLVerificationService {
|
||||
return urlObj;
|
||||
}
|
||||
|
||||
List<String> countAndTrackRedirects(String urlString) throws IOException, URISyntaxException {
|
||||
public List<String> countAndTrackRedirects(String urlString) throws IOException, URISyntaxException {
|
||||
URI uri = new URI(urlString);
|
||||
URL url = uri.toURL();
|
||||
List<String> redirectChain = new ArrayList<>();
|
||||
|
||||
Reference in New Issue
Block a user