This project is simple talent sourcing system.
- Clone the project
- Gradle build
./gradlew build
./gradlew bootRun
- Clone the project
- Run
npm install
to install dependencies - Run
npm start
to start the project - Run
npm run build
to build the project
- Java 17
- Spring 6
- Javascript
- Spring Boot 3
- Spring Data JPA
- PostgresSQL
- React
- Redux
- Tailwind CSS
https://excalidraw.com/#json=1rl_PWZalzLl5hD4Y2pKN,QT5TPBu4S5LgmTUMPaln-Q
http://localhost:8081/swagger-ui/index.html
Request
method: POST
url: http://localhost:8081/api/v1/candidates
{
"candidateStatus": "SOURCED",
"name": "a",
"surname": "Hashimli",
"personType": "CANDIDATE"
}
Response
{
"data": {
"id": 902,
"name": "a",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": null,
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/04",
"baseAdditionalFieldsUpdatedDate": "2023/04/04"
},
"responseDate": "2023-04-04T23:12:10.313+00:00",
"message": null,
"success": true
}
When fields are null
{
"candidateStatus": "SOURCED",
"name": null,
"surname": "Hashimli",
"personType": "CANDIDATE"
}
Response
{
"data": {
"errorDate": "2023-04-05T00:23:07.724+00:00",
"message": "Person Fields Cannot Be Null!",
"detail": "Please check the field."
},
"responseDate": "2023-04-05T00:23:07.724+00:00",
"message": "Person Fields Cannot Be Null!",
"success": false
}
Request
method: GET
url: http://localhost:8081/api/v1/candidates/902
Response
{
"data": {
"id": 902,
"name": "a",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": null,
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/04",
"baseAdditionalFieldsUpdatedDate": "2023/04/04"
},
"responseDate": "2023-04-04T23:12:10.313+00:00",
"message": null,
"success": true
}
When candidate not found
method: GET
url: http://localhost:8081/api/v1/candidates/1
Response
{
"data": {
"errorDate": "2023-04-05T00:23:07.724+00:00",
"message": "Candidate Not Found!",
"detail": "Please check the candidate id."
},
"responseDate": "2023-04-05T00:23:07.724+00:00",
"message": "Candidate Not Found!",
"success": false
}
Request
method: GET
url: http://localhost:8081/api/v1/candidates
Response
{
"data": [
{
"id": 52,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
},
{
"id": 102,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
},
{
"id": 152,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [
{
"contactInformationType": null,
"candidateId": null,
"phoneNumber": null,
"emailAddress": null
}
],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
},
{
"id": 202,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
},
{
"id": 252,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
},
{
"id": 253,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
}
],
"responseDate": "2023-04-02T21:14:19.980+00:00",
"message": null,
"success": true
}
Request
method: PUT
url: http://localhost:8081/api/v1/candidates/902
{
"candidateStatus": "SOURCED",
"name": "a",
"surname": "Hashimli",
"personType": "CANDIDATE"
}
Response
{
"data": {
"id": 902,
"name": "a",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": null,
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/04",
"baseAdditionalFieldsUpdatedDate": "2023/04/04"
},
"responseDate": "2023-04-04T23:12:10.313+00:00",
"message": null,
"success": true
}
Request
method: PATCH
url: http://localhost:8081/api/v1/candidates/52/status
{
"candidateStatus": "SOURCED"
}
Response
{
"data": {
"id": 52,
"name": "Maftun",
"surname": "Hashimli",
"personType": "CANDIDATE",
"contactInformation": [],
"candidateStatus": "SOURCED",
"baseAdditionalFieldsCreatedDate": "2023/04/02",
"baseAdditionalFieldsUpdatedDate": "2023/04/02"
},
"responseDate": "2023-04-02T02:54:32.148+00:00",
"message": null,
"success": true
}
When candidate status is not valid
{
"data": null,
"responseDate": "2023-04-02T02:55:12.000+00:00",
"message": "Candidate Status is not valid!",
"success": false
}
When Candidate is not found
{
"data": null,
"responseDate": "2023-04-02T02:55:12.000+00:00",
"message": "Candidate is not found!",
"success": false
}
Request
method: DELETE
url: http://localhost:8081/api/v1/candidates/52
Response
{
"data": null,
"responseDate": "2023-04-05T00:30:26.439+00:00",
"message": null,
"success": true
}
When Candidate is not found
{
"data": null,
"responseDate": "2023-04-02T02:55:12.000+00:00",
"message": "Candidate is not found!",
"success": false
}
Request
method: POST
url: http://localhost:8081/api/v1/contact-informations
{
"contactInformationType": "BOTH",
"candidateId": 902,
"emailAddress": "[email protected]",
"phoneNumber": "6666666666"
}
Response
{
"data": {
"id": 302,
"contactInformationType": "BOTH",
"candidateId": 902,
"phoneNumber": "6666666666",
"emailAddress": "[email protected]",
"baseAdditionalFieldsCreatedDate": "2023/04/04",
"baseAdditionalFieldsUpdatedDate": "2023/04/04"
},
"responseDate": "2023-04-04T23:12:18.961+00:00",
"message": null,
"success": true
}
When phone number is not valid
{
"contactInformationType": "BOTH",
"candidateId": 904,
"emailAddress": "[email protected]",
"phoneNumber": "11"
}
Response
{
"data": {
"errorDate": "2023-04-05T00:33:42.461+00:00",
"message": "Phone number is not valid",
"detail": "Please re-check the phone number"
},
"responseDate": "2023-04-05T00:33:42.461+00:00",
"message": "Phone number is not valid",
"success": false
}
When email address is not valid
{
"contactInformationType": "BOTH",
"candidateId": 904,
"emailAddress": "aa",
"phoneNumber": "6666666666"
}
Response
{
"data": {
"errorDate": "2023-04-05T00:34:30.026+00:00",
"message": "Email is not valid",
"detail": "Please re-check the email"
},
"responseDate": "2023-04-05T00:34:30.026+00:00",
"message": "Email is not valid",
"success": false
}
Request
method: POST
url: http://localhost:8081/api/v1/contact-informations
{
"contactInformationType": "EMAIL",
"candidateId": 904,
"emailAddress": "[email protected]"
}
Response
{
"data": {
"id": 352,
"contactInformationType": "EMAIL",
"candidateId": 904,
"phoneNumber": null,
"emailAddress": "[email protected]",
"baseAdditionalFieldsCreatedDate": "2023/04/05",
"baseAdditionalFieldsUpdatedDate": "2023/04/05"
},
"responseDate": "2023-04-05T00:38:41.982+00:00",
"message": null,
"success": true
}
Request
method: POST
url: http://localhost:8081/api/v1/contact-informations
{
"contactInformationType": "PHONE_NUMBER",
"candidateId": 904,
"phoneNumber": "7777777777"
}
Response
{
"data": {
"id": 353,
"contactInformationType": "PHONE_NUMBER",
"candidateId": 904,
"phoneNumber": "7777777777",
"emailAddress": null,
"baseAdditionalFieldsCreatedDate": "2023/04/05",
"baseAdditionalFieldsUpdatedDate": "2023/04/05"
},
"responseDate": "2023-04-05T00:39:33.055+00:00",
"message": null,
"success": true
}
Creation validation rules are applied for update as well.
Request
method: PUT
url: http://localhost:8081/api/v1/contact-informations
{
"contactInformationType": "BOTH",
"candidateId": 904,
"emailAddress": "[email protected]"
"phoneNumber": "9999999999"
}
Response
{
"data": {
"id": 104,
"contactInformationType": "BOTH",
"candidateId": 904,
"phoneNumber": "9999999999",
"emailAddress": "[email protected]",
"baseAdditionalFieldsCreatedDate": "2023/04/03",
"baseAdditionalFieldsUpdatedDate": "2023/04/05"
},
"responseDate": "2023-04-05T00:41:28.616+00:00",
"message": null,
"success": true
}
Request
method: PUT
url: http://localhost:8081/api/v1/contact-informations
{
"contactInformationType": "EMAIL",
"candidateId": 904,
"emailAddress": "[email protected]"
}
Response
{
"data": {
"id": 104,
"contactInformationType": "EMAIL",
"candidateId": 904,
"phoneNumber": null,
"emailAddress": "[email protected]",
"baseAdditionalFieldsCreatedDate": "2023/04/03",
"baseAdditionalFieldsUpdatedDate": "2023/04/05"
},
"responseDate": "2023-04-05T00:42:19.123+00:00",
"message": null,
"success": true
}
Request
method: GET
url: http://localhost:8081/api/v1/interactions/1
Response
{
"data": {
"baseAdditionalFieldsCreatedDate": "2023/04/01",
"baseAdditionalFieldsUpdatedDate": "2023/04/03",
"id": 1,
"content": "restfulToolkitX",
"isCandidateResponded": "NO",
"interactionType": "EMAIL",
"candidateId": null
},
"responseDate": "2023-04-05T00:46:58.300+00:00",
"message": null,
"success": true
}
Request
method: GET
url: http://localhost:8081/api/v1/interactions/candidate/52
Response
{
"data": [
{
"baseAdditionalFieldsCreatedDate": "2023/04/01",
"baseAdditionalFieldsUpdatedDate": "2023/04/02",
"id": 53,
"content": "ggjhjj",
"isCandidateResponded": "NO",
"interactionType": "EMAIL",
"candidateId": null
},
{
"baseAdditionalFieldsCreatedDate": "2023/04/01",
"baseAdditionalFieldsUpdatedDate": "2023/04/02",
"id": 5,
"content": "udpated",
"isCandidateResponded": "YES",
"interactionType": "PHONE",
"candidateId": null
}
],
"responseDate": "2023-04-03T03:55:39.552+00:00",
"message": null,
"success": true
}
Request
method: PUT
url: http://localhost:8081/api/v1/interactions/5
{
"content": "udpated",
"isCandidateResponded": "YES",
"interactionType": "PHONE"
}
Response
{
{
"data": {
"baseAdditionalFieldsCreatedDate": "2023/04/01",
"baseAdditionalFieldsUpdatedDate": "2023/04/02",
"id": 5,
"content": "udpated",
"isCandidateResponded": "YES",
"interactionType": "PHONE",
"candidateId": null
},
"responseDate": "2023-04-02T02:31:55.672+00:00",
"message": null,
"success": true
}
When interaction is not found
url: http://localhost:8081/api/v1/interactions/100
{
"data": null,
"responseDate": "2023-04-02T02:32:55.672+00:00",
"message": "Interaction not found",
"success": false
}
When field is not valid Request
{
"content": null,
"isCandidateResponded": "YES",
"interactionType": "PHONE"
}
Response
{
"data": {
"errorDate": "2023-04-05T00:58:47.793+00:00",
"message": "Interaction fields must be not null",
"detail": "Please check the interaction fields"
},
"responseDate": "2023-04-05T00:58:47.793+00:00",
"message": "Interaction fields must be not null",
"success": false
}
url: http://localhost:8081/api/v1/interactions/52
Response
{
"data": null,
"responseDate": "2023-04-05T00:30:26.439+00:00",
"message": null,
"success": true
}
When interaction is not found
{
"data": {
"errorDate": "2023-04-05T01:00:41.042+00:00",
"message": "Item not found!",
"detail": "Please check the id of the item."
},
"responseDate": "2023-04-05T01:00:41.042+00:00",
"message": "Item not found!",
"success": false
}
Add Candidate
Successfully added candidate
Form Validation
Show Contact Information Only Email
Show Contact Information Only Phone
Show Contact Information Both Email and Phone
Add Contact Information
Types
When you select phone type
When you select both email and phone type
When Contact Information is already added
Update Candidate Status
Edit Contact Information
Edit Candidate
Interactions
When candidate has no interactions
Create Interaction
Update Interaction