diff --git a/src/main/java/com/jobtracker/dto/application/ApplicationRequest.java b/src/main/java/com/jobtracker/dto/application/ApplicationRequest.java index e66283bc..27f1a5ed 100644 --- a/src/main/java/com/jobtracker/dto/application/ApplicationRequest.java +++ b/src/main/java/com/jobtracker/dto/application/ApplicationRequest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PastOrPresent; import jakarta.validation.constraints.Pattern; @@ -53,5 +54,9 @@ public record ApplicationRequest( String note, @Schema(description = "Platform or job board where the vacancy was found", example = "LinkedIn") - String platform + String platform, + + @Schema(description = "Number of interviews held for this application", example = "2") + @Min(0) + Integer interviewCount ) {} diff --git a/src/main/java/com/jobtracker/dto/application/ApplicationResponse.java b/src/main/java/com/jobtracker/dto/application/ApplicationResponse.java index 27945649..d70b340f 100644 --- a/src/main/java/com/jobtracker/dto/application/ApplicationResponse.java +++ b/src/main/java/com/jobtracker/dto/application/ApplicationResponse.java @@ -60,6 +60,8 @@ public record ApplicationResponse( @Schema(description = "Timestamp when the latest Google Docs resume was generated", example = "2024-06-11T14:45:00") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime driveResumeGeneratedAt, + @Schema(description = "Number of interviews held for this application", example = "2") + int interviewCount, @Schema(description = "Record creation timestamp", example = "2024-06-01T10:00:00") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime createdAt, diff --git a/src/main/java/com/jobtracker/entity/JobApplication.java b/src/main/java/com/jobtracker/entity/JobApplication.java index 7613c5de..698fd905 100644 --- a/src/main/java/com/jobtracker/entity/JobApplication.java +++ b/src/main/java/com/jobtracker/entity/JobApplication.java @@ -43,6 +43,9 @@ public class JobApplication { @Column(name = "interview_scheduled", nullable = false) private boolean interviewScheduled; + @Column(name = "interview_count", nullable = false) + private int interviewCount = 0; + @Column(name = "next_step_date_time") private LocalDateTime nextStepDateTime; @@ -147,6 +150,9 @@ protected void onUpdate() { public boolean isInterviewScheduled() { return interviewScheduled; } public void setInterviewScheduled(boolean interviewScheduled) { this.interviewScheduled = interviewScheduled; } + public int getInterviewCount() { return interviewCount; } + public void setInterviewCount(int interviewCount) { this.interviewCount = interviewCount; } + public LocalDateTime getNextStepDateTime() { return nextStepDateTime; } public void setNextStepDateTime(LocalDateTime nextStepDateTime) { this.nextStepDateTime = nextStepDateTime; } diff --git a/src/main/java/com/jobtracker/mapper/ApplicationMapper.java b/src/main/java/com/jobtracker/mapper/ApplicationMapper.java index a330b0cc..48fedfb4 100644 --- a/src/main/java/com/jobtracker/mapper/ApplicationMapper.java +++ b/src/main/java/com/jobtracker/mapper/ApplicationMapper.java @@ -31,6 +31,7 @@ public ApplicationResponse toResponse(JobApplication app) { app.getDriveResumeFileName(), app.getDriveResumeDocumentUrl(), app.getDriveResumeGeneratedAt(), + app.getInterviewCount(), app.getCreatedAt(), app.getUpdatedAt() ); diff --git a/src/main/java/com/jobtracker/repository/ApplicationRepository.java b/src/main/java/com/jobtracker/repository/ApplicationRepository.java index 417b3df9..f2450d88 100644 --- a/src/main/java/com/jobtracker/repository/ApplicationRepository.java +++ b/src/main/java/com/jobtracker/repository/ApplicationRepository.java @@ -23,6 +23,9 @@ public interface ApplicationRepository extends JpaRepository eventRepository.countByUser_Id(userId)); - } - - private UserInterviewMetrics findOrCreateMetrics(User user) { - return metricsRepository.findByUser_Id(user.getId()) - .orElseGet(() -> { - UserInterviewMetrics created = new UserInterviewMetrics(); - created.setUser(user); - created.setInterviewCount(0); - return created; - }); + return applicationRepository.sumInterviewCountByUserId(userId); } } diff --git a/src/main/resources/db/migration/V25__add_interview_count_to_job_applications.sql b/src/main/resources/db/migration/V25__add_interview_count_to_job_applications.sql new file mode 100644 index 00000000..f5b5a738 --- /dev/null +++ b/src/main/resources/db/migration/V25__add_interview_count_to_job_applications.sql @@ -0,0 +1,2 @@ +ALTER TABLE job_applications + ADD COLUMN interview_count INT NOT NULL DEFAULT 0 AFTER interview_scheduled;