diff --git a/src/main/java/com/safeqr/app/constants/APIConstants.java b/src/main/java/com/safeqr/app/constants/APIConstants.java index eb8a0db..041036f 100644 --- a/src/main/java/com/safeqr/app/constants/APIConstants.java +++ b/src/main/java/com/safeqr/app/constants/APIConstants.java @@ -13,4 +13,9 @@ public class APIConstants { public static final String API_URL_QRCODE_REDIRECT_COUNT = "/qrcodetypes/redirectcount"; public static final String API_URL_QRCODE_GET_QR_DETAILS = "/qrcodetypes/getQRDetails"; + + public static final String API_URL_USER_GET = "/user/getUser"; + public static final String API_URL_USER_GET_SCANNED_HISTORIES = "/user/getScannedHistories"; + public static final String API_URL_USER_GET_BOOKMARKS = "/user/getBookmarks"; + } diff --git a/src/main/java/com/safeqr/app/exceptions/CustomNotFoundExceptions.java b/src/main/java/com/safeqr/app/exceptions/CustomNotFoundExceptions.java new file mode 100644 index 0000000..ba86412 --- /dev/null +++ b/src/main/java/com/safeqr/app/exceptions/CustomNotFoundExceptions.java @@ -0,0 +1,7 @@ +package com.safeqr.app.exceptions; + +public class CustomNotFoundExceptions extends RuntimeException { + public CustomNotFoundExceptions(String message){ + super(message); + } +} diff --git a/src/main/java/com/safeqr/app/exceptions/GlobalExceptionHandler.java b/src/main/java/com/safeqr/app/exceptions/GlobalExceptionHandler.java index 6a0e08d..29e8622 100644 --- a/src/main/java/com/safeqr/app/exceptions/GlobalExceptionHandler.java +++ b/src/main/java/com/safeqr/app/exceptions/GlobalExceptionHandler.java @@ -8,8 +8,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice public class GlobalExceptionHandler { - @ExceptionHandler(QRCodeExceptions.class) - public ResponseEntity handleQRCodeNotFoundException(QRCodeExceptions e) { + @ExceptionHandler(CustomNotFoundExceptions.class) + public ResponseEntity handleResourceNotFoundException(CustomNotFoundExceptions e) { return new ResponseEntity<>(new ErrorResponse(e.getMessage(), HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND); } } diff --git a/src/main/java/com/safeqr/app/exceptions/QRCodeExceptions.java b/src/main/java/com/safeqr/app/exceptions/QRCodeExceptions.java deleted file mode 100644 index f2d98dc..0000000 --- a/src/main/java/com/safeqr/app/exceptions/QRCodeExceptions.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.safeqr.app.exceptions; - -public class QRCodeExceptions extends RuntimeException { - public QRCodeExceptions(String message){ - super(message); - } -} diff --git a/src/main/java/com/safeqr/app/qrcode/entity/ScanBookmarkEntity.java b/src/main/java/com/safeqr/app/qrcode/entity/ScanBookmarkEntity.java new file mode 100644 index 0000000..7c67f7f --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/entity/ScanBookmarkEntity.java @@ -0,0 +1,39 @@ +package com.safeqr.app.qrcode.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "scan_bookmark", schema = "safeqr") +public class ScanBookmarkEntity { + + @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", nullable = false) + private BookmarkStatus scanStatus; + + public enum BookmarkStatus { + ACTIVE, + INACTIVE + } + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "qr_code_id", referencedColumnName = "id", insertable = false, updatable = false) + private QRCodeEntity qrCodeEntity; +} \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java b/src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java index 3af92c3..d99311c 100644 --- a/src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java +++ b/src/main/java/com/safeqr/app/qrcode/entity/ScanHistoryEntity.java @@ -32,4 +32,7 @@ public class ScanHistoryEntity { ACTIVE, INACTIVE } + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "qr_code_id", referencedColumnName = "id", insertable = false, updatable = false) + private QRCodeEntity qrCodeEntity; } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/model/EmailModel.java b/src/main/java/com/safeqr/app/qrcode/model/EmailModel.java index da42b31..b002565 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/EmailModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/EmailModel.java @@ -19,20 +19,20 @@ public final class EmailModel extends QRCodeModel { private final EmailVerificationService emailVerificationService; public EmailModel(QRCodeEntity scannedQRCodeEntity, EmailVerificationService emailVerificationService) { - this.scannedQRCode = scannedQRCodeEntity; + this.data = scannedQRCodeEntity; this.emailVerificationService = emailVerificationService; this.details = null; } @Override public void setDetails() { - details = EmailEntity.builder().qrCodeId(scannedQRCode.getId()).build(); + details = EmailEntity.builder().qrCodeId(data.getId()).build(); // Insert into email table emailVerificationService.insertDB(details); } @Override public EmailEntity getDetails () { - return new EmailEntity(); + return emailVerificationService.getEmailEntityByQRCodeId(data.getId()); } } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/model/PhoneModel.java b/src/main/java/com/safeqr/app/qrcode/model/PhoneModel.java index 8fca7c5..7eeeb24 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/PhoneModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/PhoneModel.java @@ -19,19 +19,19 @@ public final class PhoneModel extends QRCodeModel { private final PhoneVerificationService phoneVerificationService; public PhoneModel(QRCodeEntity scannedQRCodeEntity, PhoneVerificationService phoneVerificationService) { - this.scannedQRCode = scannedQRCodeEntity; + this.data = scannedQRCodeEntity; this.phoneVerificationService = phoneVerificationService; this.details = null; } @Override public void setDetails() { - details = PhoneEntity.builder().qrCodeId(scannedQRCode.getId()).build(); + details = PhoneEntity.builder().qrCodeId(data.getId()).build(); // Insert into phone table phoneVerificationService.insertDB(details); } @Override public PhoneEntity getDetails () { - return new PhoneEntity(); + return phoneVerificationService.getPhoneEntityByQRCodeId(data.getId()); } } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java b/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java index 2abd91c..0f9ca9d 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/QRCodeModel.java @@ -5,7 +5,7 @@ import lombok.Data; @Data public abstract class QRCodeModel{ - QRCodeEntity scannedQRCode; + QRCodeEntity data; T details; public abstract void setDetails(); diff --git a/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java b/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java index 556786d..1fc3544 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/SMSModel.java @@ -19,19 +19,19 @@ public final class SMSModel extends QRCodeModel { private final SMSVerificationService smsVerificationService; public SMSModel(QRCodeEntity scannedQRCodeEntity, SMSVerificationService smsVerificationService) { - this.scannedQRCode = scannedQRCodeEntity; + this.data = scannedQRCodeEntity; this.smsVerificationService = smsVerificationService; this.details = null; } @Override public void setDetails() { - details = SMSEntity.builder().qrCodeId(scannedQRCode.getId()).build(); + details = SMSEntity.builder().qrCodeId(data.getId()).build(); // Insert into sms table smsVerificationService.insertDB(details); } @Override public SMSEntity getDetails () { - return new SMSEntity(); + return smsVerificationService.getSMSEntityByQRCodeId(data.getId()); } } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/model/TextModel.java b/src/main/java/com/safeqr/app/qrcode/model/TextModel.java index a6deed6..c8c1154 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/TextModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/TextModel.java @@ -19,19 +19,19 @@ public final class TextModel extends QRCodeModel { private final TextVerificationService textVerificationService; public TextModel(QRCodeEntity scannedQRCodeEntity, TextVerificationService textVerificationService) { - this.scannedQRCode = scannedQRCodeEntity; + this.data = scannedQRCodeEntity; this.textVerificationService = textVerificationService; this.details = null; } @Override public void setDetails() { - details = TextEntity.builder().qrCodeId(scannedQRCode.getId()).text(scannedQRCode.getContents()).build(); + details = TextEntity.builder().qrCodeId(data.getId()).text(data.getContents()).build(); // Insert into text table textVerificationService.insertDB(details); } @Override public TextEntity getDetails () { - return new TextEntity(); + return textVerificationService.getTextEntityByQRCodeId(data.getId()); } } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/model/URLModel.java b/src/main/java/com/safeqr/app/qrcode/model/URLModel.java index 564bb1e..5c32d74 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/URLModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/URLModel.java @@ -22,19 +22,19 @@ public final class URLModel extends QRCodeModel { @Autowired public URLModel(QRCodeEntity scannedQRCodeEntity, URLVerificationService urlVerificationService) { - this.scannedQRCode = scannedQRCodeEntity; + this.data = scannedQRCodeEntity; this.urlVerificationService = urlVerificationService; details = null; } @Override public void setDetails() { - String url = scannedQRCode.getContents(); + String url = data.getContents(); try { details = urlVerificationService.breakdownURL(url); urlVerificationService.countAndTrackRedirects(url, details); // set qrCode Identifier - details.setQrCodeId(scannedQRCode.getId()); + details.setQrCodeId(data.getId()); // Insert into URL table urlVerificationService.insertDB(details); @@ -45,6 +45,6 @@ public final class URLModel extends QRCodeModel { } @Override public URLEntity getDetails () { - return urlVerificationService.getURLEntityByQRCodeId(scannedQRCode.getId()); + return urlVerificationService.getURLEntityByQRCodeId(data.getId()); } } diff --git a/src/main/java/com/safeqr/app/qrcode/model/WifiModel.java b/src/main/java/com/safeqr/app/qrcode/model/WifiModel.java index f65b15f..70dedf7 100644 --- a/src/main/java/com/safeqr/app/qrcode/model/WifiModel.java +++ b/src/main/java/com/safeqr/app/qrcode/model/WifiModel.java @@ -1,7 +1,6 @@ package com.safeqr.app.qrcode.model; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.safeqr.app.qrcode.entity.EmailEntity; import com.safeqr.app.qrcode.entity.QRCodeEntity; import com.safeqr.app.qrcode.entity.WifiEntity; import com.safeqr.app.qrcode.service.WifiVerificationService; @@ -19,19 +18,19 @@ public final class WifiModel extends QRCodeModel { private final WifiVerificationService wifiVerificationService; public WifiModel(QRCodeEntity scannedQRCodeEntity, WifiVerificationService wifiVerificationService) { - this.scannedQRCode = scannedQRCodeEntity; + this.data = scannedQRCodeEntity; this.wifiVerificationService = wifiVerificationService; this.details = null; } @Override public void setDetails() { - details = WifiEntity.builder().qrCodeId(scannedQRCode.getId()).build(); + details = WifiEntity.builder().qrCodeId(data.getId()).build(); // Insert into wifi table wifiVerificationService.insertDB(details); } @Override public WifiEntity getDetails () { - return new WifiEntity(); + return wifiVerificationService.getWifiEntityByQRCodeId(data.getId()); } } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/EmailRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/EmailRepository.java index bca377c..1bc16e5 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/EmailRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/EmailRepository.java @@ -2,5 +2,9 @@ package com.safeqr.app.qrcode.repository; import com.safeqr.app.qrcode.entity.EmailEntity; +import java.util.Optional; +import java.util.UUID; + public interface EmailRepository extends GenericRepository { + Optional findByQrCodeId(UUID qrCodeId); } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/PhoneRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/PhoneRepository.java index c60ba75..6b0a084 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/PhoneRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/PhoneRepository.java @@ -2,5 +2,9 @@ package com.safeqr.app.qrcode.repository; import com.safeqr.app.qrcode.entity.PhoneEntity; +import java.util.Optional; +import java.util.UUID; + public interface PhoneRepository extends GenericRepository { + Optional findByQrCodeId(UUID qrCodeId); } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/SMSRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/SMSRepository.java index 3fc049e..84f6f45 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/SMSRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/SMSRepository.java @@ -2,5 +2,9 @@ package com.safeqr.app.qrcode.repository; import com.safeqr.app.qrcode.entity.SMSEntity; +import java.util.Optional; +import java.util.UUID; + public interface SMSRepository extends GenericRepository { + Optional findByQrCodeId(UUID qrCodeId); } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/ScanBookmarkRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/ScanBookmarkRepository.java new file mode 100644 index 0000000..6a44bbf --- /dev/null +++ b/src/main/java/com/safeqr/app/qrcode/repository/ScanBookmarkRepository.java @@ -0,0 +1,13 @@ +package com.safeqr.app.qrcode.repository; + +import com.safeqr.app.qrcode.entity.QRCodeEntity; +import com.safeqr.app.qrcode.entity.ScanBookmarkEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface ScanBookmarkRepository extends JpaRepository { + @Query("SELECT sb.qrCodeEntity FROM ScanBookmarkEntity sb WHERE sb.userId = :userId AND sb.scanStatus = 'ACTIVE'") + List findAllBookmarksByUserId(String userId); +} 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 ea3440b..925408b 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,15 @@ package com.safeqr.app.qrcode.repository; +import com.safeqr.app.qrcode.entity.QRCodeEntity; import com.safeqr.app.qrcode.entity.ScanHistoryEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ScanHistoryRepository extends JpaRepository { + @Query("SELECT sh.qrCodeEntity FROM ScanHistoryEntity sh WHERE sh.userId = :userId AND sh.scanStatus = 'ACTIVE'") + List findAllQRCodesByUserId(String userId); } \ 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 index 69390dc..b0613c2 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/TextRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/TextRepository.java @@ -2,5 +2,9 @@ package com.safeqr.app.qrcode.repository; import com.safeqr.app.qrcode.entity.TextEntity; +import java.util.Optional; +import java.util.UUID; + public interface TextRepository extends GenericRepository { + Optional findByQrCodeId(UUID qrCodeId); } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/repository/WifiRepository.java b/src/main/java/com/safeqr/app/qrcode/repository/WifiRepository.java index 0130a3d..76764fa 100644 --- a/src/main/java/com/safeqr/app/qrcode/repository/WifiRepository.java +++ b/src/main/java/com/safeqr/app/qrcode/repository/WifiRepository.java @@ -2,5 +2,9 @@ package com.safeqr.app.qrcode.repository; import com.safeqr.app.qrcode.entity.WifiEntity; +import java.util.Optional; +import java.util.UUID; + public interface WifiRepository extends GenericRepository { + Optional findByQrCodeId(UUID qrCodeId); } \ No newline at end of file diff --git a/src/main/java/com/safeqr/app/qrcode/service/EmailVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/EmailVerificationService.java index 51d8283..83d38c6 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/EmailVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/EmailVerificationService.java @@ -1,5 +1,6 @@ package com.safeqr.app.qrcode.service; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.entity.EmailEntity; import com.safeqr.app.qrcode.repository.EmailRepository; import org.slf4j.Logger; @@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.UUID; + @Service public class EmailVerificationService { private final EmailRepository emailRepository; @@ -16,6 +19,11 @@ public class EmailVerificationService { public EmailVerificationService(EmailRepository emailRepository) { this.emailRepository = emailRepository; } + public EmailEntity getEmailEntityByQRCodeId(UUID qrCodeId) { + logger.info("qrCodeId retrieving: {}", qrCodeId); + return emailRepository.findByQrCodeId(qrCodeId) + .orElseThrow(() -> new CustomNotFoundExceptions("Email not found for QR Code id: " + qrCodeId)); + } public void insertDB(EmailEntity emailEntity) { emailRepository.save(emailEntity); } diff --git a/src/main/java/com/safeqr/app/qrcode/service/PhoneVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/PhoneVerificationService.java index 5081e65..d1c6401 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/PhoneVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/PhoneVerificationService.java @@ -1,5 +1,6 @@ package com.safeqr.app.qrcode.service; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.entity.PhoneEntity; import com.safeqr.app.qrcode.repository.PhoneRepository; import org.slf4j.Logger; @@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.UUID; + @Service public class PhoneVerificationService { private final PhoneRepository phoneRepository; @@ -16,6 +19,11 @@ public class PhoneVerificationService { public PhoneVerificationService(PhoneRepository phoneRepository) { this.phoneRepository = phoneRepository; } + public PhoneEntity getPhoneEntityByQRCodeId(UUID qrCodeId) { + logger.info("qrCodeId retrieving: {}", qrCodeId); + return phoneRepository.findByQrCodeId(qrCodeId) + .orElseThrow(() -> new CustomNotFoundExceptions("Phone not found for QR Code id: " + qrCodeId)); + } public void insertDB(PhoneEntity phoneEntity) { phoneRepository.save(phoneEntity); } 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 ce5e1dd..a1bc94e 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/QRCodeTypeService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/QRCodeTypeService.java @@ -3,7 +3,7 @@ package com.safeqr.app.qrcode.service; import static com.safeqr.app.constants.CommonConstants.*; -import com.safeqr.app.exceptions.QRCodeExceptions; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.dto.request.QRCodePayload; import com.safeqr.app.qrcode.dto.response.BaseScanResponse; import com.safeqr.app.qrcode.entity.QRCodeEntity; @@ -24,11 +24,7 @@ import reactor.core.publisher.Mono; import java.security.NoSuchAlgorithmException; import java.time.LocalDateTime; import java.util.List; -import java.util.Map; -import java.util.Optional; import java.util.UUID; -import java.util.function.Function; -import java.util.stream.Collectors; @Service public class QRCodeTypeService { @@ -73,7 +69,7 @@ public class QRCodeTypeService { public BaseScanResponse getScannedQRCodeDetails(UUID qrCodeId){ // Find scanned qr code in qr code table QRCodeEntity qrCodeEntity = qrCodeRepository.findById(qrCodeId) - .orElseThrow(() -> new QRCodeExceptions("QR Code not found with id: " + qrCodeId)); + .orElseThrow(() -> new CustomNotFoundExceptions("QR Code not found with id: " + qrCodeId)); logger.info("qrCodeEntity: {}", qrCodeEntity); QRCodeModel qrCodeModel = qrCodeFactoryProvider.createQRCodeInstance(qrCodeEntity); logger.info("Retrieved details: {}", qrCodeModel.getDetails()); diff --git a/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java index c8bcb2e..7370a14 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/SMSVerificationService.java @@ -1,5 +1,6 @@ package com.safeqr.app.qrcode.service; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.entity.SMSEntity; import com.safeqr.app.qrcode.repository.SMSRepository; import org.slf4j.Logger; @@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.UUID; + @Service public class SMSVerificationService { private final SMSRepository smsRepository; @@ -16,6 +19,12 @@ public class SMSVerificationService { public SMSVerificationService(SMSRepository smsRepository) { this.smsRepository = smsRepository; } + + public SMSEntity getSMSEntityByQRCodeId(UUID qrCodeId) { + logger.info("qrCodeId retrieving: {}", qrCodeId); + return smsRepository.findByQrCodeId(qrCodeId) + .orElseThrow(() -> new CustomNotFoundExceptions("SMS not found for QR Code id: " + qrCodeId)); + } public void insertDB(SMSEntity smsEntity) { smsRepository.save(smsEntity); } diff --git a/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java index f6271c3..e54b7b5 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/TextVerificationService.java @@ -1,5 +1,6 @@ package com.safeqr.app.qrcode.service; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.entity.TextEntity; import com.safeqr.app.qrcode.repository.TextRepository; import org.slf4j.Logger; @@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.UUID; + @Service public class TextVerificationService { private final TextRepository textRepository; @@ -15,6 +18,12 @@ public class TextVerificationService { public TextVerificationService(TextRepository textRepository) { this.textRepository = textRepository; } + + public TextEntity getTextEntityByQRCodeId(UUID qrCodeId) { + logger.info("qrCodeId retrieving: {}", qrCodeId); + return textRepository.findByQrCodeId(qrCodeId) + .orElseThrow(() -> new CustomNotFoundExceptions("Text not found for QR Code id: " + qrCodeId)); + } public void insertDB(TextEntity textEntity) { textRepository.save(textEntity); } 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 9cbb891..58adfd6 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/URLVerificationService.java @@ -2,7 +2,7 @@ package com.safeqr.app.qrcode.service; import static com.safeqr.app.constants.CommonConstants.*; -import com.safeqr.app.exceptions.QRCodeExceptions; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.dto.request.QRCodePayload; import com.safeqr.app.qrcode.dto.URLVerificationResponse; import com.safeqr.app.qrcode.entity.URLEntity; @@ -30,7 +30,7 @@ public class URLVerificationService { public URLEntity getURLEntityByQRCodeId(UUID qrCodeId) { logger.info("qrCodeId retrieving: {}", qrCodeId); return urlRepository.findByQrCodeId(qrCodeId) - .orElseThrow(() -> new QRCodeExceptions("URL not found for QR Code id: " + qrCodeId)); + .orElseThrow(() -> new CustomNotFoundExceptions("URL not found for QR Code id: " + qrCodeId)); } public void insertDB(URLEntity urlEntity) { diff --git a/src/main/java/com/safeqr/app/qrcode/service/WifiVerificationService.java b/src/main/java/com/safeqr/app/qrcode/service/WifiVerificationService.java index 9cc8ec1..9b77692 100644 --- a/src/main/java/com/safeqr/app/qrcode/service/WifiVerificationService.java +++ b/src/main/java/com/safeqr/app/qrcode/service/WifiVerificationService.java @@ -1,5 +1,6 @@ package com.safeqr.app.qrcode.service; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; import com.safeqr.app.qrcode.entity.WifiEntity; import com.safeqr.app.qrcode.repository.WifiRepository; import org.slf4j.Logger; @@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.UUID; + @Service public class WifiVerificationService { private final WifiRepository wifiRepository; @@ -16,6 +19,11 @@ public class WifiVerificationService { public WifiVerificationService(WifiRepository wifiRepository) { this.wifiRepository = wifiRepository; } + public WifiEntity getWifiEntityByQRCodeId(UUID qrCodeId) { + logger.info("qrCodeId retrieving: {}", qrCodeId); + return wifiRepository.findByQrCodeId(qrCodeId) + .orElseThrow(() -> new CustomNotFoundExceptions("Wifi not found for QR Code id: " + qrCodeId)); + } public void insertDB(WifiEntity wifiEntity) { wifiRepository.save(wifiEntity); } diff --git a/src/main/java/com/safeqr/app/user/controller/UserController.java b/src/main/java/com/safeqr/app/user/controller/UserController.java index 55ca7aa..6dbfbd3 100644 --- a/src/main/java/com/safeqr/app/user/controller/UserController.java +++ b/src/main/java/com/safeqr/app/user/controller/UserController.java @@ -1,25 +1,55 @@ package com.safeqr.app.user.controller; +import static com.safeqr.app.constants.APIConstants.*; +import static com.safeqr.app.constants.CommonConstants.HEADER_USER_ID; + +import com.safeqr.app.qrcode.entity.QRCodeEntity; +import com.safeqr.app.user.dto.UserResponseDto; import com.safeqr.app.user.service.UserService; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; import java.util.Map; @RestController -@RequestMapping("/v1") +@RequestMapping(API_VERSION) public class UserController { - @Autowired + private static final Logger logger = LoggerFactory.getLogger(UserController.class); UserService userService; + @Autowired + public UserController(UserService userService) { + this.userService = userService; + } + @GetMapping(value = "/version", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> version() { - // System.out.println(userService.getUserByEmail()); - System.out.println("Health Check"); + logger.info("Health Check"); return ResponseEntity.ok(Map.of("version","SafeQR v1.0.2")); } + @GetMapping(value = API_URL_USER_GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getUser(@RequestHeader(name = HEADER_USER_ID) String userId) { + logger.info("Invoking GET User endpoint"); + return ResponseEntity.ok(userService.getUserById(userId)); + } + + @GetMapping(value = API_URL_USER_GET_SCANNED_HISTORIES, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getUserScannedHistories(@RequestHeader(name = HEADER_USER_ID) String userId) { + logger.info("Invoking GET User Scanned Histories endpoint"); + return ResponseEntity.ok(userService.getUserScannedHistories(userId)); + } + + @GetMapping(value = API_URL_USER_GET_BOOKMARKS, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getUserBookmarks(@RequestHeader(name = HEADER_USER_ID) String userId) { + logger.info("Invoking GET User bookmarks endpoint"); + return ResponseEntity.ok(userService.getUserBookmarks(userId)); + } } diff --git a/src/main/java/com/safeqr/app/user/dto/ScannedHistoriesResponse.java b/src/main/java/com/safeqr/app/user/dto/ScannedHistoriesResponse.java new file mode 100644 index 0000000..72fce22 --- /dev/null +++ b/src/main/java/com/safeqr/app/user/dto/ScannedHistoriesResponse.java @@ -0,0 +1,4 @@ +package com.safeqr.app.user.dto; + +public class ScannedHistoriesResponse { +} diff --git a/src/main/java/com/safeqr/app/user/dto/UserResponseDto.java b/src/main/java/com/safeqr/app/user/dto/UserResponseDto.java new file mode 100644 index 0000000..e0b4386 --- /dev/null +++ b/src/main/java/com/safeqr/app/user/dto/UserResponseDto.java @@ -0,0 +1,19 @@ +package com.safeqr.app.user.dto; + +import lombok.Builder; +import lombok.Data; + +import java.time.OffsetDateTime; +import java.util.List; + +@Data +@Builder +public class UserResponseDto { + private String id; + private String name; + private String email; + private OffsetDateTime dateJoined; + private OffsetDateTime dateUpdated; + private List roles; + private String status; +} 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 380e2e2..7d3b4d6 100644 --- a/src/main/java/com/safeqr/app/user/entity/UserEntity.java +++ b/src/main/java/com/safeqr/app/user/entity/UserEntity.java @@ -1,19 +1,19 @@ package com.safeqr.app.user.entity; +import io.hypersistence.utils.hibernate.type.array.ListArrayType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.*; +import org.hibernate.annotations.Type; -import java.util.List; import java.time.OffsetDateTime; +import java.util.List; @Builder @AllArgsConstructor @NoArgsConstructor -@Getter -@Setter @Entity @Data @Table(name="user", schema = "safeqr") @@ -29,6 +29,8 @@ public class UserEntity { @Column(name = "date_updated") private OffsetDateTime dateUpdated; - private String source; + @Type(ListArrayType.class) + @Column(name = "roles", columnDefinition = "text[]") + private List roles; private String status; } diff --git a/src/main/java/com/safeqr/app/user/repository/UserRepository.java b/src/main/java/com/safeqr/app/user/repository/UserRepository.java index 72f0bf6..919f68d 100644 --- a/src/main/java/com/safeqr/app/user/repository/UserRepository.java +++ b/src/main/java/com/safeqr/app/user/repository/UserRepository.java @@ -6,5 +6,4 @@ import org.springframework.stereotype.Repository; @Repository public interface UserRepository extends JpaRepository { - UserEntity findByEmail(String email); } diff --git a/src/main/java/com/safeqr/app/user/service/UserService.java b/src/main/java/com/safeqr/app/user/service/UserService.java index ba0cfe3..4c42a8a 100644 --- a/src/main/java/com/safeqr/app/user/service/UserService.java +++ b/src/main/java/com/safeqr/app/user/service/UserService.java @@ -1,23 +1,52 @@ package com.safeqr.app.user.service; +import com.safeqr.app.exceptions.CustomNotFoundExceptions; +import com.safeqr.app.qrcode.entity.QRCodeEntity; +import com.safeqr.app.qrcode.repository.ScanBookmarkRepository; +import com.safeqr.app.qrcode.repository.ScanHistoryRepository; +import com.safeqr.app.user.dto.UserResponseDto; import com.safeqr.app.user.entity.UserEntity; import com.safeqr.app.user.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class UserService { @Autowired - private UserRepository userRepository; + public UserService(UserRepository userRepository, + ScanHistoryRepository scanHistoryRepository, + ScanBookmarkRepository scanBookmarkRepository) { + this.userRepository = userRepository; + this.scanHistoryRepository = scanHistoryRepository; + this.scanBookmarkRepository = scanBookmarkRepository; + } + private final UserRepository userRepository; + private final ScanHistoryRepository scanHistoryRepository; + private final ScanBookmarkRepository scanBookmarkRepository; - public String getUserByEmail() { + public UserResponseDto getUserById(String userId) { + // Find user by id + UserEntity userEntity = userRepository.findById(userId) + .orElseThrow(() -> new CustomNotFoundExceptions("User id not found: " + userId)); - // Retrieve the user by email - UserEntity retrievedUser = userRepository.findByEmail("piggyinu@gmail.com"); - if (retrievedUser != null) { - return "User found: " + retrievedUser.getName(); - } - return "User not found"; + // Map to DTO before returning to controller + return UserResponseDto.builder() + .id(userEntity.getId()) + .email(userEntity.getEmail()) + .name(userEntity.getName()) + .dateJoined(userEntity.getDateCreated()) + .dateUpdated(userEntity.getDateUpdated()) + .roles(userEntity.getRoles()) + .status(userEntity.getStatus()) + .build(); + } + public List getUserScannedHistories(String userId) { + return scanHistoryRepository.findAllQRCodesByUserId(userId); + } + public List getUserBookmarks(String userId) { + return scanBookmarkRepository.findAllBookmarksByUserId(userId); } }