This is a web application where developers can find and apply for jobs, and companies can post job opportunities and look for candidates.
Back-end: Node.js, TypeScript, Express, Prisma.io, PostgreSQL. Front-end: ReactJS, TypeScript, Tailwind, axios.
Inside the index file in the routes folder, you can see four routes: companies, users, authenticate, and jobs.
-
/authenticate - Route used for the authentication/login of users and companies
-
/companies - Route used to manage a company account.
Use Cases:- Create a company
- Upload logo
- Update the company information
- Get the company information.
-
/users - Route used to manage the user account.
Use Cases:- Create user
- Update the user information, get user information
- Upload avatar and resume
- The ability to get, add and remove experiences, certifications, and education.
-
/jobs - Route used to manage jobs by companies and users.
Use Cases:- Create a job
- Close or open a job,
- Delete a job
- Find all jobs, find a job by id, find jobs by company, find jobs by user
- Apply for a job, remove job application, check if the user is applied to a job, find the candidates for a job
Middlewares are functions that can access the HTTP request and can either terminate the request or forward it for further processing. This project has only one middleware, the ensureAuthenticated middleware. This middleware is used to ensure that a user is authenticated before proceeding to the request.
The database was created using PostgreSQL and Prisma.io. There are seven tables in the database, which are:
-
Column Type id uuidemail stringpassword stringname stringdescription stringlogo string?linkedin string?web_site string?employees_num number?created_at Date -
Column Type id uuidemail stringpassword stringname stringbirthday stringpic string?about string?salary_pretension number?github string?linkedin string?phone number?headline string?country string?city city?languages string[]level stringskills string[]resume string?created_at Date -
Column Type id uuidcompany_id stringtitle stringdescription stringtechnologies string[]level stringlocation string?home_office booleanopen booleancreated_at Date -
Column Type id uuiduser_id stringtitle stringcompany stringlocation stringcurrent booleanstart_month numberstart_year numberend_month number?end_year number?created_at Date -
Column Type id uuiduser_id stringname stringorganization stringdescription string?issued_month numberissued_year numbercreated_at Date -
Column Type id uuiduser_id stringschool stringdegree stringfield stringgrade stringactivities string?description string?start_month numberstart_year numberend_month numberend_year numbercreated_at Date -
Column Type id uuiduser_id stringjobs_id stringcreated_at Date
The database schema can be found in the schema.prisma file, inside the prisma folder.
There is one module for each main route (except for the authenticate route).
Each module has:
-
Repositories - Repositories are the data layer in which you manage the database. Usually, CRUD operations are performed here.
-
Use Cases - Handles all the business rules of a use case.
A module can also have:
-
DTOs - We can use DTOs to standardize the data of the API response structure. Telling what is going to be the format of an API call.
-
Mappers - We can use mappers to transform the repository response if needed.
All the uploaded files are stored locally in the uploads folder.
On the homepage, you can join as a company or developer, and you can log in to an existing account.
Sign-up pages for developers and companies.
| Dev sign up | Company sign up |
|---|---|
![]() |
![]() |
You can choose to log in as a company or developer. If you mark the 'Remember me' button your session will be saved for a few days.
The dashboard has all the main functionalities. You can also log out by clicking on your picture inside the dashboard header.
| Dev Dashboard | Company Dashboard |
|---|---|
![]() |
![]() |
On this page, you can see all your jobs, and the candidates for each job, open/close the job and delete a job.
On this page, developers can see all the jobs they've applied for.
A company can see a list of candidates for a job and also check all of the candidate's information and contact.
| Candidates List | Candidate Information |
|---|---|
![]() |
![]() |
On this page, a company can post a new job. You can add multiple technologies. The job location is optional.
On these pages, you can edit your information, change your profile image, and upload a resume if you are a developer.
| Dev Information | Company Information |
|---|---|
![]() |
![]() |
On these pages, the developer can add or remove experiences, certifications, and education.
| Experiences | Education | Certifications |
|---|---|---|
![]() |
![]() |
![]() |
On this page, you have an infinite scroll of all the jobs. You can search for a specific job, filter by job level, and choose to only show remote jobs.
This page contains all the job information. If you are a developer you can choose to apply or remove your application for the job.
Components are independent and reusable bits of code that return HTML. Can be used in other components and pages.
The components of this project are:
- Avatar Profile
- Dashboard Header
- Form Inputs
- Index page header
- Job Information
- Job Search
- Loading
I decided to use TailwindCSS and TailwindUI for most of the project, so the main CSS file is App.css which is being used to add the tailwind directives and some extra styles.
The services folder contains the Axios configuration and can be used to make requests and fetch data from the database.
The assets folder stores images and SVG images that are used in the interface.
The utils folder contains some functions and objects that are used in many pages and components.
-
userNavigation / companyNavigation - An array of objects, each object is a button for the dashboard header, containing the
nameof the button and thehref. -
getUpload - A function that gets a file in the local folder where the uploads are stored. This function has two parameters:
filename, andfolder. -
getDiffDate - This function is responsible for getting the difference of days between the job posted date and the current date. If the difference is less than 1 then it will return "Posted today" or if the difference is more than 1 it will return "Posted (difference) days ago".

















