implementing polymorphism when inserting into various different types of tables

This commit is contained in:
ltiongku
2024-07-17 18:53:01 +08:00
parent f65cee37f9
commit 3e0ad7db2d
24 changed files with 319 additions and 92 deletions

View File

@@ -0,0 +1,13 @@
package com.safeqr.app.qrcode.model;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import lombok.Data;
@Data
public abstract class QRCodeModel {
QRCodeEntity scannedQRCode;
QRCodeTypeEntity qrCode;
public abstract void insertDB();
}

View File

@@ -0,0 +1,40 @@
package com.safeqr.app.qrcode.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTextEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import com.safeqr.app.qrcode.repository.TextRepository;
import com.safeqr.app.qrcode.service.TextVerificationService;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@EqualsAndHashCode(callSuper = true)
@Data
public class QRCodeText extends QRCodeModel {
private static final Logger logger = LoggerFactory.getLogger(QRCodeText.class);
@JsonIgnore
private final TextVerificationService textVerificationService;
@JsonIgnore
private final TextRepository textRepository;
QRCodeTextEntity details;
public QRCodeText(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity, TextVerificationService textVerificationService, TextRepository textRepository) {
this.scannedQRCode = scannedQRCodeEntity;
this.qrCode = qrCodeTypeEntity;
this.textVerificationService = textVerificationService;
this.textRepository = textRepository;
this.details = null;
}
@Override
public void insertDB() {
details = QRCodeTextEntity.builder().qrCodeId(scannedQRCode.getId()).text(scannedQRCode.getContents()).build();
// Insert into URL table
textRepository.save(details);
}
}

View File

@@ -0,0 +1,54 @@
package com.safeqr.app.qrcode.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import com.safeqr.app.qrcode.entity.QRCodeURLEntity;
import com.safeqr.app.qrcode.repository.URLRepository;
import com.safeqr.app.qrcode.service.URLVerificationService;
import lombok.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class QRCodeURL extends QRCodeModel {
private static final Logger logger = LoggerFactory.getLogger(QRCodeURL.class);
@JsonIgnore
private final URLVerificationService urlVerificationService;
@JsonIgnore
private final URLRepository urlRepository;
QRCodeURLEntity details;
public QRCodeURL(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity, URLVerificationService urlVerificationService, URLRepository urlRepository) {
this.scannedQRCode = scannedQRCodeEntity;
this.qrCode = qrCodeTypeEntity;
this.urlVerificationService = urlVerificationService;
this.urlRepository = urlRepository;
this.details = null;
}
@Override
public void insertDB() {
String url = scannedQRCode.getContents();
try {
details = urlVerificationService.breakdownURL(url);
List<String> redirectChain = urlVerificationService.countAndTrackRedirects(url);
// set qrCode Identifier
details.setQrCodeId(scannedQRCode.getId());
details.setRedirect(redirectChain.size() - 1);
details.setRedirectChain(redirectChain);
// Insert into URL table
urlRepository.save(details);
} catch (IOException | URISyntaxException e) {
logger.error("Error: ", e);
}
}
}

View File

@@ -0,0 +1,10 @@
package com.safeqr.app.qrcode.model.factory;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import com.safeqr.app.qrcode.model.QRCodeModel;
@FunctionalInterface
public interface QRCodeFactory<T extends QRCodeModel> {
T create(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity);
}

View File

@@ -0,0 +1,25 @@
package com.safeqr.app.qrcode.model.factory;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import com.safeqr.app.qrcode.model.QRCodeModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class QRCodeFactoryProvider {
@Autowired
private ApplicationContext applicationContext;
public QRCodeModel createQRCodeInstance(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) {
switch (qrCodeTypeEntity.getType().toUpperCase()) {
case "URL":
return applicationContext.getBean(QRCodeURLFactory.class).create(scannedQRCodeEntity, qrCodeTypeEntity);
case "TEXT":
return applicationContext.getBean(QRCodeTextFactory.class).create(scannedQRCodeEntity, qrCodeTypeEntity);
default:
throw new IllegalArgumentException("Unsupported QR code type: " + qrCodeTypeEntity.getType());
}
}
}

View File

@@ -0,0 +1,23 @@
package com.safeqr.app.qrcode.model.factory;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import com.safeqr.app.qrcode.model.QRCodeText;
import com.safeqr.app.qrcode.repository.TextRepository;
import com.safeqr.app.qrcode.service.TextVerificationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class QRCodeTextFactory implements QRCodeFactory<QRCodeText> {
@Autowired
private TextVerificationService textVerificationService;
@Autowired
private TextRepository textRepository;
@Override
public QRCodeText create(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) {
return new QRCodeText(scannedQRCodeEntity, qrCodeTypeEntity, textVerificationService, textRepository);
}
}

View File

@@ -0,0 +1,23 @@
package com.safeqr.app.qrcode.model.factory;
import com.safeqr.app.qrcode.entity.QRCodeEntity;
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
import com.safeqr.app.qrcode.model.QRCodeURL;
import com.safeqr.app.qrcode.repository.URLRepository;
import com.safeqr.app.qrcode.service.URLVerificationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class QRCodeURLFactory implements QRCodeFactory<QRCodeURL> {
@Autowired
private URLVerificationService urlVerificationService;
@Autowired
private URLRepository urlRepository;
@Override
public QRCodeURL create(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) {
return new QRCodeURL(scannedQRCodeEntity, qrCodeTypeEntity, urlVerificationService, urlRepository);
}
}