implementing polymorphism when inserting into various different types of tables
This commit is contained in:
@@ -6,7 +6,7 @@ import com.safeqr.app.qrcode.dto.QRCodePayload;
|
|||||||
import com.safeqr.app.qrcode.dto.RedirectCountResponse;
|
import com.safeqr.app.qrcode.dto.RedirectCountResponse;
|
||||||
import com.safeqr.app.qrcode.dto.URLVerificationResponse;
|
import com.safeqr.app.qrcode.dto.URLVerificationResponse;
|
||||||
import com.safeqr.app.qrcode.dto.response.BaseScanResponse;
|
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.QRCodeTypeService;
|
||||||
import com.safeqr.app.qrcode.service.RedirectCountService;
|
import com.safeqr.app.qrcode.service.RedirectCountService;
|
||||||
import com.safeqr.app.qrcode.service.URLVerificationService;
|
import com.safeqr.app.qrcode.service.URLVerificationService;
|
||||||
@@ -39,7 +39,7 @@ public class QRCodeTypeController {
|
|||||||
private RedirectCountService redirectCountService;
|
private RedirectCountService redirectCountService;
|
||||||
|
|
||||||
@GetMapping(value = APIConstants.API_URL_QRCODE_GET_ALL)
|
@GetMapping(value = APIConstants.API_URL_QRCODE_GET_ALL)
|
||||||
public ResponseEntity<List<QRCodeType>> getAllTypes() {
|
public ResponseEntity<List<QRCodeTypeEntity>> getAllTypes() {
|
||||||
return ResponseEntity.ok(qrCodeTypeService.getAllTypes());
|
return ResponseEntity.ok(qrCodeTypeService.getAllTypes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.safeqr.app.qrcode.dto.response;
|
package com.safeqr.app.qrcode.dto.response;
|
||||||
|
|
||||||
import com.safeqr.app.qrcode.entity.QRCode;
|
import com.safeqr.app.qrcode.model.QRCodeModel;
|
||||||
import com.safeqr.app.qrcode.entity.QRCodeType;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@@ -12,6 +11,5 @@ import lombok.experimental.SuperBuilder;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class BaseScanResponse {
|
public class BaseScanResponse {
|
||||||
private QRCode scannedQRCode;
|
private QRCodeModel qrcode;
|
||||||
private QRCodeType qrCode;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -18,7 +18,7 @@ import java.util.UUID;
|
|||||||
@Builder
|
@Builder
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class QRCode {
|
public class QRCodeEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(generator = "UUID")
|
@GeneratedValue(generator = "UUID")
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import lombok.Data;
|
|||||||
@Entity
|
@Entity
|
||||||
@Table(name = "qr_code_types", schema = "safeqr")
|
@Table(name = "qr_code_types", schema = "safeqr")
|
||||||
@Data
|
@Data
|
||||||
public class QRCodeType {
|
public class QRCodeTypeEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@@ -18,7 +18,7 @@ import java.util.UUID;
|
|||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class QRCodeURL {
|
public class QRCodeURLEntity {
|
||||||
@Id
|
@Id
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@GeneratedValue(generator = "UUID")
|
@GeneratedValue(generator = "UUID")
|
||||||
@@ -8,7 +8,7 @@ import java.util.UUID;
|
|||||||
@Entity
|
@Entity
|
||||||
@Builder
|
@Builder
|
||||||
@Table(name = "scan_history", schema = "safeqr")
|
@Table(name = "scan_history", schema = "safeqr")
|
||||||
public class ScanHistory {
|
public class ScanHistoryEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
13
src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java
Normal file
13
src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java
Normal 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();
|
||||||
|
}
|
||||||
40
src/main/java/com/safeqr/app/qrcode/model/QRCodeText.java
Normal file
40
src/main/java/com/safeqr/app/qrcode/model/QRCodeText.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/main/java/com/safeqr/app/qrcode/model/QRCodeURL.java
Normal file
54
src/main/java/com/safeqr/app/qrcode/model/QRCodeURL.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.safeqr.app.qrcode.repository;
|
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 org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface QRCodeRepository extends JpaRepository<QRCode, UUID> {
|
public interface QRCodeRepository extends JpaRepository<QRCodeEntity, UUID> {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
|
||||||
package com.safeqr.app.qrcode.repository;
|
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.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface QRCodeTypeRepository extends JpaRepository<QRCodeType, Long> {
|
public interface QRCodeTypeRepository extends JpaRepository<QRCodeTypeEntity, Long> {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.safeqr.app.qrcode.repository;
|
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.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface ScanHistoryRepository extends JpaRepository<ScanHistory, Long> {
|
public interface ScanHistoryRepository extends JpaRepository<ScanHistoryEntity, Long> {
|
||||||
}
|
}
|
||||||
@@ -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<QRCodeTextEntity, UUID> {
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.safeqr.app.qrcode.repository;
|
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 org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface URLRepository extends JpaRepository<QRCodeURL, UUID> {
|
public interface URLRepository extends JpaRepository<QRCodeURLEntity, UUID> {
|
||||||
}
|
}
|
||||||
@@ -4,15 +4,14 @@ package com.safeqr.app.qrcode.service;
|
|||||||
import com.safeqr.app.constants.CommonConstants;
|
import com.safeqr.app.constants.CommonConstants;
|
||||||
import com.safeqr.app.qrcode.dto.QRCodePayload;
|
import com.safeqr.app.qrcode.dto.QRCodePayload;
|
||||||
import com.safeqr.app.qrcode.dto.response.BaseScanResponse;
|
import com.safeqr.app.qrcode.dto.response.BaseScanResponse;
|
||||||
import com.safeqr.app.qrcode.dto.response.URLResponse;
|
import com.safeqr.app.qrcode.entity.QRCodeEntity;
|
||||||
import com.safeqr.app.qrcode.entity.QRCode;
|
import com.safeqr.app.qrcode.entity.QRCodeTypeEntity;
|
||||||
import com.safeqr.app.qrcode.entity.QRCodeType;
|
import com.safeqr.app.qrcode.entity.ScanHistoryEntity;
|
||||||
import com.safeqr.app.qrcode.entity.QRCodeURL;
|
import com.safeqr.app.qrcode.model.factory.QRCodeFactoryProvider;
|
||||||
import com.safeqr.app.qrcode.entity.ScanHistory;
|
import com.safeqr.app.qrcode.model.QRCodeModel;
|
||||||
import com.safeqr.app.qrcode.repository.QRCodeRepository;
|
import com.safeqr.app.qrcode.repository.QRCodeRepository;
|
||||||
import com.safeqr.app.qrcode.repository.QRCodeTypeRepository;
|
import com.safeqr.app.qrcode.repository.QRCodeTypeRepository;
|
||||||
import com.safeqr.app.qrcode.repository.ScanHistoryRepository;
|
import com.safeqr.app.qrcode.repository.ScanHistoryRepository;
|
||||||
import com.safeqr.app.qrcode.repository.URLRepository;
|
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -20,52 +19,48 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import reactor.core.publisher.Mono;
|
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.security.NoSuchAlgorithmException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class QRCodeTypeService {
|
public class QRCodeTypeService {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(QRCodeTypeService.class);
|
private static final Logger logger = LoggerFactory.getLogger(QRCodeTypeService.class);
|
||||||
|
|
||||||
|
private final QRCodeFactoryProvider qrCodeFactoryProvider;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public QRCodeTypeService(QRCodeFactoryProvider qrCodeFactoryProvider) {
|
||||||
|
this.qrCodeFactoryProvider = qrCodeFactoryProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private QRCodeTypeRepository qrCodeTypeRepository;
|
private QRCodeTypeRepository qrCodeTypeRepository;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ScanHistoryRepository scanHistoryRepository;
|
private ScanHistoryRepository scanHistoryRepository;
|
||||||
@Autowired
|
@Autowired
|
||||||
private QRCodeRepository qrCodeRepository;
|
private QRCodeRepository qrCodeRepository;
|
||||||
@Autowired
|
|
||||||
private URLRepository urlRepository;
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private URLVerificationService urlVerificationService;
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SafeBrowsingService safeBrowsingService;
|
private SafeBrowsingService safeBrowsingService;
|
||||||
|
|
||||||
private List<QRCodeType> configs;
|
private List<QRCodeTypeEntity> configs;
|
||||||
private QRCodeType defaultQRCodeType;
|
private QRCodeTypeEntity defaultQRCodeTypeEntity;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void loadQRCodeTypes() {
|
public void loadQRCodeTypes() {
|
||||||
// Fetch all QR Code Types from the database
|
// Fetch all QR Code Types from the database
|
||||||
configs = qrCodeTypeRepository.findAll();
|
configs = qrCodeTypeRepository.findAll();
|
||||||
// Set the default QR Code Type
|
// Set the default QR Code Type
|
||||||
defaultQRCodeType = configs.stream()
|
defaultQRCodeTypeEntity = configs.stream()
|
||||||
.filter(config -> config.getType().equals(CommonConstants.DEFAULT_QR_CODE_TYPE))
|
.filter(config -> config.getType().equals(CommonConstants.DEFAULT_QR_CODE_TYPE))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<QRCodeType> getAllTypes() {
|
public List<QRCodeTypeEntity> getAllTypes() {
|
||||||
return configs;
|
return configs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,10 +69,10 @@ public class QRCodeTypeService {
|
|||||||
logger.info("scanQRCode: userId={}, data={}", userId, data);
|
logger.info("scanQRCode: userId={}, data={}", userId, data);
|
||||||
|
|
||||||
// Get the QR Code Type
|
// Get the QR Code Type
|
||||||
QRCodeType qrType = getQRCodeType(data);
|
QRCodeTypeEntity qrType = getQRCodeType(data);
|
||||||
|
|
||||||
// Insert the QR Code into main qrcode table
|
// Insert the QR Code into main qrcode table
|
||||||
QRCode scannedQR = qrCodeRepository.save(QRCode.builder()
|
QRCodeEntity scannedQR = qrCodeRepository.save(QRCodeEntity.builder()
|
||||||
.userId(userId)
|
.userId(userId)
|
||||||
.contents(data)
|
.contents(data)
|
||||||
.qrCodeTypeId(qrType.getId())
|
.qrCodeTypeId(qrType.getId())
|
||||||
@@ -87,49 +82,52 @@ public class QRCodeTypeService {
|
|||||||
// Insert into Scan History table if userId is not null
|
// Insert into Scan History table if userId is not null
|
||||||
logger.info("scanQRCode: scannedQR new ID={}", scannedQR.getId());
|
logger.info("scanQRCode: scannedQR new ID={}", scannedQR.getId());
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
scanHistoryRepository.save(ScanHistory.builder()
|
scanHistoryRepository.save(ScanHistoryEntity.builder()
|
||||||
.qrCodeId(scannedQR.getId())
|
.qrCodeId(scannedQR.getId())
|
||||||
.userId(userId)
|
.userId(userId)
|
||||||
.scanStatus(ScanHistory.ScanStatus.ACTIVE)
|
.scanStatus(ScanHistoryEntity.ScanStatus.ACTIVE)
|
||||||
.build());
|
.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()
|
return configs.stream()
|
||||||
.filter(config -> data.toLowerCase().startsWith(config.getPrefix().toLowerCase()))
|
.filter(config -> data.toLowerCase().startsWith(config.getPrefix().toLowerCase()))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(defaultQRCodeType);
|
.orElse(defaultQRCodeTypeEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BaseScanResponse insertIntoRespectiveTable(QRCode qrCode, QRCodeType qrCodeType) {
|
// private BaseScanResponse insertIntoRespectiveTable(QRCodeEntity qrCodeEntity, QRCodeTypeEntity qrCodeTypeEntity) {
|
||||||
String contents = qrCode.getContents();
|
// String contents = qrCodeEntity.getContents();
|
||||||
try {
|
// try {
|
||||||
QRCodeURL urlObj = urlVerificationService.breakdownURL(contents);
|
// QRCodeURLEntity urlObj = urlVerificationService.breakdownURL(contents);
|
||||||
List<String> redirectChain = urlVerificationService.countAndTrackRedirects(contents);
|
// List<String> redirectChain = urlVerificationService.countAndTrackRedirects(contents);
|
||||||
urlObj.setQrCodeId(qrCode.getId());
|
// urlObj.setQrCodeId(qrCodeEntity.getId());
|
||||||
urlObj.setRedirect(redirectChain.size() - 1);
|
// urlObj.setRedirect(redirectChain.size() - 1);
|
||||||
urlObj.setRedirectChain(redirectChain);
|
// urlObj.setRedirectChain(redirectChain);
|
||||||
|
//
|
||||||
// Insert into URL table
|
// // Insert into URL table
|
||||||
urlRepository.save(urlObj);
|
// urlRepository.save(urlObj);
|
||||||
|
//
|
||||||
return URLResponse.builder().scannedQRCode(qrCode).qrCode(qrCodeType).details(urlObj).build();
|
// return URLResponse.builder().scannedQRCode(qrCodeEntity).qrCode(qrCodeTypeEntity).details(urlObj).build();
|
||||||
} catch (IOException | URISyntaxException e) {
|
// } catch (IOException | URISyntaxException e) {
|
||||||
logger.error("Error: ", e);
|
// logger.error("Error: ", e);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return BaseScanResponse.builder()
|
// return BaseScanResponse.builder()
|
||||||
.scannedQRCode(qrCode)
|
// .scannedQRCode(qrCodeEntity)
|
||||||
.qrCode(qrCodeType)
|
// .qrCode(qrCodeTypeEntity)
|
||||||
.build();
|
// .build();
|
||||||
}
|
// }
|
||||||
|
|
||||||
public Mono<String> detectType(QRCodePayload payload) {
|
public Mono<String> detectType(QRCodePayload payload) {
|
||||||
String data = payload.getData();
|
String data = payload.getData();
|
||||||
|
|
||||||
for (QRCodeType config : configs) {
|
for (QRCodeTypeEntity config : configs) {
|
||||||
if (data.startsWith(config.getPrefix())) {
|
if (data.startsWith(config.getPrefix())) {
|
||||||
if ("URL".equals(config.getType())) {
|
if ("URL".equals(config.getType())) {
|
||||||
try
|
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.constants.CommonConstants;
|
||||||
import com.safeqr.app.qrcode.dto.QRCodePayload;
|
import com.safeqr.app.qrcode.dto.QRCodePayload;
|
||||||
import com.safeqr.app.qrcode.dto.URLVerificationResponse;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -20,10 +20,10 @@ public class URLVerificationService {
|
|||||||
private static final Logger logger = LoggerFactory.getLogger(URLVerificationService.class);
|
private static final Logger logger = LoggerFactory.getLogger(URLVerificationService.class);
|
||||||
|
|
||||||
// Function to breakdown URL into subdomain, domain, topLevelDomain, query params, fragment
|
// 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);
|
URI uri = new URI(urlString);
|
||||||
URL url = uri.toURL();
|
URL url = uri.toURL();
|
||||||
QRCodeURL urlObj = new QRCodeURL();
|
QRCodeURLEntity urlObj = new QRCodeURLEntity();
|
||||||
|
|
||||||
String host = url.getHost();
|
String host = url.getHost();
|
||||||
// split host into subdomain, domain, topLevelDomain
|
// split host into subdomain, domain, topLevelDomain
|
||||||
@@ -65,7 +65,7 @@ public class URLVerificationService {
|
|||||||
return urlObj;
|
return urlObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> countAndTrackRedirects(String urlString) throws IOException, URISyntaxException {
|
public List<String> countAndTrackRedirects(String urlString) throws IOException, URISyntaxException {
|
||||||
URI uri = new URI(urlString);
|
URI uri = new URI(urlString);
|
||||||
URL url = uri.toURL();
|
URL url = uri.toURL();
|
||||||
List<String> redirectChain = new ArrayList<>();
|
List<String> redirectChain = new ArrayList<>();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.safeqr.app.user.entity;
|
package com.safeqr.app.user.entity;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
@@ -21,8 +22,13 @@ public class UserEntity {
|
|||||||
private String id;
|
private String id;
|
||||||
private String name;
|
private String name;
|
||||||
private String email;
|
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 source;
|
||||||
private String status;
|
private String status;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user