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

@@ -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());
} }

View File

@@ -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;
} }

View File

@@ -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;
}

View File

@@ -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")

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

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);
}
}

View File

@@ -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> {
} }

View File

@@ -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> {
} }

View File

@@ -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> {
} }

View File

@@ -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> {
}

View File

@@ -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> {
} }

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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<>();

View File

@@ -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;
} }