write to scan_history table

This commit is contained in:
heyethereum
2024-07-15 00:29:39 +08:00
parent 1163648655
commit f293353d36
11 changed files with 221 additions and 11 deletions

View File

@@ -1,22 +1,30 @@
package com.safeqr.app.qrcode.controller;
import com.safeqr.app.constants.APIConstants;
import com.safeqr.app.constants.CommonConstants;
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.ScanResponse;
import com.safeqr.app.qrcode.entity.QRCodeType;
import com.safeqr.app.qrcode.service.QRCodeTypeService;
import com.safeqr.app.qrcode.service.RedirectCountService;
import com.safeqr.app.qrcode.service.URLVerificationService;
import com.safeqr.app.qrcode.service.VirusTotalService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/v1/qrcodetypes")
@RequestMapping(APIConstants.API_VERSION)
public class QRCodeTypeController {
private static final Logger logger = LoggerFactory.getLogger(QRCodeTypeService.class);
@Autowired
private QRCodeTypeService qrCodeTypeService;
@@ -30,23 +38,30 @@ public class QRCodeTypeController {
@Autowired
private RedirectCountService redirectCountService;
@GetMapping
@GetMapping(value = APIConstants.API_URL_QRCODE_GET_ALL)
public ResponseEntity<List<QRCodeType>> getAllTypes() {
return ResponseEntity.ok(qrCodeTypeService.getAllTypes());
}
@PostMapping("/detect")
@PostMapping(value = APIConstants.API_URL_QRCODE_SCAN, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ScanResponse> scanQRCode(@RequestBody QRCodePayload payload,
@RequestHeader(required = false, name = CommonConstants.HEADER_USER_ID) String userId) {
logger.info("Invoking scan endpoint");
return ResponseEntity.ok(qrCodeTypeService.scanQRCode(userId, payload));
}
@PostMapping(APIConstants.API_URL_QRCODE_DETECT)
public ResponseEntity<String> detectType(@RequestBody QRCodePayload payload) {
return ResponseEntity.ok(qrCodeTypeService.detectType(payload).block());
}
@PostMapping("/verifyURL")
@PostMapping(APIConstants.API_URL_QRCODE_VERIFY_URL)
public ResponseEntity<URLVerificationResponse> verifyURL(@RequestBody QRCodePayload payload) {
URLVerificationResponse response = urlVerificationService.verifyURL(payload);
return ResponseEntity.ok(response);
}
@PostMapping("/virusTotalCheck")
@PostMapping(APIConstants.API_URL_QRCODE_VIRUS_TOTAL_CHECK)
public ResponseEntity<Boolean> virusTotalCheck(@RequestBody QRCodePayload payload) {
try {
String analysisId = virusTotalService.scanURL(payload);
@@ -57,7 +72,7 @@ public class QRCodeTypeController {
}
}
@PostMapping("/checkRedirects")
@PostMapping(APIConstants.API_URL_QRCODE_REDIRECT_COUNT)
public ResponseEntity<RedirectCountResponse> checkRedirects(@RequestBody QRCodePayload payload) {
return ResponseEntity.ok(redirectCountService.countRedirects(payload).block());
}

View File

@@ -0,0 +1,12 @@
package com.safeqr.app.qrcode.dto.response;
import com.safeqr.app.qrcode.entity.QRCodeType;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class ScanResponse {
private String contents;
private String qrType;
}

View File

@@ -2,6 +2,7 @@
package com.safeqr.app.qrcode.entity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Data;
import org.hibernate.annotations.GenericGenerator;
@@ -10,6 +11,7 @@ import java.util.UUID;
@Entity
@Table(name = "qr_code", schema = "safeqr")
@Data
@Builder
public class QRCode {
@Id
@@ -18,10 +20,8 @@ public class QRCode {
@Column(updatable = false, nullable = false)
private UUID id;
@ManyToOne
@JoinColumn(name = "qr_code_type_id", nullable = false)
private QRCodeType qrCodeType;
@Column(name = "qr_code_type_id", nullable = false)
private Long qrCodeTypeId;
private String userId;
private String contents;

View File

@@ -12,7 +12,6 @@ public class QRCodeType {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String type;
private String description;
private String prefix;

View File

@@ -0,0 +1,31 @@
package com.safeqr.app.qrcode.entity;
import jakarta.persistence.*;
import lombok.Builder;
import java.util.UUID;
@Entity
@Builder
@Table(name = "scan_history", schema = "safeqr")
public class ScanHistory {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "qr_code_id", nullable = false)
private UUID qrCodeId;
@Column(name = "user_id", nullable = false)
private String userId;
@Enumerated(EnumType.STRING)
@Column(name = "status")
private ScanStatus scanStatus;
public enum ScanStatus {
ACTIVE,
INACTIVE
}
}

View File

@@ -0,0 +1,8 @@
package com.safeqr.app.qrcode.repository;
import com.safeqr.app.qrcode.entity.QRCode;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
public interface QRCodeRepository extends JpaRepository<QRCode, UUID> {
}

View File

@@ -0,0 +1,9 @@
package com.safeqr.app.qrcode.repository;
import com.safeqr.app.qrcode.entity.ScanHistory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ScanHistoryRepository extends JpaRepository<ScanHistory, Long> {
}

View File

@@ -1,10 +1,18 @@
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.ScanResponse;
import com.safeqr.app.qrcode.entity.QRCode;
import com.safeqr.app.qrcode.entity.QRCodeType;
import com.safeqr.app.qrcode.entity.ScanHistory;
import com.safeqr.app.qrcode.repository.QRCodeRepository;
import com.safeqr.app.qrcode.repository.QRCodeTypeRepository;
import com.safeqr.app.qrcode.repository.ScanHistoryRepository;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@@ -14,24 +22,73 @@ import java.util.List;
@Service
public class QRCodeTypeService {
private static final Logger logger = LoggerFactory.getLogger(QRCodeTypeService.class);
@Autowired
private QRCodeTypeRepository qrCodeTypeRepository;
@Autowired
private ScanHistoryRepository scanHistoryRepository;
@Autowired
private QRCodeRepository qrCodeRepository;
@Autowired
private SafeBrowsingService safeBrowsingService;
private List<QRCodeType> configs;
private QRCodeType defaultQRCodeType;
@PostConstruct
public void loadQRCodeTypes() {
// Fetch all QR Code Types from the database
configs = qrCodeTypeRepository.findAll();
// Set the default QR Code Type
defaultQRCodeType = configs.stream()
.filter(config -> config.getType().equals(CommonConstants.DEFAULT_QR_CODE_TYPE))
.findFirst()
.orElse(null);
}
public List<QRCodeType> getAllTypes() {
return configs;
}
public ScanResponse scanQRCode(String userId, QRCodePayload payload) {
String data = payload.getData();
logger.info("scanQRCode: userId={}, data={}", userId, data);
// Get the QR Code Type
QRCodeType qrType = getQRCodeType(data);
// Insert the QR Code into main qrcode table
QRCode scannedQR = qrCodeRepository.save(QRCode.builder()
.userId(userId)
.contents(data)
.qrCodeTypeId(qrType.getId())
.build());
// Insert qrcode into respective table based on type
// 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()
.qrCodeId(scannedQR.getId())
.userId(userId)
.scanStatus(ScanHistory.ScanStatus.ACTIVE)
.build());
}
return ScanResponse.builder()
.contents(data)
.qrType(qrType.getType())
.build();
}
private QRCodeType getQRCodeType(String data) {
return configs.stream()
.filter(config -> data.toLowerCase().startsWith(config.getPrefix().toLowerCase()))
.findFirst()
.orElse(defaultQRCodeType);
}
public Mono<String> detectType(QRCodePayload payload) {
String data = payload.getData();