Skip to content

Commit

Permalink
Merge pull request #28 from januschung/offer-return-job
Browse files Browse the repository at this point in the history
offer and interview to return job application
  • Loading branch information
januschung authored Dec 19, 2024
2 parents 18892b7 + 275fa64 commit 4fdb113
Show file tree
Hide file tree
Showing 14 changed files with 267 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public Flux<Interview> allInterview() {

@QueryMapping
public Mono<Interview> interviewById(@Argument Integer id) {
return interviewService.getInterview(id);
return interviewService.getInterviewById(id);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.tnite.jobwinner.model.OfferInput;
import com.tnite.jobwinner.model.Offer;
import com.tnite.jobwinner.service.JobApplicationService;
import com.tnite.jobwinner.service.OfferService;
import io.micrometer.common.lang.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -18,6 +19,9 @@ public class OfferController {
@Autowired
private OfferService offerService;

@Autowired
private JobApplicationService jobApplicationService;

@MutationMapping
public Mono<Offer> addOffer(@Argument OfferInput offerInput) {
return offerService.addOffer(offerInput);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/tnite/jobwinner/model/Interview.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

Expand All @@ -23,4 +24,7 @@ public class Interview {
private String interviewer;
private String description;
private String status;

@Transient
private JobApplication jobApplication;
}
4 changes: 4 additions & 0 deletions src/main/java/com/tnite/jobwinner/model/Offer.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.time.LocalDate;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

Expand All @@ -26,4 +27,7 @@ public class Offer {
private String salaryOffered;
private String description;

@Transient
private JobApplication jobApplication;

}
18 changes: 17 additions & 1 deletion src/main/java/com/tnite/jobwinner/service/InterviewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.tnite.jobwinner.model.Interview;
import com.tnite.jobwinner.model.InterviewInput;
import com.tnite.jobwinner.model.JobApplication;
import com.tnite.jobwinner.model.Offer;
import com.tnite.jobwinner.repo.InterviewRepository;
import com.tnite.jobwinner.repo.JobApplicationRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
Expand All @@ -19,6 +21,9 @@ public class InterviewService {
@Autowired
private InterviewRepository interviewRepository;

@Autowired
private JobApplicationRepository jobApplicationRepository;

private Interview mapToInterview(InterviewInput interviewInput) {
var interview = new Interview();
interview.setJobApplicationId(interviewInput.getJobApplicationId());
Expand Down Expand Up @@ -74,8 +79,19 @@ public Flux<Interview> allInterview() {
.doOnError(e -> log.error("Failed to retrieve interviews", e));
}

public Mono<Interview> getInterview(Integer id) {
public Mono<Interview> getInterviewById(Integer id) {
return interviewRepository.findById(id)
.flatMap(interview -> {
// Fetch the related JobApplication based on jobApplicationId from the Interview
return jobApplicationRepository.findById(interview.getJobApplicationId())
.map(jobApplication -> {
interview.setJobApplication(jobApplication);
return interview;
})
.defaultIfEmpty(interview) // If no JobApplication is found, return the Interview as is
.doOnSuccess(i -> log.info("Retrieved interview with job application: {}", i))
.doOnError(e -> log.error("Failed to fetch job application for interview id {}", id, e));
})
.switchIfEmpty(Mono.defer(() -> {
log.warn("Interview with id {} not found", id);
return Mono.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ public Flux<JobApplication> allJobApplication() {
return this.jobApplicationRepository.findAll().log();
}

public Mono<JobApplication> getJobApplicationById(Integer id) {
return jobApplicationRepository.findById(id);
}

public Flux<JobApplication> searchJobApplications(String searchTerm) {
return jobApplicationRepository.searchJobApplications(searchTerm);
}
Expand Down
19 changes: 17 additions & 2 deletions src/main/java/com/tnite/jobwinner/service/OfferService.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.tnite.jobwinner.service;

import com.tnite.jobwinner.model.Interview;
import com.tnite.jobwinner.model.OfferInput;
import com.tnite.jobwinner.model.Offer;
import com.tnite.jobwinner.repo.JobApplicationRepository;
import com.tnite.jobwinner.repo.OfferRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -18,6 +20,9 @@ public class OfferService {
@Autowired
private OfferRepository offerRepository;

@Autowired
private JobApplicationRepository jobApplicationRepository;

private Offer mapToOffer(OfferInput offerInput) {
var offer = new Offer();
offer.setJobApplicationId(offerInput.getJobApplicationId());
Expand Down Expand Up @@ -61,8 +66,18 @@ public Mono<Offer> deleteOffer(Integer id) {

public Flux<Offer> allOffer() {
return offerRepository.findAll()
.doOnComplete(() -> log.info("Retrieved all Offers"))
.doOnError(e -> log.error("Failed to retrieve Offers", e));
.flatMap(offer ->
jobApplicationRepository.findById(offer.getJobApplicationId())
.map(jobApplication -> {
offer.setJobApplication(jobApplication);
return offer;
})
.defaultIfEmpty(offer) // If JobApplication not found, just return the offer without setting JobApplication
.doOnSuccess(o -> log.info("Retrieved offer with job application: {}", o))
.doOnError(e -> log.error("Failed to fetch job application for offer", e))
)
.doOnComplete(() -> log.info("Retrieved all offers"))
.doOnError(e -> log.error("Failed to retrieve offers", e));
}

public Mono<Offer> offerByJobApplicationId(Integer jobApplicationId) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/graphql/schema.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type Offer {
offerDate: String!
salaryOffered: String
description: String
jobApplication: JobApplication
}

type Interview {
Expand All @@ -50,6 +51,7 @@ type Interview {
interviewer: String
description: String
status: String
jobApplication: JobApplication
}

type Mutation {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.tnite.jobwinner.model.InterviewInput;
import com.tnite.jobwinner.model.Interview;
import com.tnite.jobwinner.model.JobApplication;
import com.tnite.jobwinner.service.InterviewService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand All @@ -27,41 +29,47 @@ class InterviewControllerTest {
@Mock
private InterviewService interviewService;

private Interview interview1;
private Interview interview2;
private JobApplication jobApplication;

@BeforeEach
void setUp(){
jobApplication = new JobApplication(1, "Company A", "QA", "", "", LocalDate.now(), "", "abc");
interview1 = new Interview(1, 1, LocalDate.now(), "John Doe", "HR Interview", "scheduled", jobApplication);
interview2 = new Interview(2, 1, LocalDate.now(), "Jane Doe", "Technical Interview", "scheduled", jobApplication);
}

@Test
void testAddInterview() {
InterviewInput addInterviewInput = new InterviewInput();
Interview interview = new Interview();
when(interviewService.addInterview(any(InterviewInput.class))).thenReturn(Mono.just(interview));
when(interviewService.addInterview(any(InterviewInput.class))).thenReturn(Mono.just(interview1));

Mono<Interview> result = interviewController.addInterview(addInterviewInput);

assertEquals(interview, result.block());
assertEquals(interview1, result.block());
}

@Test
void testUpdateInterview() {
Interview Interview = new Interview();
when(interviewService.updateInterview(any(Interview.class))).thenReturn(Mono.just(Interview));
when(interviewService.updateInterview(any(Interview.class))).thenReturn(Mono.just(interview1));

Mono<Interview> result = interviewController.updateInterview(Interview);
Mono<Interview> result = interviewController.updateInterview(interview1);

assertEquals(Interview, result.block());
assertEquals(interview1, result.block());
}

@Test
void testDeleteInterview() {
Interview interview = new Interview();
when(interviewService.deleteInterview(anyInt())).thenReturn(Mono.just(interview));
when(interviewService.deleteInterview(anyInt())).thenReturn(Mono.just(interview1));

Mono<Interview> result = interviewController.deleteInterview(1);

assertEquals(interview, result.block());
assertEquals(interview1, result.block());
}

@Test
void testAllInterviewByJobApplicationId() {
Interview interview1 = new Interview(1, 1, LocalDate.now(), "John Doe", "HR Interview", "scheduled");
Interview interview2 = new Interview(2, 1, LocalDate.now(), "Jane Doe", "Technical Interview", "scheduled");
when(interviewService.getInterviewByJobApplicationId(1)).thenReturn(Flux.just(interview1, interview2));

Flux<Interview> result = interviewController.allInterviewByJobApplicationId(1);
Expand All @@ -73,8 +81,6 @@ void testAllInterviewByJobApplicationId() {

@Test
void testAllInterview() {
Interview interview1 = new Interview();
Interview interview2 = new Interview();
when(interviewService.allInterview()).thenReturn(Flux.just(interview1, interview2));

Flux<Interview> result = interviewController.allInterview();
Expand All @@ -95,11 +101,10 @@ void testAllInterviewWhenNoInterviewsThenReturnEmptyResult() {

@Test
void testGetInterview() {
Interview Interview1 = new Interview();
when(interviewService.getInterview(anyInt())).thenReturn(Mono.just(Interview1));
when(interviewService.getInterviewById(anyInt())).thenReturn(Mono.just(interview1));

Mono<Interview> result = interviewController.interviewById(1);

assertEquals(Interview1, result.block());
assertEquals(interview1, result.block());
}
}
Loading

0 comments on commit 4fdb113

Please sign in to comment.