From 76bc1b6dfa80a3839c522e5ce65f4656ea4e6343 Mon Sep 17 00:00:00 2001 From: Hari Date: Sun, 15 Mar 2026 17:34:47 +0530 Subject: [PATCH] addressed locking issue --- .../main/java/com/thughari/jobtrackerpro/entity/User.java | 3 +++ .../java/com/thughari/jobtrackerpro/repo/UserRepository.java | 4 ++-- .../jobtrackerpro/service/GmailIntegrationService.java | 5 ++++- .../thughari/jobtrackerpro/service/GmailWebhookService.java | 5 ++++- frontend/angular.json | 3 ++- frontend/src/CNAME | 1 + 6 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 frontend/src/CNAME 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