Skip to content

MeftunH/talent-sourcing-system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TSS-logo

TSS

This project is simple talent sourcing system.

Related Repositories

Installation For Backend Spring Boot

  • Clone the project
  • Gradle build
  • ./gradlew build
  • ./gradlew bootRun

Installation For Frontend

  • Clone the project
  • Run npm install to install dependencies
  • Run npm start to start the project
  • Run npm run build to build the project

Technologies

  • Java 17
  • Spring 6
  • Javascript
  • Spring Boot 3
  • Spring Data JPA
  • PostgresSQL
  • React
  • Redux
  • Tailwind CSS

Database ER Diagram

Database ER diagram (crow's foot)

High Level System Design of TSS

dof-tss

Logical Hierarchy

logical

Module Hierarchy

https://excalidraw.com/#json=1rl_PWZalzLl5hD4Y2pKN,QT5TPBu4S5LgmTUMPaln-Q img.png

API Documentation

Base URL

http://localhost:8081/swagger-ui/index.html image image image

Request And Response

Add Candidate

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
}

Get Candidate

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
}

Get All Candidates

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
}

Update Candidate

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
}

Update Candidate's Status

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
}

Delete Candidate

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
}

Save Candidate's Contact Information

With Both Email and Phone Number

Request

method: POST
url: http://localhost:8081/api/v1/contact-informations
{
  "contactInformationType": "BOTH",
  "candidateId": 902,
	"emailAddress": "dffddf@gmail.com",
	"phoneNumber": "6666666666"
}

Response

{
	"data": {
		"id": 302,
		"contactInformationType": "BOTH",
		"candidateId": 902,
		"phoneNumber": "6666666666",
		"emailAddress": "dffddf@gmail.com",
		"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": "dffddf@gmail.com",
	"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
}

With Only Email

Request

method: POST
url: http://localhost:8081/api/v1/contact-informations
{
  "contactInformationType": "EMAIL",
  "candidateId": 904,
	"emailAddress": "aa@gmail.com"

}

Response

{
	"data": {
		"id": 352,
		"contactInformationType": "EMAIL",
		"candidateId": 904,
		"phoneNumber": null,
		"emailAddress": "aa@gmail.com",
		"baseAdditionalFieldsCreatedDate": "2023/04/05",
		"baseAdditionalFieldsUpdatedDate": "2023/04/05"
	},
	"responseDate": "2023-04-05T00:38:41.982+00:00",
	"message": null,
	"success": true
}

With Only Phone Number

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
}

Update Candidate's Contact Information

Creation validation rules are applied for update as well.

With Both Email and Phone Number

Request

method: PUT
url: http://localhost:8081/api/v1/contact-informations
{
  "contactInformationType": "BOTH",
  "candidateId": 904,
    "emailAddress": "loop@gmail.com"
    "phoneNumber": "9999999999"
}

Response

{
	"data": {
		"id": 104,
		"contactInformationType": "BOTH",
		"candidateId": 904,
		"phoneNumber": "9999999999",
		"emailAddress": "loop@gmail.com",
		"baseAdditionalFieldsCreatedDate": "2023/04/03",
		"baseAdditionalFieldsUpdatedDate": "2023/04/05"
	},
	"responseDate": "2023-04-05T00:41:28.616+00:00",
	"message": null,
	"success": true
}

With Only Email

Request

method: PUT
url: http://localhost:8081/api/v1/contact-informations
{
  "contactInformationType": "EMAIL",
  "candidateId": 904,
    "emailAddress": "asa@gmail.com"
}

Response

{
    "data": {
        "id": 104,
        "contactInformationType": "EMAIL",
        "candidateId": 904,
        "phoneNumber": null,
        "emailAddress": "asa@gmail.com",
        "baseAdditionalFieldsCreatedDate": "2023/04/03",
        "baseAdditionalFieldsUpdatedDate": "2023/04/05"
    },
    "responseDate": "2023-04-05T00:42:19.123+00:00",
    "message": null,
    "success": true
}

Get Interaction By Id

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
}

Get Interactions By Candidate Id

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
}

Update Interaction By Id

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
}

Delete Interaction By Id

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
}

Testing

Unit Test

image image

Integration Test

image

Screens

Home Page image

Add Candidate image Successfully added candidate image Form Validation image Show Contact Information Only Email image Show Contact Information Only Phone image Show Contact Information Both Email and Phone image

Add Contact Information

image

Types

imageWhen you select email type

image

When you select phone type

image

When you select both email and phone type

image

When Contact Information is already added

image

Update Candidate Status

image

Edit Contact Information

image

image

image

Edit Candidate

image

image

Interactions

image

When candidate has no interactions

image

Create Interaction

image

image

image

Update Interaction

image

image

image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages