diff --git a/backend/src/main/java/com/thughari/jobtrackerpro/entity/User.java b/backend/src/main/java/com/thughari/jobtrackerpro/entity/User.java index 9b8bdc3..7d4be20 100644 --- a/backend/src/main/java/com/thughari/jobtrackerpro/entity/User.java +++ b/backend/src/main/java/com/thughari/jobtrackerpro/entity/User.java @@ -49,6 +49,9 @@ public class User { @Column(name = "gmail_sync_in_progress") private Boolean gmailSyncInProgress = false; + + @Column(name = "gmail_sync_started_at") + private LocalDateTime gmailSyncStartedAt; @Column(name = "gmail_connected") private Boolean gmailConnected = false; diff --git a/backend/src/main/java/com/thughari/jobtrackerpro/repo/UserRepository.java b/backend/src/main/java/com/thughari/jobtrackerpro/repo/UserRepository.java index a6111db..bc3a4ce 100644 --- a/backend/src/main/java/com/thughari/jobtrackerpro/repo/UserRepository.java +++ b/backend/src/main/java/com/thughari/jobtrackerpro/repo/UserRepository.java @@ -22,8 +22,8 @@ public interface UserRepository extends JpaRepository { @Modifying @Transactional - @Query("UPDATE User u SET u.gmailSyncInProgress = true WHERE u.email = :email AND u.gmailSyncInProgress = false") - int claimSyncLock(@Param("email") String email); + @Query("UPDATE User u SET u.gmailSyncInProgress = true, u.gmailSyncStartedAt = :now WHERE u.email = :email AND (u.gmailSyncInProgress = false OR u.gmailSyncStartedAt < :expiry)") + int claimSyncLock(@Param("email") String email, @Param("now") LocalDateTime now, @Param("expiry") LocalDateTime expiry); @Modifying @Transactional diff --git a/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailIntegrationService.java b/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailIntegrationService.java index 0af1e14..11bbe8e 100644 --- a/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailIntegrationService.java +++ b/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailIntegrationService.java @@ -125,7 +125,10 @@ public void connectAndSetupPush(String authCode, String email) throws Exception @Async("taskExecutor") public void initiateManualSync(String email) { - int updatedRows = userRepository.claimSyncLock(email); + LocalDateTime now = LocalDateTime.now(); + LocalDateTime expiryThreshold = now.minusMinutes(15); + + int updatedRows = userRepository.claimSyncLock(email, now, expiryThreshold); if (updatedRows == 0) { return; diff --git a/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailWebhookService.java b/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailWebhookService.java index bed7a7e..78ac7e5 100644 --- a/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailWebhookService.java +++ b/backend/src/main/java/com/thughari/jobtrackerpro/service/GmailWebhookService.java @@ -50,8 +50,11 @@ public GmailWebhookService(GeminiService geminiService, JobService jobService, U @Async("taskExecutor") public void processHistorySync(String userEmail) { final String email = userEmail.toLowerCase(); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime expiryThreshold = now.minusMinutes(15); - int updatedRows = userRepository.claimSyncLock(email); + int updatedRows = userRepository.claimSyncLock(email, now, expiryThreshold); if (updatedRows == 0) return; cacheEvictService.evictAllForUser(email); diff --git a/frontend/angular.json b/frontend/angular.json index c69f582..33cbcf2 100644 --- a/frontend/angular.json +++ b/frontend/angular.json @@ -25,7 +25,8 @@ "glob": "**/*", "input": "public" }, - "src/404.html" + "src/404.html", + "src/CNAME" ], "styles": [ "src/styles.css" diff --git a/frontend/src/CNAME b/frontend/src/CNAME new file mode 100644 index 0000000..9a32821 --- /dev/null +++ b/frontend/src/CNAME @@ -0,0 +1 @@ +jobtrackerpro.in \ No newline at end of file