From 3e0ad7db2d17b8e439dcadec6620691e0c651d4c Mon Sep 17 00:00:00 2001 From: ltiongku Date: Wed, 17 Jul 2024 18:53:01 +0800 Subject: [PATCH] implementing polymorphism when inserting into various different types of tables --- .../controller/QRCodeTypeController.java | 4 +- .../qrcode/dto/response/BaseScanResponse.java | 6 +- .../app/qrcode/dto/response/URLResponse.java | 14 --- .../entity/{QRCode.java => QRCodeEntity.java} | 2 +- .../app/qrcode/entity/QRCodeTextEntity.java | 33 ++++++ ...{QRCodeType.java => QRCodeTypeEntity.java} | 2 +- .../{QRCodeURL.java => QRCodeURLEntity.java} | 2 +- ...canHistory.java => ScanHistoryEntity.java} | 2 +- .../safeqr/app/qrcode/model/QRCodeModel.java | 13 +++ .../safeqr/app/qrcode/model/QRCodeText.java | 40 +++++++ .../safeqr/app/qrcode/model/QRCodeURL.java | 54 +++++++++ .../qrcode/model/factory/QRCodeFactory.java | 10 ++ .../model/factory/QRCodeFactoryProvider.java | 25 +++++ .../model/factory/QRCodeTextFactory.java | 23 ++++ .../model/factory/QRCodeURLFactory.java | 23 ++++ .../qrcode/repository/QRCodeRepository.java | 4 +- .../repository/QRCodeTypeRepository.java | 4 +- .../repository/ScanHistoryRepository.java | 4 +- .../app/qrcode/repository/TextRepository.java | 8 ++ .../app/qrcode/repository/URLRepository.java | 4 +- .../app/qrcode/service/QRCodeTypeService.java | 106 +++++++++--------- .../service/TextVerificationService.java | 10 ++ .../service/URLVerificationService.java | 8 +- .../safeqr/app/user/entity/UserEntity.java | 10 +- 24 files changed, 319 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/com/safeqr/app/qrcode/dto/response/URLResponse.java rename src/main/java/com/safeqr/app/qrcode/entity/{QRCode.java => QRCodeEntity.java} (96%) create mode 100644 src/main/java/com/safeqr/app/qrcode/entity/QRCodeTextEntity.java rename src/main/java/com/safeqr/app/qrcode/entity/{QRCodeType.java => QRCodeTypeEntity.java} (93%) rename src/main/java/com/safeqr/app/qrcode/entity/{QRCodeURL.java => QRCodeURLEntity.java} (97%) rename src/main/java/com/safeqr/app/qrcode/entity/{ScanHistory.java => ScanHistoryEntity.java} (94%) create mode 100644 src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java create mode 100644 src/main/java/com/safeqr/app/qrcode/model/QRCodeText.java create mode 100644 src/main/java/com/safeqr/app/qrcode/model/QRCodeURL.java create mode 100644 src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactory.java create mode 100644 src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactoryProvider.java create mode 100644 src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeTextFactory.java create mode 100644 src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeURLFactory.java create mode 100644 src/main/java/com/safeqr/app/qrcode/repository/TextRepository.java create mode 100644 src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java diff --git a/src/main/java/com/safeqr/app/qrcode/controller/QRCodeTypeController.java b/src/main/java/com/safeqr/app/qrcode/controller/QRCodeTypeController.java index 6779c09..4823651 100644 --- a/src/main/java/com/safeqr/app/qrcode/controller/QRCodeTypeController.java +++ b/src/main/java/com/safeqr/app/qrcode/controller/QRCodeTypeController.java @@ -6,7 +6,7 @@ import com.safeqr.app.qrcode.dto.QRCodePayload; import com.safeqr.app.qrcode.dto.RedirectCountResponse; import com.safeqr.app.qrcode.dto.URLVerificationResponse; import com.safeqr.app.qrcode.dto.response.BaseScanResponse; -import com.safeqr.app.qrcode.entity.QRCodeType; +import com.safeqr.app.qrcode.entity.QRCodeTypeEntity; import com.safeqr.app.qrcode.service.QRCodeTypeService; import com.safeqr.app.qrcode.service.RedirectCountService; import com.safeqr.app.qrcode.service.URLVerificationService; @@ -39,7 +39,7 @@ public class QRCodeTypeController { private RedirectCountService redirectCountService; @GetMapping(value = APIConstants.API_URL_QRCODE_GET_ALL) - public ResponseEntity> getAllTypes() { + public ResponseEntity> getAllTypes() { return ResponseEntity.ok(qrCodeTypeService.getAllTypes()); } diff --git a/src/main/java/com/safeqr/app/qrcode/dto/response/BaseScanResponse.java b/src/main/java/com/safeqr/app/qrcode/dto/response/BaseScanResponse.java index 4848c39..f01b5b0 100644 --- a/src/main/java/com/safeqr/app/qrcode/dto/response/BaseScanResponse.java +++ b/src/main/java/com/safeqr/app/qrcode/dto/response/BaseScanResponse.java @@ -1,7 +1,6 @@ package com.safeqr.app.qrcode.dto.response; -import com.safeqr.app.qrcode.entity.QRCode; -import com.safeqr.app.qrcode.entity.QRCodeType; +import com.safeqr.app.qrcode.model.QRCodeModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,6 +11,5 @@ import lombok.experimental.SuperBuilder; @AllArgsConstructor @NoArgsConstructor public class BaseScanResponse { - private QRCode scannedQRCode; - private QRCodeType qrCode; + private QRCodeModel qrcode; } diff --git a/src/main/java/com/safeqr/app/qrcode/dto/response/URLResponse.java b/src/main/java/com/safeqr/app/qrcode/dto/response/URLResponse.java deleted file mode 100644 index cb5a767..0000000 --- a/src/main/java/com/safeqr/app/qrcode/dto/response/URLResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.safeqr.app.qrcode.dto.response; - -import com.safeqr.app.qrcode.entity.QRCodeURL; -import lombok.*; -import lombok.experimental.SuperBuilder; - -@EqualsAndHashCode(callSuper = true) -@Data -@SuperBuilder -@AllArgsConstructor -@NoArgsConstructor -public final class URLResponse extends BaseScanResponse{ - private QRCodeURL details; -} diff --git a/src/main/java/com/safeqr/app/qrcode/entity/QRCode.java b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeEntity.java similarity index 96% rename from src/main/java/com/safeqr/app/qrcode/entity/QRCode.java rename to src/main/java/com/safeqr/app/qrcode/entity/QRCodeEntity.java index b009181..b390d0c 100644 --- a/src/main/java/com/safeqr/app/qrcode/entity/QRCode.java +++ b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeEntity.java @@ -18,7 +18,7 @@ import java.util.UUID; @Builder @AllArgsConstructor @NoArgsConstructor -public class QRCode { +public class QRCodeEntity { @Id @GeneratedValue(generator = "UUID") diff --git a/src/main/java/com/safeqr/app/qrcode/entity/QRCodeTextEntity.java b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeTextEntity.java new file mode 100644 index 0000000..c32d862 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeTextEntity.java @@ -0,0 +1,33 @@ +package com.safeqr.app.qrcode.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.Builder; +import org.hibernate.annotations.UuidGenerator; + +import java.util.UUID; + +@Entity +@Table(name = "text", schema = "safeqr") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class QRCodeTextEntity { + @Id + @JsonIgnore + @GeneratedValue(generator = "UUID") + @UuidGenerator + @Column(updatable = false, nullable = false) + private UUID id; + + @JsonIgnore + @Column(name = "qr_code_id") + private UUID qrCodeId; + + private String text; +} diff --git a/src/main/java/com/safeqr/app/qrcode/entity/QRCodeType.java b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeTypeEntity.java similarity index 93% rename from src/main/java/com/safeqr/app/qrcode/entity/QRCodeType.java rename to src/main/java/com/safeqr/app/qrcode/entity/QRCodeTypeEntity.java index b78418f..2d1b5c6 100644 --- a/src/main/java/com/safeqr/app/qrcode/entity/QRCodeType.java +++ b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeTypeEntity.java @@ -8,7 +8,7 @@ import lombok.Data; @Entity @Table(name = "qr_code_types", schema = "safeqr") @Data -public class QRCodeType { +public class QRCodeTypeEntity { @Id @JsonIgnore diff --git a/src/main/java/com/safeqr/app/qrcode/entity/QRCodeURL.java b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeURLEntity.java similarity index 97% rename from src/main/java/com/safeqr/app/qrcode/entity/QRCodeURL.java rename to src/main/java/com/safeqr/app/qrcode/entity/QRCodeURLEntity.java index c6c6ded..e7da284 100644 --- a/src/main/java/com/safeqr/app/qrcode/entity/QRCodeURL.java +++ b/src/main/java/com/safeqr/app/qrcode/entity/QRCodeURLEntity.java @@ -18,7 +18,7 @@ import java.util.UUID; @Builder @NoArgsConstructor @AllArgsConstructor -public class QRCodeURL { +public class QRCodeURLEntity { @Id @JsonIgnore @GeneratedValue(generator = "UUID") diff --git a/src/main/java/com/safeqr/app/qrcode/entity/ScanHistory.java b/src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java similarity index 94% rename from src/main/java/com/safeqr/app/qrcode/entity/ScanHistory.java rename to src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java index fd36e17..99be919 100644 --- a/src/main/java/com/safeqr/app/qrcode/entity/ScanHistory.java +++ b/src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java @@ -8,7 +8,7 @@ import java.util.UUID; @Entity @Builder @Table(name = "scan_history", schema = "safeqr") -public class ScanHistory { +public class ScanHistoryEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java b/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java new file mode 100644 index 0000000..7a88f0e --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java @@ -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(); +} diff --git a/src/main/java/com/safeqr/app/qrcode/model/QRCodeText.java b/src/main/java/com/safeqr/app/qrcode/model/QRCodeText.java new file mode 100644 index 0000000..de2c1c3 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/QRCodeText.java @@ -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); + } +} \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/model/QRCodeURL.java b/src/main/java/com/safeqr/app/qrcode/model/QRCodeURL.java new file mode 100644 index 0000000..763f50e --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/QRCodeURL.java @@ -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 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); + } + } +} diff --git a/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactory.java b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactory.java new file mode 100644 index 0000000..1da8cb5 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactory.java @@ -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 create(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity); +} diff --git a/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactoryProvider.java b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactoryProvider.java new file mode 100644 index 0000000..aea1783 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeFactoryProvider.java @@ -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()); + } + } +} diff --git a/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeTextFactory.java b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeTextFactory.java new file mode 100644 index 0000000..180c167 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeTextFactory.java @@ -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 { + @Autowired + private TextVerificationService textVerificationService; + + @Autowired + private TextRepository textRepository; + + @Override + public QRCodeText create(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) { + return new QRCodeText(scannedQRCodeEntity, qrCodeTypeEntity, textVerificationService, textRepository); + } +} diff --git a/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeURLFactory.java b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeURLFactory.java new file mode 100644 index 0000000..c85428e --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/model/factory/QRCodeURLFactory.java @@ -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 { + @Autowired + private URLVerificationService urlVerificationService; + + @Autowired + private URLRepository urlRepository; + + @Override + public QRCodeURL create(QRCodeEntity scannedQRCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) { + return new QRCodeURL(scannedQRCodeEntity, qrCodeTypeEntity, urlVerificationService, urlRepository); + } +} diff --git a/src/main/java/com/safeqr/app/qrcode/repository/QRCodeRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/QRCodeRepository.java index 26c749b..4e89241 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/QRCodeRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/QRCodeRepository.java @@ -1,8 +1,8 @@ package com.safeqr.app.qrcode.repository; -import com.safeqr.app.qrcode.entity.QRCode; +import com.safeqr.app.qrcode.entity.QRCodeEntity; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; -public interface QRCodeRepository extends JpaRepository { +public interface QRCodeRepository extends JpaRepository { } diff --git a/src/main/java/com/safeqr/app/qrcode/repository/QRCodeTypeRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/QRCodeTypeRepository.java index c99889b..49d9a19 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/QRCodeTypeRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/QRCodeTypeRepository.java @@ -1,10 +1,10 @@ package com.safeqr.app.qrcode.repository; -import com.safeqr.app.qrcode.entity.QRCodeType; +import com.safeqr.app.qrcode.entity.QRCodeTypeEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface QRCodeTypeRepository extends JpaRepository { +public interface QRCodeTypeRepository extends JpaRepository { } diff --git a/src/main/java/com/safeqr/app/qrcode/repository/ScanHistoryRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/ScanHistoryRepository.java index 9c33282..ea3440b 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/ScanHistoryRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/ScanHistoryRepository.java @@ -1,9 +1,9 @@ package com.safeqr.app.qrcode.repository; -import com.safeqr.app.qrcode.entity.ScanHistory; +import com.safeqr.app.qrcode.entity.ScanHistoryEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface ScanHistoryRepository extends JpaRepository { +public interface ScanHistoryRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/TextRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/TextRepository.java new file mode 100644 index 0000000..8a65203 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/repository/TextRepository.java @@ -0,0 +1,8 @@ +package com.safeqr.app.qrcode.repository; + +import com.safeqr.app.qrcode.entity.QRCodeTextEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.UUID; + +public interface TextRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/URLRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/URLRepository.java index ca40dbc..c2be291 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/URLRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/URLRepository.java @@ -1,8 +1,8 @@ package com.safeqr.app.qrcode.repository; -import com.safeqr.app.qrcode.entity.QRCodeURL; +import com.safeqr.app.qrcode.entity.QRCodeURLEntity; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; -public interface URLRepository extends JpaRepository { +public interface URLRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/service/QRCodeTypeService.java b/src/main/java/com/safeqr/app/qrcode/service/QRCodeTypeService.java index 067df79..89dc33f 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/QRCodeTypeService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/QRCodeTypeService.java @@ -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 configs; - private QRCodeType defaultQRCodeType; + private List 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 getAllTypes() { + public List 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 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 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 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 diff --git a/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java new file mode 100644 index 0000000..2acf632 --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java @@ -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); +} \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java index 6668dc5..e6f07de 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java @@ -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 countAndTrackRedirects(String urlString) throws IOException, URISyntaxException { + public List countAndTrackRedirects(String urlString) throws IOException, URISyntaxException { URI uri = new URI(urlString); URL url = uri.toURL(); List redirectChain = new ArrayList<>(); diff --git a/src/main/java/com/safeqr/app/user/entity/UserEntity.java b/src/main/java/com/safeqr/app/user/entity/UserEntity.java index 8eb11c7..380e2e2 100644 --- a/src/main/java/com/safeqr/app/user/entity/UserEntity.java +++ b/src/main/java/com/safeqr/app/user/entity/UserEntity.java @@ -1,5 +1,6 @@ package com.safeqr.app.user.entity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -21,8 +22,13 @@ public class UserEntity { private String id; private String name; private String email; - private OffsetDateTime date_created; - private OffsetDateTime date_updated; + + @Column(name = "date_created") + private OffsetDateTime dateCreated; + + @Column(name = "date_updated") + private OffsetDateTime dateUpdated; + private String source; private String status; }