├── part 1
└── backend
│ ├── .gitignore
│ ├── package.json
│ └── app.js
├── part 10
├── backend
│ ├── .gitignore
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── authRoutes.js
│ │ ├── jobsRoutes.js
│ │ ├── jobsTypeRoutes.js
│ │ └── userRoutes.js
│ ├── models
│ │ ├── jobTypeModel.js
│ │ └── jobModel.js
│ ├── package.json
│ ├── middleware
│ │ ├── error.js
│ │ └── auth.js
│ └── app.js
└── frontend
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── src
│ ├── images
│ │ ├── hr-logo.png
│ │ ├── jobbg.jpg
│ │ └── hr-project.png
│ ├── redux
│ │ ├── constants
│ │ │ ├── jobconstant.js
│ │ │ ├── jobTypeConstant.js
│ │ │ └── userConstant.js
│ │ ├── actions
│ │ │ ├── jobTypeAction.js
│ │ │ └── jobAction.js
│ │ ├── reducers
│ │ │ ├── jobTypeReducer.js
│ │ │ └── jobReducer.js
│ │ └── store.js
│ ├── pages
│ │ ├── user
│ │ │ ├── UserDashboard.js
│ │ │ └── UserJobsHistory.js
│ │ ├── NotFound.js
│ │ └── global
│ │ │ └── Layout.js
│ ├── setupTests.js
│ ├── App.test.js
│ ├── component
│ │ ├── UserRoute.js
│ │ ├── LoadingBox.js
│ │ ├── Footer.js
│ │ ├── Header.js
│ │ └── SelectComponent.js
│ ├── theme.js
│ ├── index.css
│ ├── reportWebVitals.js
│ ├── index.js
│ └── App.css
│ ├── .gitignore
│ └── package.json
├── part 11
├── backend
│ ├── .gitignore
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── authRoutes.js
│ │ ├── jobsRoutes.js
│ │ ├── jobsTypeRoutes.js
│ │ └── userRoutes.js
│ ├── models
│ │ ├── jobTypeModel.js
│ │ └── jobModel.js
│ ├── package.json
│ ├── middleware
│ │ ├── error.js
│ │ └── auth.js
│ └── app.js
└── frontend
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── src
│ ├── images
│ │ ├── hr-logo.png
│ │ ├── jobbg.jpg
│ │ └── hr-project.png
│ ├── setupTests.js
│ ├── redux
│ │ ├── constants
│ │ │ ├── jobTypeConstant.js
│ │ │ ├── jobconstant.js
│ │ │ └── userConstant.js
│ │ ├── actions
│ │ │ ├── jobTypeAction.js
│ │ │ └── jobAction.js
│ │ ├── reducers
│ │ │ └── jobTypeReducer.js
│ │ └── store.js
│ ├── App.test.js
│ ├── component
│ │ ├── UserRoute.js
│ │ ├── AdminRoute.js
│ │ ├── ChartComponent.js
│ │ ├── LoadingBox.js
│ │ ├── Footer.js
│ │ ├── Header.js
│ │ ├── StatComponent.js
│ │ └── SelectComponent.js
│ ├── theme.js
│ ├── pages
│ │ ├── admin
│ │ │ └── data
│ │ │ │ └── data.js
│ │ ├── NotFound.js
│ │ ├── global
│ │ │ └── Layout.js
│ │ └── user
│ │ │ └── UserJobsHistory.js
│ ├── index.css
│ ├── reportWebVitals.js
│ ├── index.js
│ └── App.css
│ └── .gitignore
├── part 2
└── backend
│ ├── .gitignore
│ ├── utils
│ └── errorResponse.js
│ ├── package.json
│ ├── middleware
│ └── error.js
│ └── app.js
├── part 3
└── backend
│ ├── .gitignore
│ ├── controllers
│ └── authController.js
│ ├── utils
│ └── errorResponse.js
│ ├── routes
│ └── authRoutes.js
│ ├── package.json
│ ├── middleware
│ └── error.js
│ └── app.js
├── part 4
└── backend
│ ├── .gitignore
│ ├── utils
│ └── errorResponse.js
│ ├── routes
│ └── authRoutes.js
│ ├── package.json
│ ├── middleware
│ └── error.js
│ └── app.js
├── part 5
└── backend
│ ├── .gitignore
│ ├── utils
│ └── errorResponse.js
│ ├── routes
│ ├── authRoutes.js
│ └── userRoutes.js
│ ├── package.json
│ ├── middleware
│ ├── error.js
│ └── auth.js
│ └── app.js
├── part 6
├── backend
│ ├── .gitignore
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── authRoutes.js
│ │ └── userRoutes.js
│ ├── package.json
│ ├── middleware
│ │ ├── error.js
│ │ └── auth.js
│ └── app.js
└── frontend
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── src
│ ├── images
│ │ └── jobbg.jpg
│ ├── component
│ │ ├── Footer.js
│ │ └── Header.js
│ ├── pages
│ │ ├── NotFound.js
│ │ └── Home.js
│ ├── setupTests.js
│ ├── App.test.js
│ ├── index.js
│ ├── theme.js
│ ├── index.css
│ ├── reportWebVitals.js
│ ├── App.css
│ └── App.js
│ ├── .gitignore
│ └── package.json
├── part 7
├── backend
│ ├── .gitignore
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── jobsTypeRoutes.js
│ │ ├── authRoutes.js
│ │ ├── jobsRoutes.js
│ │ └── userRoutes.js
│ ├── models
│ │ ├── jobTypeModel.js
│ │ └── jobModel.js
│ ├── package.json
│ ├── controllers
│ │ └── jobsTypeController.js
│ ├── middleware
│ │ ├── error.js
│ │ └── auth.js
│ └── app.js
└── frontend
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── src
│ ├── images
│ │ └── jobbg.jpg
│ ├── component
│ │ ├── Footer.js
│ │ └── Header.js
│ ├── pages
│ │ ├── NotFound.js
│ │ └── Home.js
│ ├── setupTests.js
│ ├── App.test.js
│ ├── index.js
│ ├── theme.js
│ ├── index.css
│ ├── reportWebVitals.js
│ ├── App.css
│ └── App.js
│ ├── .gitignore
│ └── package.json
├── part 8
├── backend
│ ├── .gitignore
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── authRoutes.js
│ │ ├── jobsRoutes.js
│ │ ├── jobsTypeRoutes.js
│ │ └── userRoutes.js
│ ├── models
│ │ ├── jobTypeModel.js
│ │ └── jobModel.js
│ ├── package.json
│ └── middleware
│ │ ├── error.js
│ │ └── auth.js
└── frontend
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── src
│ ├── images
│ │ └── jobbg.jpg
│ ├── component
│ │ ├── Footer.js
│ │ └── Header.js
│ ├── pages
│ │ ├── NotFound.js
│ │ └── Home.js
│ ├── setupTests.js
│ ├── App.test.js
│ ├── index.js
│ ├── theme.js
│ ├── index.css
│ ├── reportWebVitals.js
│ ├── App.css
│ └── App.js
│ ├── .gitignore
│ └── package.json
├── part 9
├── backend
│ ├── .gitignore
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── authRoutes.js
│ │ ├── jobsRoutes.js
│ │ ├── jobsTypeRoutes.js
│ │ └── userRoutes.js
│ ├── models
│ │ ├── jobTypeModel.js
│ │ └── jobModel.js
│ ├── package.json
│ └── middleware
│ │ ├── error.js
│ │ └── auth.js
└── frontend
│ ├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
│ ├── src
│ ├── images
│ │ └── jobbg.jpg
│ ├── pages
│ │ └── NotFound.js
│ ├── redux
│ │ ├── constants
│ │ │ ├── jobconstant.js
│ │ │ └── jobTypeConstant.js
│ │ ├── actions
│ │ │ ├── jobTypeAction.js
│ │ │ └── jobAction.js
│ │ ├── store.js
│ │ └── reducers
│ │ │ ├── jobTypeReducer.js
│ │ │ └── jobReducer.js
│ ├── setupTests.js
│ ├── App.test.js
│ ├── theme.js
│ ├── index.css
│ ├── reportWebVitals.js
│ ├── index.js
│ ├── component
│ │ ├── LoadingBox.js
│ │ ├── Footer.js
│ │ ├── Header.js
│ │ └── SelectComponent.js
│ ├── App.css
│ └── App.js
│ ├── .gitignore
│ └── package.json
├── bonus
├── frontend
│ ├── src
│ │ ├── redux
│ │ │ ├── constants
│ │ │ │ ├── themeConstant.js
│ │ │ │ ├── jobTypeConstant.js
│ │ │ │ ├── jobconstant.js
│ │ │ │ └── userConstant.js
│ │ │ ├── actions
│ │ │ │ ├── themeAction.js
│ │ │ │ └── jobTypeAction.js
│ │ │ ├── reducers
│ │ │ │ ├── themeModeReducer.js
│ │ │ │ └── jobTypeReducer.js
│ │ │ └── store.js
│ │ ├── images
│ │ │ ├── jobbg.jpg
│ │ │ ├── hr-logo.png
│ │ │ ├── hr-project.png
│ │ │ ├── dashboardjob.png
│ │ │ └── jobportaledit.png
│ │ ├── setupTests.js
│ │ ├── App.test.js
│ │ ├── component
│ │ │ ├── UserRoute.js
│ │ │ ├── AdminRoute.js
│ │ │ ├── ChartComponent.js
│ │ │ ├── LoadingBox.js
│ │ │ ├── Footer.js
│ │ │ ├── Header.js
│ │ │ └── StatComponent.js
│ │ ├── pages
│ │ │ ├── admin
│ │ │ │ └── data
│ │ │ │ │ └── data.js
│ │ │ ├── NotFound.js
│ │ │ ├── global
│ │ │ │ └── Layout.js
│ │ │ └── user
│ │ │ │ └── UserJobsHistory.js
│ │ ├── index.css
│ │ ├── reportWebVitals.js
│ │ ├── index.js
│ │ ├── App.css
│ │ └── theme.js
│ ├── build
│ │ ├── robots.txt
│ │ ├── favicon.ico
│ │ ├── logo192.png
│ │ ├── logo512.png
│ │ ├── static
│ │ │ └── media
│ │ │ │ ├── jobbg.667fd8d0ebae0dbf848c.jpg
│ │ │ │ └── hr-project.4b14541114bbf0b14450.png
│ │ ├── asset-manifest.json
│ │ ├── manifest.json
│ │ └── index.html
│ └── public
│ │ ├── robots.txt
│ │ ├── favicon.ico
│ │ ├── logo192.png
│ │ ├── logo512.png
│ │ ├── manifest.json
│ │ └── index.html
├── backend
│ ├── utils
│ │ └── errorResponse.js
│ ├── routes
│ │ ├── authRoutes.js
│ │ ├── jobsRoutes.js
│ │ ├── jobsTypeRoutes.js
│ │ └── userRoutes.js
│ ├── models
│ │ ├── jobTypeModel.js
│ │ └── jobModel.js
│ └── middleware
│ │ ├── error.js
│ │ └── auth.js
├── .gitignore
└── package.json
└── README.md
/part 1/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 10/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 11/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 2/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 3/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 4/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 5/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 6/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 7/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 8/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/part 9/backend/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | .env
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/constants/themeConstant.js:
--------------------------------------------------------------------------------
1 | export const THEME_MODE = "THEME_MODE";
--------------------------------------------------------------------------------
/bonus/frontend/build/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/bonus/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/part 10/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/part 11/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/part 6/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/part 7/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/part 8/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/part 9/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/bonus/frontend/build/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/build/favicon.ico
--------------------------------------------------------------------------------
/bonus/frontend/build/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/build/logo192.png
--------------------------------------------------------------------------------
/bonus/frontend/build/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/build/logo512.png
--------------------------------------------------------------------------------
/bonus/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/bonus/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/public/logo192.png
--------------------------------------------------------------------------------
/bonus/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/public/logo512.png
--------------------------------------------------------------------------------
/part 3/backend/controllers/authController.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | exports.signin = (req, res) => {
4 | res.send("Hello from Node Js");
5 | }
6 |
--------------------------------------------------------------------------------
/part 6/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 6/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/part 6/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 6/frontend/public/logo192.png
--------------------------------------------------------------------------------
/part 6/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 6/frontend/public/logo512.png
--------------------------------------------------------------------------------
/part 7/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 7/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/part 7/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 7/frontend/public/logo192.png
--------------------------------------------------------------------------------
/part 7/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 7/frontend/public/logo512.png
--------------------------------------------------------------------------------
/part 8/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 8/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/part 8/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 8/frontend/public/logo192.png
--------------------------------------------------------------------------------
/part 8/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 8/frontend/public/logo512.png
--------------------------------------------------------------------------------
/part 9/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 9/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/part 9/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 9/frontend/public/logo192.png
--------------------------------------------------------------------------------
/part 9/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 9/frontend/public/logo512.png
--------------------------------------------------------------------------------
/bonus/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/part 10/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 10/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/part 10/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 10/frontend/public/logo192.png
--------------------------------------------------------------------------------
/part 10/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 10/frontend/public/logo512.png
--------------------------------------------------------------------------------
/part 11/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 11/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/part 11/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 11/frontend/public/logo192.png
--------------------------------------------------------------------------------
/part 11/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 11/frontend/public/logo512.png
--------------------------------------------------------------------------------
/part 6/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 6/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/part 7/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 7/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/part 8/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 8/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/part 9/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 9/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/bonus/frontend/src/images/hr-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/src/images/hr-logo.png
--------------------------------------------------------------------------------
/part 10/frontend/src/images/hr-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 10/frontend/src/images/hr-logo.png
--------------------------------------------------------------------------------
/part 10/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 10/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/part 11/frontend/src/images/hr-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 11/frontend/src/images/hr-logo.png
--------------------------------------------------------------------------------
/part 11/frontend/src/images/jobbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 11/frontend/src/images/jobbg.jpg
--------------------------------------------------------------------------------
/bonus/frontend/src/images/hr-project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/src/images/hr-project.png
--------------------------------------------------------------------------------
/bonus/frontend/src/images/dashboardjob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/src/images/dashboardjob.png
--------------------------------------------------------------------------------
/bonus/frontend/src/images/jobportaledit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/src/images/jobportaledit.png
--------------------------------------------------------------------------------
/part 10/frontend/src/images/hr-project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 10/frontend/src/images/hr-project.png
--------------------------------------------------------------------------------
/part 11/frontend/src/images/hr-project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/part 11/frontend/src/images/hr-project.png
--------------------------------------------------------------------------------
/part 6/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const Footer = () => {
4 | return (
5 |
Footer
6 | )
7 | }
8 |
9 | export default Footer
--------------------------------------------------------------------------------
/part 7/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const Footer = () => {
4 | return (
5 | Footer
6 | )
7 | }
8 |
9 | export default Footer
--------------------------------------------------------------------------------
/part 8/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const Footer = () => {
4 | return (
5 | Footer
6 | )
7 | }
8 |
9 | export default Footer
--------------------------------------------------------------------------------
/bonus/frontend/build/static/media/jobbg.667fd8d0ebae0dbf848c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/build/static/media/jobbg.667fd8d0ebae0dbf848c.jpg
--------------------------------------------------------------------------------
/bonus/frontend/build/static/media/hr-project.4b14541114bbf0b14450.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frozen-dev71/job-portal-mern-stack/main/bonus/frontend/build/static/media/hr-project.4b14541114bbf0b14450.png
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/actions/themeAction.js:
--------------------------------------------------------------------------------
1 | import { THEME_MODE } from "../constants/themeConstant"
2 |
3 | export const toggleActionTheme = () => (dispatch) => {
4 | dispatch({ type: THEME_MODE })
5 | }
--------------------------------------------------------------------------------
/bonus/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 10/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 11/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 2/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 3/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 4/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 5/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 6/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 6/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const NotFound = () => {
4 | return (
5 | <>
6 | Page not found
7 | >
8 | )
9 | }
10 |
11 | export default NotFound
--------------------------------------------------------------------------------
/part 7/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 7/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const NotFound = () => {
4 | return (
5 | <>
6 | Page not found
7 | >
8 | )
9 | }
10 |
11 | export default NotFound
--------------------------------------------------------------------------------
/part 8/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 8/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const NotFound = () => {
4 | return (
5 | <>
6 | Page not found
7 | >
8 | )
9 | }
10 |
11 | export default NotFound
--------------------------------------------------------------------------------
/part 9/backend/utils/errorResponse.js:
--------------------------------------------------------------------------------
1 |
2 | class ErrorResponse extends Error {
3 | constructor(message, codeStatus) {
4 | super(message);
5 | this.codeStatus = codeStatus;
6 | }
7 | }
8 |
9 | module.exports = ErrorResponse;
--------------------------------------------------------------------------------
/part 9/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const NotFound = () => {
4 | return (
5 | <>
6 | Page not found
7 | >
8 | )
9 | }
10 |
11 | export default NotFound
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/constants/jobconstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_LOAD_REQUEST = "JOB_LOAD_REQUEST";
2 | export const JOB_LOAD_SUCCESS = "JOB_LOAD_SUCCESS";
3 | export const JOB_LOAD_FAIL = "JOB_LOAD_FAIL";
4 | export const JOB_LOAD_RESET = "JOB_LOAD_RESET";
--------------------------------------------------------------------------------
/part 3/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const { signin } = require('../controllers/authController');
3 | const router = express.Router();
4 |
5 |
6 | //auth routes
7 | router.get('/', signin);
8 |
9 | module.exports = router;
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/constants/jobconstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_LOAD_REQUEST = "JOB_LOAD_REQUEST";
2 | export const JOB_LOAD_SUCCESS = "JOB_LOAD_SUCCESS";
3 | export const JOB_LOAD_FAIL = "JOB_LOAD_FAIL";
4 | export const JOB_LOAD_RESET = "JOB_LOAD_RESET";
--------------------------------------------------------------------------------
/part 10/frontend/src/pages/user/UserDashboard.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const UserDashboard = () => {
4 | return (
5 | <>
6 | user Dashboard
7 | >
8 | )
9 | }
10 |
11 | export default UserDashboard
--------------------------------------------------------------------------------
/bonus/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 10/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 11/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 6/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 7/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 8/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 9/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/constants/jobTypeConstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_TYPE_LOAD_REQUEST = "JOB_TYPE_LOAD_REQUEST";
2 | export const JOB_TYPE_LOAD_SUCCESS = "JOB_TYPE_LOAD_SUCCESS";
3 | export const JOB_TYPE_LOAD_FAIL = "JOB_TYPE_LOAD_FAIL";
4 | export const JOB_TYPE_LOAD_RESET = "JOB_TYPE_LOAD_RESET";
--------------------------------------------------------------------------------
/bonus/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/constants/jobTypeConstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_TYPE_LOAD_REQUEST = "JOB_TYPE_LOAD_REQUEST";
2 | export const JOB_TYPE_LOAD_SUCCESS = "JOB_TYPE_LOAD_SUCCESS";
3 | export const JOB_TYPE_LOAD_FAIL = "JOB_TYPE_LOAD_FAIL";
4 | export const JOB_TYPE_LOAD_RESET = "JOB_TYPE_LOAD_RESET";
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/constants/jobTypeConstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_TYPE_LOAD_REQUEST = "JOB_TYPE_LOAD_REQUEST";
2 | export const JOB_TYPE_LOAD_SUCCESS = "JOB_TYPE_LOAD_SUCCESS";
3 | export const JOB_TYPE_LOAD_FAIL = "JOB_TYPE_LOAD_FAIL";
4 | export const JOB_TYPE_LOAD_RESET = "JOB_TYPE_LOAD_RESET";
--------------------------------------------------------------------------------
/part 10/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 11/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 6/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 7/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 8/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 9/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/part 6/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 |
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 |
15 |
--------------------------------------------------------------------------------
/part 7/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 |
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 |
15 |
--------------------------------------------------------------------------------
/part 8/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 |
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 |
15 |
--------------------------------------------------------------------------------
/part 6/frontend/src/pages/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Navbar from '../component/Navbar'
3 | import Header from '../component/Header'
4 |
5 |
6 | const Home = () => {
7 | return (
8 | <>
9 |
10 |
11 | Home page
12 | >
13 | )
14 | }
15 |
16 | export default Home
--------------------------------------------------------------------------------
/part 7/frontend/src/pages/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Navbar from '../component/Navbar'
3 | import Header from '../component/Header'
4 |
5 |
6 | const Home = () => {
7 | return (
8 | <>
9 |
10 |
11 | Home page
12 | >
13 | )
14 | }
15 |
16 | export default Home
--------------------------------------------------------------------------------
/part 8/frontend/src/pages/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Navbar from '../component/Navbar'
3 | import Header from '../component/Header'
4 |
5 |
6 | const Home = () => {
7 | return (
8 | <>
9 |
10 |
11 | Home page
12 | >
13 | )
14 | }
15 |
16 | export default Home
--------------------------------------------------------------------------------
/bonus/frontend/src/component/UserRoute.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useSelector } from 'react-redux';
3 | import { Navigate } from 'react-router-dom';
4 |
5 | const UserRoute = ({ children }) => {
6 |
7 | const { userInfo } = useSelector((state) => state.signIn);
8 | return userInfo ? children : ;
9 | }
10 |
11 | export default UserRoute
--------------------------------------------------------------------------------
/part 10/frontend/src/component/UserRoute.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useSelector } from 'react-redux';
3 | import { Navigate } from 'react-router-dom';
4 |
5 | const UserRoute = ({ children }) => {
6 |
7 | const { userInfo } = useSelector((state) => state.signIn);
8 | return userInfo ? children : ;
9 | }
10 |
11 | export default UserRoute
--------------------------------------------------------------------------------
/part 11/frontend/src/component/UserRoute.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useSelector } from 'react-redux';
3 | import { Navigate } from 'react-router-dom';
4 |
5 | const UserRoute = ({ children }) => {
6 |
7 | const { userInfo } = useSelector((state) => state.signIn);
8 | return userInfo ? children : ;
9 | }
10 |
11 | export default UserRoute
--------------------------------------------------------------------------------
/bonus/frontend/src/component/AdminRoute.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useSelector } from 'react-redux';
3 | import { Navigate } from 'react-router-dom';
4 |
5 | const AdminRoute = ({ children }) => {
6 |
7 | const { userInfo } = useSelector((state) => state.signIn);
8 | return userInfo && userInfo.role === 1 ? children : ;
9 | }
10 |
11 | export default AdminRoute
--------------------------------------------------------------------------------
/part 11/frontend/src/component/AdminRoute.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useSelector } from 'react-redux';
3 | import { Navigate } from 'react-router-dom';
4 |
5 | const AdminRoute = ({ children }) => {
6 |
7 | const { userInfo } = useSelector((state) => state.signIn);
8 | return userInfo && userInfo.role === 1 ? children : ;
9 | }
10 |
11 | export default AdminRoute
--------------------------------------------------------------------------------
/part 10/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 | import { blue, lightBlue } from '@mui/material/colors';
3 |
4 | export const theme = createTheme({
5 | palette: {
6 | primary: {
7 | main: blue[500]
8 | },
9 | secondary: {
10 | main: lightBlue[800],
11 | midNightBlue: "#003366"
12 | }
13 | }
14 | });
--------------------------------------------------------------------------------
/part 11/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 | import { blue, lightBlue } from '@mui/material/colors';
3 |
4 | export const theme = createTheme({
5 | palette: {
6 | primary: {
7 | main: blue[500]
8 | },
9 | secondary: {
10 | main: lightBlue[800],
11 | midNightBlue: "#003366"
12 | }
13 | }
14 | });
--------------------------------------------------------------------------------
/part 6/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 | import { blue, lightBlue } from '@mui/material/colors';
3 |
4 | export const theme = createTheme({
5 | palette: {
6 | primary: {
7 | main: blue[500]
8 | },
9 | secondary: {
10 | main: lightBlue[800],
11 | midNightBlue: "#003366"
12 | }
13 | }
14 | });
--------------------------------------------------------------------------------
/part 7/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 | import { blue, lightBlue } from '@mui/material/colors';
3 |
4 | export const theme = createTheme({
5 | palette: {
6 | primary: {
7 | main: blue[500]
8 | },
9 | secondary: {
10 | main: lightBlue[800],
11 | midNightBlue: "#003366"
12 | }
13 | }
14 | });
--------------------------------------------------------------------------------
/part 8/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 | import { blue, lightBlue } from '@mui/material/colors';
3 |
4 | export const theme = createTheme({
5 | palette: {
6 | primary: {
7 | main: blue[500]
8 | },
9 | secondary: {
10 | main: lightBlue[800],
11 | midNightBlue: "#003366"
12 | }
13 | }
14 | });
--------------------------------------------------------------------------------
/part 9/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | import { createTheme } from '@mui/material/styles';
2 | import { blue, lightBlue } from '@mui/material/colors';
3 |
4 | export const theme = createTheme({
5 | palette: {
6 | primary: {
7 | main: blue[500]
8 | },
9 | secondary: {
10 | main: lightBlue[800],
11 | midNightBlue: "#003366"
12 | }
13 | }
14 | });
--------------------------------------------------------------------------------
/part 4/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout } = require('../controllers/authController');
4 |
5 |
6 | //auth routes
7 | // /api/signup
8 | router.post('/signup', signup);
9 | // /api/signin
10 | router.post('/signin', signin);
11 | // /api/logout
12 | router.get('/logout', logout);
13 |
14 | module.exports = router;
--------------------------------------------------------------------------------
/bonus/frontend/src/pages/admin/data/data.js:
--------------------------------------------------------------------------------
1 | export const data = [
2 | ["Year", "Jobs", "Pending", "Approved"],
3 | ["2014", 1000, 400, 200],
4 | ["2015", 1170, 460, 250],
5 | ["2016", 660, 1120, 300],
6 | ["2023", 1030, 540, 350],
7 | ];
8 |
9 | export const options = {
10 | chart: {
11 | title: "HR Performance",
12 | // subtitle: "Sales, Expenses, and Profit: 2014-2017",
13 | },
14 | };
--------------------------------------------------------------------------------
/part 11/frontend/src/pages/admin/data/data.js:
--------------------------------------------------------------------------------
1 | export const data = [
2 | ["Year", "Jobs", "Pending", "Approved"],
3 | ["2014", 1000, 400, 200],
4 | ["2015", 1170, 460, 250],
5 | ["2016", 660, 1120, 300],
6 | ["2023", 1030, 540, 350],
7 | ];
8 |
9 | export const options = {
10 | chart: {
11 | title: "HR Performance",
12 | // subtitle: "Sales, Expenses, and Profit: 2014-2017",
13 | },
14 | };
--------------------------------------------------------------------------------
/part 10/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/part 11/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/part 6/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/part 7/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/part 8/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/part 9/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/bonus/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/part 10/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/part 11/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/part 6/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/part 7/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/part 8/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/part 9/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/bonus/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/part 10/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/part 11/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/part 6/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/part 7/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/part 8/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/part 9/frontend/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/bonus/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import { Provider } from 'react-redux';
6 | import store from './redux/store';
7 |
8 |
9 |
10 |
11 | const root = ReactDOM.createRoot(document.getElementById('root'));
12 | root.render(
13 |
14 |
15 |
16 |
17 |
18 | );
19 |
20 |
21 |
--------------------------------------------------------------------------------
/part 10/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import { Provider } from 'react-redux';
6 | import store from './redux/store';
7 |
8 |
9 |
10 |
11 | const root = ReactDOM.createRoot(document.getElementById('root'));
12 | root.render(
13 |
14 |
15 |
16 |
17 |
18 | );
19 |
20 |
21 |
--------------------------------------------------------------------------------
/part 11/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import { Provider } from 'react-redux';
6 | import store from './redux/store';
7 |
8 |
9 |
10 |
11 | const root = ReactDOM.createRoot(document.getElementById('root'));
12 | root.render(
13 |
14 |
15 |
16 |
17 |
18 | );
19 |
20 |
21 |
--------------------------------------------------------------------------------
/part 9/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import { Provider } from 'react-redux';
6 | import store from './redux/store';
7 |
8 |
9 |
10 |
11 | const root = ReactDOM.createRoot(document.getElementById('root'));
12 | root.render(
13 |
14 |
15 |
16 |
17 |
18 | );
19 |
20 |
21 |
--------------------------------------------------------------------------------
/part 7/backend/routes/jobsTypeRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJobType, allJobsType } = require('../controllers/jobsTypeController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 |
8 | //job type routes
9 |
10 | // /api/type/create
11 | router.post('/type/create', isAuthenticated, createJobType)
12 | // /api/type/jobs
13 | router.get('/type/jobs', allJobsType)
14 |
15 |
16 |
17 |
18 |
19 | module.exports = router;
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/constants/jobconstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_LOAD_REQUEST = "JOB_LOAD_REQUEST";
2 | export const JOB_LOAD_SUCCESS = "JOB_LOAD_SUCCESS";
3 | export const JOB_LOAD_FAIL = "JOB_LOAD_FAIL";
4 | export const JOB_LOAD_RESET = "JOB_LOAD_RESET";
5 |
6 | export const JOB_LOAD_SINGLE_REQUEST = "JOB_LOAD_SINGLE_REQUEST";
7 | export const JOB_LOAD_SINGLE_SUCCESS = "JOB_LOAD_SINGLE_SUCCESS";
8 | export const JOB_LOAD_SINGLE_FAIL = "JOB_LOAD_SINGLE_FAIL";
9 | export const JOB_LOAD_SINGLE_RESET = "JOB_LOAD_SINGLE_RESET";
--------------------------------------------------------------------------------
/bonus/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .form_style {
2 | position: relative;
3 | outline: 0px;
4 | margin: auto;
5 | display: flex;
6 | -webkit-box-pack: center;
7 | justify-content: center;
8 | padding: 24px;
9 | background-color: rgb(255, 255, 255);
10 | border-width: 1px 0px;
11 | border-style: solid;
12 | border-color: rgb(231, 235, 240);
13 | border-image: initial;
14 | width: 35%;
15 | }
16 |
17 | .border-style {
18 | border-radius: 10px;
19 | border-left-width: 1px;
20 | border-right-width: 1px;
21 | }
--------------------------------------------------------------------------------
/part 10/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .form_style {
2 | position: relative;
3 | outline: 0px;
4 | margin: auto;
5 | display: flex;
6 | -webkit-box-pack: center;
7 | justify-content: center;
8 | padding: 24px;
9 | background-color: rgb(255, 255, 255);
10 | border-width: 1px 0px;
11 | border-style: solid;
12 | border-color: rgb(231, 235, 240);
13 | border-image: initial;
14 | width: 35%;
15 | }
16 |
17 | .border-style {
18 | border-radius: 10px;
19 | border-left-width: 1px;
20 | border-right-width: 1px;
21 | }
--------------------------------------------------------------------------------
/part 11/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .form_style {
2 | position: relative;
3 | outline: 0px;
4 | margin: auto;
5 | display: flex;
6 | -webkit-box-pack: center;
7 | justify-content: center;
8 | padding: 24px;
9 | background-color: rgb(255, 255, 255);
10 | border-width: 1px 0px;
11 | border-style: solid;
12 | border-color: rgb(231, 235, 240);
13 | border-image: initial;
14 | width: 35%;
15 | }
16 |
17 | .border-style {
18 | border-radius: 10px;
19 | border-left-width: 1px;
20 | border-right-width: 1px;
21 | }
--------------------------------------------------------------------------------
/bonus/frontend/src/component/ChartComponent.js:
--------------------------------------------------------------------------------
1 |
2 | import { Card, CardContent, useTheme } from '@mui/material'
3 |
4 |
5 | const ChartComponent = ({ children }) => {
6 | const { palette } = useTheme();
7 | return (
8 | <>
9 |
10 |
11 | {children}
12 |
13 |
14 |
15 | >
16 | )
17 | }
18 |
19 | export default ChartComponent
--------------------------------------------------------------------------------
/part 11/frontend/src/component/ChartComponent.js:
--------------------------------------------------------------------------------
1 |
2 | import { Card, CardContent, useTheme } from '@mui/material'
3 |
4 |
5 | const ChartComponent = ({ children }) => {
6 | const { palette } = useTheme();
7 | return (
8 | <>
9 |
10 |
11 | {children}
12 |
13 |
14 |
15 | >
16 | )
17 | }
18 |
19 | export default ChartComponent
--------------------------------------------------------------------------------
/bonus/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/constants/jobTypeConstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_TYPE_LOAD_REQUEST = "JOB_TYPE_LOAD_REQUEST";
2 | export const JOB_TYPE_LOAD_SUCCESS = "JOB_TYPE_LOAD_SUCCESS";
3 | export const JOB_TYPE_LOAD_FAIL = "JOB_TYPE_LOAD_FAIL";
4 | export const JOB_TYPE_LOAD_RESET = "JOB_TYPE_LOAD_RESET";
5 |
6 | export const CREATE_JOB_TYPE_REQUEST = "CREATE_JOB_TYPE_REQUEST";
7 | export const CREATE_JOB_TYPE_SUCCESS = "CREATE_JOB_TYPE_SUCCESS";
8 | export const CREATE_JOB_TYPE_FAIL = "CREATE_JOB_TYPE_FAIL";
9 | export const CREATE_JOB_TYPE_RESET = "CREATE_JOB_TYPE_RESET";
--------------------------------------------------------------------------------
/part 10/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/part 11/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/part 5/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/part 6/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/part 7/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/part 8/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/part 9/backend/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { signup, signin, logout, userProfile } = require('../controllers/authController');
4 | const { isAuthenticated } = require('../middleware/auth');
5 |
6 |
7 | //auth routes
8 | // /api/signup
9 | router.post('/signup', signup);
10 | // /api/signin
11 | router.post('/signin', signin);
12 | // /api/logout
13 | router.get('/logout', logout);
14 | // /api/me
15 | router.get('/me', isAuthenticated, userProfile);
16 |
17 | module.exports = router;
--------------------------------------------------------------------------------
/bonus/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /frontend/node_modules
13 | package-lock.json
14 | /frontend/package-lock.json
15 | /backend/package-lock.json
16 | package-lock.json
17 |
18 | # misc
19 | .DS_Store
20 | .env
21 | .env.local
22 | .env.development.local
23 | .env.test.local
24 | .env.production.local
25 |
26 | npm-debug.log*
27 | yarn-debug.log*
28 | yarn-error.log*
29 |
--------------------------------------------------------------------------------
/bonus/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import Footer from '../component/Footer'
4 | import Navbar from '../component/Navbar'
5 |
6 | const NotFound = () => {
7 | return (
8 | <>
9 |
10 |
11 |
12 | Page not found!
13 |
14 |
15 | >
16 | )
17 | }
18 |
19 | export default NotFound
--------------------------------------------------------------------------------
/part 10/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import Footer from '../component/Footer'
4 | import Navbar from '../component/Navbar'
5 |
6 | const NotFound = () => {
7 | return (
8 | <>
9 |
10 |
11 |
12 | Page not found!
13 |
14 |
15 | >
16 | )
17 | }
18 |
19 | export default NotFound
--------------------------------------------------------------------------------
/part 11/frontend/src/pages/NotFound.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import Footer from '../component/Footer'
4 | import Navbar from '../component/Navbar'
5 |
6 | const NotFound = () => {
7 | return (
8 | <>
9 |
10 |
11 |
12 | Page not found!
13 |
14 |
15 | >
16 | )
17 | }
18 |
19 | export default NotFound
--------------------------------------------------------------------------------
/bonus/frontend/src/component/LoadingBox.js:
--------------------------------------------------------------------------------
1 | import { Box, CircularProgress } from '@mui/material'
2 | import React from 'react'
3 |
4 | const LoadingBox = () => {
5 | return (
6 | <>
7 |
14 |
15 |
16 | >
17 | )
18 | }
19 |
20 | export default LoadingBox
--------------------------------------------------------------------------------
/part 10/frontend/src/component/LoadingBox.js:
--------------------------------------------------------------------------------
1 | import { Box, CircularProgress } from '@mui/material'
2 | import React from 'react'
3 |
4 | const LoadingBox = () => {
5 | return (
6 | <>
7 |
14 |
15 |
16 | >
17 | )
18 | }
19 |
20 | export default LoadingBox
--------------------------------------------------------------------------------
/part 11/frontend/src/component/LoadingBox.js:
--------------------------------------------------------------------------------
1 | import { Box, CircularProgress } from '@mui/material'
2 | import React from 'react'
3 |
4 | const LoadingBox = () => {
5 | return (
6 | <>
7 |
14 |
15 |
16 | >
17 | )
18 | }
19 |
20 | export default LoadingBox
--------------------------------------------------------------------------------
/part 9/frontend/src/component/LoadingBox.js:
--------------------------------------------------------------------------------
1 | import { Box, CircularProgress } from '@mui/material'
2 | import React from 'react'
3 |
4 | const LoadingBox = () => {
5 | return (
6 | <>
7 |
14 |
15 |
16 | >
17 | )
18 | }
19 |
20 | export default LoadingBox
--------------------------------------------------------------------------------
/bonus/backend/models/jobTypeModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobTypeSchema = new mongoose.Schema({
7 |
8 | jobTypeName: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'job category is required'],
12 | maxlength: 70,
13 | },
14 |
15 | user: {
16 | type: ObjectId,
17 | ref: "User",
18 | required: true
19 | },
20 |
21 |
22 |
23 | }, { timestamps: true })
24 |
25 | module.exports = mongoose.model("JobType", jobTypeSchema);
--------------------------------------------------------------------------------
/part 10/backend/models/jobTypeModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobTypeSchema = new mongoose.Schema({
7 |
8 | jobTypeName: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'job category is required'],
12 | maxlength: 70,
13 | },
14 |
15 | user: {
16 | type: ObjectId,
17 | ref: "User",
18 | required: true
19 | },
20 |
21 |
22 |
23 | }, { timestamps: true })
24 |
25 | module.exports = mongoose.model("JobType", jobTypeSchema);
--------------------------------------------------------------------------------
/part 11/backend/models/jobTypeModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobTypeSchema = new mongoose.Schema({
7 |
8 | jobTypeName: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'job category is required'],
12 | maxlength: 70,
13 | },
14 |
15 | user: {
16 | type: ObjectId,
17 | ref: "User",
18 | required: true
19 | },
20 |
21 |
22 |
23 | }, { timestamps: true })
24 |
25 | module.exports = mongoose.model("JobType", jobTypeSchema);
--------------------------------------------------------------------------------
/part 7/backend/models/jobTypeModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobTypeSchema = new mongoose.Schema({
7 |
8 | jobTypeName: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'job category is required'],
12 | maxlength: 70,
13 | },
14 |
15 | user: {
16 | type: ObjectId,
17 | ref: "User",
18 | required: true
19 | },
20 |
21 |
22 |
23 | }, { timestamps: true })
24 |
25 | module.exports = mongoose.model("JobType", jobTypeSchema);
--------------------------------------------------------------------------------
/part 8/backend/models/jobTypeModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobTypeSchema = new mongoose.Schema({
7 |
8 | jobTypeName: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'job category is required'],
12 | maxlength: 70,
13 | },
14 |
15 | user: {
16 | type: ObjectId,
17 | ref: "User",
18 | required: true
19 | },
20 |
21 |
22 |
23 | }, { timestamps: true })
24 |
25 | module.exports = mongoose.model("JobType", jobTypeSchema);
--------------------------------------------------------------------------------
/part 9/backend/models/jobTypeModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobTypeSchema = new mongoose.Schema({
7 |
8 | jobTypeName: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'job category is required'],
12 | maxlength: 70,
13 | },
14 |
15 | user: {
16 | type: ObjectId,
17 | ref: "User",
18 | required: true
19 | },
20 |
21 |
22 |
23 | }, { timestamps: true })
24 |
25 | module.exports = mongoose.model("JobType", jobTypeSchema);
--------------------------------------------------------------------------------
/part 1/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 10/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 11/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 2/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 3/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 4/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 5/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 6/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 7/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 8/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/part 9/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon app.js"
8 | },
9 | "author": "Emmann",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcryptjs": "^2.4.3",
13 | "body-parser": "^1.20.1",
14 | "cookie-parser": "^1.4.6",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.0.3",
17 | "express": "^4.18.2",
18 | "jsonwebtoken": "^9.0.0",
19 | "mongoose": "^5.13.9",
20 | "morgan": "^1.10.0",
21 | "nodemon": "^2.0.20"
22 | }
23 | }
--------------------------------------------------------------------------------
/bonus/frontend/build/asset-manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": {
3 | "main.css": "/static/css/main.c98e584a.css",
4 | "main.js": "/static/js/main.172b245f.js",
5 | "static/media/jobbg.jpg": "/static/media/jobbg.667fd8d0ebae0dbf848c.jpg",
6 | "static/media/hr-project.png": "/static/media/hr-project.4b14541114bbf0b14450.png",
7 | "index.html": "/index.html",
8 | "main.c98e584a.css.map": "/static/css/main.c98e584a.css.map",
9 | "main.172b245f.js.map": "/static/js/main.172b245f.js.map"
10 | },
11 | "entrypoints": [
12 | "static/css/main.c98e584a.css",
13 | "static/js/main.172b245f.js"
14 | ]
15 | }
--------------------------------------------------------------------------------
/bonus/frontend/build/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/bonus/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/part 10/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/part 11/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/part 6/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/part 7/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/part 8/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/part 9/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/bonus/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "job portal",
5 | "main": "app.js",
6 | "scripts": {
7 | "start": "node backend/app.js",
8 | "server": "nodemon backend/app.js"
9 | },
10 | "author": "Emmann",
11 | "license": "ISC",
12 | "dependencies": {
13 | "bcryptjs": "^2.4.3",
14 | "body-parser": "^1.20.1",
15 | "cookie-parser": "^1.4.6",
16 | "cors": "^2.8.5",
17 | "dotenv": "^16.0.3",
18 | "express": "^4.18.2",
19 | "jsonwebtoken": "^9.0.0",
20 | "mongoose": "^5.13.9",
21 | "morgan": "^1.10.0",
22 | "nodemon": "^2.0.20"
23 | }
24 | }
--------------------------------------------------------------------------------
/bonus/backend/routes/jobsRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJob, singleJob, updateJob, showJobs } = require('../controllers/jobsController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //jobs routes
9 |
10 | // /api/job/create
11 | router.post('/job/create', isAuthenticated, isAdmin, createJob);
12 | // /api/job/id
13 | router.get('/job/:id', singleJob);
14 | // /api/job/update/job_id
15 | router.put('/job/update/:job_id', isAuthenticated, isAdmin, updateJob);
16 | // /api/jobs/show
17 | router.get('/jobs/show', showJobs);
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 10/backend/routes/jobsRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJob, singleJob, updateJob, showJobs } = require('../controllers/jobsController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //jobs routes
9 |
10 | // /api/job/create
11 | router.post('/job/create', isAuthenticated, isAdmin, createJob);
12 | // /api/job/id
13 | router.get('/job/:id', singleJob);
14 | // /api/job/update/job_id
15 | router.put('/job/update/:job_id', isAuthenticated, isAdmin, updateJob);
16 | // /api/jobs/show
17 | router.get('/jobs/show', showJobs);
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 11/backend/routes/jobsRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJob, singleJob, updateJob, showJobs } = require('../controllers/jobsController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //jobs routes
9 |
10 | // /api/job/create
11 | router.post('/job/create', isAuthenticated, isAdmin, createJob);
12 | // /api/job/id
13 | router.get('/job/:id', singleJob);
14 | // /api/job/update/job_id
15 | router.put('/job/update/:job_id', isAuthenticated, isAdmin, updateJob);
16 | // /api/jobs/show
17 | router.get('/jobs/show', showJobs);
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 7/backend/routes/jobsRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJob, singleJob, updateJob, showJobs } = require('../controllers/jobsController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //jobs routes
9 |
10 | // /api/job/create
11 | router.post('/job/create', isAuthenticated, isAdmin, createJob);
12 | // /api/job/id
13 | router.get('/job/:id', singleJob);
14 | // /api/job/update/job_id
15 | router.put('/job/update/:job_id', isAuthenticated, isAdmin, updateJob);
16 | // /api/jobs/show
17 | router.get('/jobs/show', showJobs);
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 8/backend/routes/jobsRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJob, singleJob, updateJob, showJobs } = require('../controllers/jobsController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //jobs routes
9 |
10 | // /api/job/create
11 | router.post('/job/create', isAuthenticated, isAdmin, createJob);
12 | // /api/job/id
13 | router.get('/job/:id', singleJob);
14 | // /api/job/update/job_id
15 | router.put('/job/update/:job_id', isAuthenticated, isAdmin, updateJob);
16 | // /api/jobs/show
17 | router.get('/jobs/show', showJobs);
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 9/backend/routes/jobsRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJob, singleJob, updateJob, showJobs } = require('../controllers/jobsController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //jobs routes
9 |
10 | // /api/job/create
11 | router.post('/job/create', isAuthenticated, isAdmin, createJob);
12 | // /api/job/id
13 | router.get('/job/:id', singleJob);
14 | // /api/job/update/job_id
15 | router.put('/job/update/:job_id', isAuthenticated, isAdmin, updateJob);
16 | // /api/jobs/show
17 | router.get('/jobs/show', showJobs);
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/actions/jobTypeAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { JOB_TYPE_LOAD_FAIL, JOB_TYPE_LOAD_REQUEST, JOB_TYPE_LOAD_SUCCESS } from '../constants/jobTypeConstant';
3 |
4 |
5 |
6 | export const jobTypeLoadAction = () => async (dispatch) => {
7 | dispatch({ type: JOB_TYPE_LOAD_REQUEST });
8 | try {
9 | const { data } = await axios.get('/api/type/jobs');
10 | dispatch({
11 | type: JOB_TYPE_LOAD_SUCCESS,
12 | payload: data
13 | });
14 | } catch (error) {
15 | dispatch({
16 | type: JOB_TYPE_LOAD_FAIL,
17 | payload: error.response.data.error
18 | });
19 | }
20 | }
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/actions/jobTypeAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { JOB_TYPE_LOAD_FAIL, JOB_TYPE_LOAD_REQUEST, JOB_TYPE_LOAD_SUCCESS } from '../constants/jobTypeConstant';
3 |
4 |
5 |
6 | export const jobTypeLoadAction = () => async (dispatch) => {
7 | dispatch({ type: JOB_TYPE_LOAD_REQUEST });
8 | try {
9 | const { data } = await axios.get('/api/type/jobs');
10 | dispatch({
11 | type: JOB_TYPE_LOAD_SUCCESS,
12 | payload: data
13 | });
14 | } catch (error) {
15 | dispatch({
16 | type: JOB_TYPE_LOAD_FAIL,
17 | payload: error.response.data.error
18 | });
19 | }
20 | }
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/actions/jobTypeAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { JOB_TYPE_LOAD_FAIL, JOB_TYPE_LOAD_REQUEST, JOB_TYPE_LOAD_SUCCESS } from '../constants/jobTypeConstant';
3 |
4 |
5 |
6 | export const jobTypeLoadAction = () => async (dispatch) => {
7 | dispatch({ type: JOB_TYPE_LOAD_REQUEST });
8 | try {
9 | const { data } = await axios.get('/api/type/jobs');
10 | dispatch({
11 | type: JOB_TYPE_LOAD_SUCCESS,
12 | payload: data
13 | });
14 | } catch (error) {
15 | dispatch({
16 | type: JOB_TYPE_LOAD_FAIL,
17 | payload: error.response.data.error
18 | });
19 | }
20 | }
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, combineReducers, applyMiddleware } from 'redux';
2 | import thunk from 'redux-thunk';
3 | import { composeWithDevTools } from '@redux-devtools/extension';
4 | import { loadJobReducer } from './reducers/jobReducer';
5 | import { loadJobTypeReducer } from './reducers/jobTypeReducer';
6 |
7 | //combine reducers
8 | const reducer = combineReducers({
9 | loadJobs: loadJobReducer,
10 | jobTypeAll: loadJobTypeReducer
11 | });
12 |
13 |
14 | //initial state
15 | let initialState = {};
16 | const middleware = [thunk];
17 | const store = createStore(reducer, initialState, composeWithDevTools(applyMiddleware(...middleware)))
18 |
19 |
20 | export default store;
--------------------------------------------------------------------------------
/part 5/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 |
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 6/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 |
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/part 7/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 |
18 |
19 |
20 |
21 | module.exports = router;
--------------------------------------------------------------------------------
/bonus/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import { useTheme } from '@mui/material/styles';
4 |
5 | const Footer = () => {
6 | const { palette } = useTheme();
7 | return (
8 | <>
9 |
16 | All rights reserved! 2023.
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Footer
--------------------------------------------------------------------------------
/part 10/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import { useTheme } from '@mui/material/styles';
4 |
5 | const Footer = () => {
6 | const { palette } = useTheme();
7 | return (
8 | <>
9 |
16 | All rights reserved! 2023.
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Footer
--------------------------------------------------------------------------------
/part 11/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import { useTheme } from '@mui/material/styles';
4 |
5 | const Footer = () => {
6 | const { palette } = useTheme();
7 | return (
8 | <>
9 |
16 | All rights reserved! 2023.
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Footer
--------------------------------------------------------------------------------
/part 9/frontend/src/component/Footer.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material'
2 | import React from 'react'
3 | import { useTheme } from '@mui/material/styles';
4 |
5 | const Footer = () => {
6 | const { palette } = useTheme();
7 | return (
8 | <>
9 |
16 | All rights reserved! 2023.
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Footer
--------------------------------------------------------------------------------
/bonus/frontend/src/pages/global/Layout.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material';
2 | import React from 'react'
3 | import HeaderTop from './HeaderTop';
4 | import SidebarAdm from './Sidebar';
5 |
6 | const Layout = (Component) => ({ ...props }) => {
7 |
8 | return (
9 | <>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Layout
--------------------------------------------------------------------------------
/part 10/frontend/src/pages/global/Layout.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material';
2 | import React from 'react'
3 | import HeaderTop from './HeaderTop';
4 | import SidebarAdm from './Sidebar';
5 |
6 | const Layout = (Component) => ({ ...props }) => {
7 |
8 | return (
9 | <>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Layout
--------------------------------------------------------------------------------
/part 11/frontend/src/pages/global/Layout.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@mui/material';
2 | import React from 'react'
3 | import HeaderTop from './HeaderTop';
4 | import SidebarAdm from './Sidebar';
5 |
6 | const Layout = (Component) => ({ ...props }) => {
7 |
8 | return (
9 | <>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | >
20 | )
21 | }
22 |
23 | export default Layout
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/constants/userConstant.js:
--------------------------------------------------------------------------------
1 |
2 | export const USER_SIGNIN_REQUEST = "USER_SIGNIN_REQUEST";
3 | export const USER_SIGNIN_SUCCESS = "USER_SIGNIN_SUCCESS";
4 | export const USER_SIGNIN_FAIL = "USER_SIGNIN_FAIL";
5 | export const USER_SIGNIN_RESET = "USER_SIGNIN_RESET";
6 |
7 | export const USER_LOGOUT_REQUEST = "USER_LOGOUT_REQUEST";
8 | export const USER_LOGOUT_SUCCESS = "USER_LOGOUT_SUCCESS";
9 | export const USER_LOGOUT_FAIL = "USER_LOGOUT_FAIL";
10 | export const USER_LOGOUT_RESET = "USER_LOGOUT_RESET";
11 |
12 | export const USER_LOAD_REQUEST = "USER_LOAD_REQUEST";
13 | export const USER_LOAD_SUCCESS = "USER_LOAD_SUCCESS";
14 | export const USER_LOAD_FAIL = "USER_LOAD_FAIL";
15 | export const USER_LOAD_RESET = "USER_LOAD_RESET";
--------------------------------------------------------------------------------
/part 1/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | //database connection
13 | mongoose.connect(process.env.DATABASE, {
14 | useNewUrlParser: true,
15 | useUnifiedTopology: true,
16 | useCreateIndex: true,
17 | useFindAndModify: false
18 | })
19 | .then(() => console.log("DB connected"))
20 | .catch((err) => console.log(err));
21 |
22 |
23 | //port
24 | const port = process.env.PORT || 9000
25 |
26 | app.listen(port, () => {
27 | console.log(`Server running on port ${port}`);
28 | });
--------------------------------------------------------------------------------
/part 6/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/part 7/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/part 8/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/part 9/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/bonus/frontend/build/index.html:
--------------------------------------------------------------------------------
1 | Jop portal App
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/actions/jobAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { JOB_LOAD_FAIL, JOB_LOAD_REQUEST, JOB_LOAD_SUCCESS } from "../constants/jobconstant"
3 |
4 |
5 | export const jobLoadAction = (pageNumber, keyword = '', cat = '', location = '') => async (dispatch) => {
6 | dispatch({ type: JOB_LOAD_REQUEST });
7 | try {
8 | const { data } = await axios.get(`/api/jobs/show/?pageNumber=${pageNumber}&keyword=${keyword}&cat=${cat}&location=${location}`)
9 | dispatch({
10 | type: JOB_LOAD_SUCCESS,
11 | payload: data
12 | });
13 | } catch (error) {
14 | dispatch({
15 | type: JOB_LOAD_FAIL,
16 | payload: error.response.data.error
17 | });
18 | }
19 | }
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/actions/jobAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { JOB_LOAD_FAIL, JOB_LOAD_REQUEST, JOB_LOAD_SUCCESS } from "../constants/jobconstant"
3 |
4 |
5 | export const jobLoadAction = (pageNumber, keyword = '', cat = '', location = '') => async (dispatch) => {
6 | dispatch({ type: JOB_LOAD_REQUEST });
7 | try {
8 | const { data } = await axios.get(`/api/jobs/show/?pageNumber=${pageNumber}&keyword=${keyword}&cat=${cat}&location=${location}`)
9 | dispatch({
10 | type: JOB_LOAD_SUCCESS,
11 | payload: data
12 | });
13 | } catch (error) {
14 | dispatch({
15 | type: JOB_LOAD_FAIL,
16 | payload: error.response.data.error
17 | });
18 | }
19 | }
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/constants/jobconstant.js:
--------------------------------------------------------------------------------
1 | export const JOB_LOAD_REQUEST = "JOB_LOAD_REQUEST";
2 | export const JOB_LOAD_SUCCESS = "JOB_LOAD_SUCCESS";
3 | export const JOB_LOAD_FAIL = "JOB_LOAD_FAIL";
4 | export const JOB_LOAD_RESET = "JOB_LOAD_RESET";
5 |
6 | export const JOB_LOAD_SINGLE_REQUEST = "JOB_LOAD_SINGLE_REQUEST";
7 | export const JOB_LOAD_SINGLE_SUCCESS = "JOB_LOAD_SINGLE_SUCCESS";
8 | export const JOB_LOAD_SINGLE_FAIL = "JOB_LOAD_SINGLE_FAIL";
9 | export const JOB_LOAD_SINGLE_RESET = "JOB_LOAD_SINGLE_RESET";
10 |
11 | export const REGISTER_JOB_REQUEST = "REGISTER_JOB_REQUEST";
12 | export const REGISTER_JOB_SUCCESS = "REGISTER_JOB_SUCCESS";
13 | export const REGISTER_JOB_FAIL = "REGISTER_JOB_FAIL";
14 | export const REGISTER_JOB_RESET = "REGISTER_JOB_RESET";
--------------------------------------------------------------------------------
/part 6/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 |
5 | const Header = () => {
6 |
7 | const StyleHeader = styled(Box)(({ theme }) => (
8 | {
9 | display: "flex",
10 | justifyContent: 'center',
11 | minHeight: 400,
12 | backgroundImage: `url(${headerImage})`,
13 | backgroundSize: "cover",
14 | backgroundPosition: "center",
15 | backgroundColor: theme.palette.secondary.main
16 | }
17 |
18 | ));
19 | return (
20 | <>
21 |
22 |
23 |
24 | >
25 | )
26 | }
27 |
28 | export default Header
--------------------------------------------------------------------------------
/part 7/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 |
5 | const Header = () => {
6 |
7 | const StyleHeader = styled(Box)(({ theme }) => (
8 | {
9 | display: "flex",
10 | justifyContent: 'center',
11 | minHeight: 400,
12 | backgroundImage: `url(${headerImage})`,
13 | backgroundSize: "cover",
14 | backgroundPosition: "center",
15 | backgroundColor: theme.palette.secondary.main
16 | }
17 |
18 | ));
19 | return (
20 | <>
21 |
22 |
23 |
24 | >
25 | )
26 | }
27 |
28 | export default Header
--------------------------------------------------------------------------------
/part 8/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 |
5 | const Header = () => {
6 |
7 | const StyleHeader = styled(Box)(({ theme }) => (
8 | {
9 | display: "flex",
10 | justifyContent: 'center',
11 | minHeight: 400,
12 | backgroundImage: `url(${headerImage})`,
13 | backgroundSize: "cover",
14 | backgroundPosition: "center",
15 | backgroundColor: theme.palette.secondary.main
16 | }
17 |
18 | ));
19 | return (
20 | <>
21 |
22 |
23 |
24 | >
25 | )
26 | }
27 |
28 | export default Header
--------------------------------------------------------------------------------
/part 9/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 |
5 | const Header = () => {
6 |
7 | const StyleHeader = styled(Box)(({ theme }) => (
8 | {
9 | display: "flex",
10 | justifyContent: 'center',
11 | minHeight: 400,
12 | backgroundImage: `url(${headerImage})`,
13 | backgroundSize: "cover",
14 | backgroundPosition: "center",
15 | backgroundColor: theme.palette.secondary.main
16 | }
17 |
18 | ));
19 | return (
20 | <>
21 |
22 |
23 |
24 | >
25 | )
26 | }
27 |
28 | export default Header
--------------------------------------------------------------------------------
/bonus/backend/routes/jobsTypeRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJobType, allJobsType, updateJobType, deleteJobType } = require('../controllers/jobsTypeController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //job type routes
9 |
10 | // /api/type/create
11 | router.post('/type/create', isAuthenticated, isAdmin, createJobType)
12 | // /api/type/jobs
13 | router.get('/type/jobs', allJobsType)
14 | // /api/type/update/type_id
15 | router.put('/type/update/:type_id', isAuthenticated, isAdmin, updateJobType)
16 | // /api/type/delete/type_id
17 | router.delete('/type/delete/:type_id', isAuthenticated, isAdmin, deleteJobType)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | module.exports = router;
--------------------------------------------------------------------------------
/part 10/backend/routes/jobsTypeRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJobType, allJobsType, updateJobType, deleteJobType } = require('../controllers/jobsTypeController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //job type routes
9 |
10 | // /api/type/create
11 | router.post('/type/create', isAuthenticated, isAdmin, createJobType)
12 | // /api/type/jobs
13 | router.get('/type/jobs', allJobsType)
14 | // /api/type/update/type_id
15 | router.put('/type/update/:type_id', isAuthenticated, isAdmin, updateJobType)
16 | // /api/type/delete/type_id
17 | router.delete('/type/delete/:type_id', isAuthenticated, isAdmin, deleteJobType)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | module.exports = router;
--------------------------------------------------------------------------------
/part 11/backend/routes/jobsTypeRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJobType, allJobsType, updateJobType, deleteJobType } = require('../controllers/jobsTypeController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //job type routes
9 |
10 | // /api/type/create
11 | router.post('/type/create', isAuthenticated, isAdmin, createJobType)
12 | // /api/type/jobs
13 | router.get('/type/jobs', allJobsType)
14 | // /api/type/update/type_id
15 | router.put('/type/update/:type_id', isAuthenticated, isAdmin, updateJobType)
16 | // /api/type/delete/type_id
17 | router.delete('/type/delete/:type_id', isAuthenticated, isAdmin, deleteJobType)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | module.exports = router;
--------------------------------------------------------------------------------
/part 8/backend/routes/jobsTypeRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJobType, allJobsType, updateJobType, deleteJobType } = require('../controllers/jobsTypeController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //job type routes
9 |
10 | // /api/type/create
11 | router.post('/type/create', isAuthenticated, isAdmin, createJobType)
12 | // /api/type/jobs
13 | router.get('/type/jobs', allJobsType)
14 | // /api/type/update/type_id
15 | router.put('/type/update/:type_id', isAuthenticated, isAdmin, updateJobType)
16 | // /api/type/delete/type_id
17 | router.delete('/type/delete/:type_id', isAuthenticated, isAdmin, deleteJobType)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | module.exports = router;
--------------------------------------------------------------------------------
/part 9/backend/routes/jobsTypeRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { createJobType, allJobsType, updateJobType, deleteJobType } = require('../controllers/jobsTypeController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 |
8 | //job type routes
9 |
10 | // /api/type/create
11 | router.post('/type/create', isAuthenticated, isAdmin, createJobType)
12 | // /api/type/jobs
13 | router.get('/type/jobs', allJobsType)
14 | // /api/type/update/type_id
15 | router.put('/type/update/:type_id', isAuthenticated, isAdmin, updateJobType)
16 | // /api/type/delete/type_id
17 | router.delete('/type/delete/:type_id', isAuthenticated, isAdmin, deleteJobType)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | module.exports = router;
--------------------------------------------------------------------------------
/part 6/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import './App.css';
2 | import { BrowserRouter, Routes, Route } from 'react-router-dom';
3 | import Home from './pages/Home';
4 | import NotFound from './pages/NotFound';
5 | import { CssBaseline, ThemeProvider } from '@mui/material';
6 | import { theme } from './theme';
7 |
8 |
9 | const App = () => {
10 |
11 | return (
12 | <>
13 |
14 |
15 |
16 |
17 | } />
18 | } />
19 |
20 |
21 |
22 | >
23 | )
24 | }
25 |
26 | export default App
27 |
--------------------------------------------------------------------------------
/part 7/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import './App.css';
2 | import { BrowserRouter, Routes, Route } from 'react-router-dom';
3 | import Home from './pages/Home';
4 | import NotFound from './pages/NotFound';
5 | import { CssBaseline, ThemeProvider } from '@mui/material';
6 | import { theme } from './theme';
7 |
8 |
9 | const App = () => {
10 |
11 | return (
12 | <>
13 |
14 |
15 |
16 |
17 | } />
18 | } />
19 |
20 |
21 |
22 | >
23 | )
24 | }
25 |
26 | export default App
27 |
--------------------------------------------------------------------------------
/part 8/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import './App.css';
2 | import { BrowserRouter, Routes, Route } from 'react-router-dom';
3 | import Home from './pages/Home';
4 | import NotFound from './pages/NotFound';
5 | import { CssBaseline, ThemeProvider } from '@mui/material';
6 | import { theme } from './theme';
7 |
8 |
9 | const App = () => {
10 |
11 | return (
12 | <>
13 |
14 |
15 |
16 |
17 | } />
18 | } />
19 |
20 |
21 |
22 | >
23 | )
24 | }
25 |
26 | export default App
27 |
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/reducers/jobTypeReducer.js:
--------------------------------------------------------------------------------
1 | import { JOB_TYPE_LOAD_FAIL, JOB_TYPE_LOAD_REQUEST, JOB_TYPE_LOAD_RESET, JOB_TYPE_LOAD_SUCCESS } from "../constants/jobTypeConstant"
2 |
3 |
4 | export const loadJobTypeReducer = (state = { jobType: [] }, action) => {
5 | switch (action.type) {
6 | case JOB_TYPE_LOAD_REQUEST:
7 | return { loading: true }
8 | case JOB_TYPE_LOAD_SUCCESS:
9 | return {
10 | loading: false,
11 | jobType: action.payload.jobT
12 | }
13 | case JOB_TYPE_LOAD_FAIL:
14 | return {
15 | loading: false,
16 | error: action.payload
17 | }
18 | case JOB_TYPE_LOAD_RESET:
19 | return {}
20 | default:
21 | return state;
22 | }
23 | }
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/reducers/jobTypeReducer.js:
--------------------------------------------------------------------------------
1 | import { JOB_TYPE_LOAD_FAIL, JOB_TYPE_LOAD_REQUEST, JOB_TYPE_LOAD_RESET, JOB_TYPE_LOAD_SUCCESS } from "../constants/jobTypeConstant"
2 |
3 |
4 | export const loadJobTypeReducer = (state = { jobType: [] }, action) => {
5 | switch (action.type) {
6 | case JOB_TYPE_LOAD_REQUEST:
7 | return { loading: true }
8 | case JOB_TYPE_LOAD_SUCCESS:
9 | return {
10 | loading: false,
11 | jobType: action.payload.jobT
12 | }
13 | case JOB_TYPE_LOAD_FAIL:
14 | return {
15 | loading: false,
16 | error: action.payload
17 | }
18 | case JOB_TYPE_LOAD_RESET:
19 | return {}
20 | default:
21 | return state;
22 | }
23 | }
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/reducers/jobTypeReducer.js:
--------------------------------------------------------------------------------
1 | import { JOB_TYPE_LOAD_FAIL, JOB_TYPE_LOAD_REQUEST, JOB_TYPE_LOAD_RESET, JOB_TYPE_LOAD_SUCCESS } from "../constants/jobTypeConstant"
2 |
3 |
4 | export const loadJobTypeReducer = (state = { jobType: [] }, action) => {
5 | switch (action.type) {
6 | case JOB_TYPE_LOAD_REQUEST:
7 | return { loading: true }
8 | case JOB_TYPE_LOAD_SUCCESS:
9 | return {
10 | loading: false,
11 | jobType: action.payload.jobT
12 | }
13 | case JOB_TYPE_LOAD_FAIL:
14 | return {
15 | loading: false,
16 | error: action.payload
17 | }
18 | case JOB_TYPE_LOAD_RESET:
19 | return {}
20 | default:
21 | return state;
22 | }
23 | }
--------------------------------------------------------------------------------
/bonus/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser, createUserJobsHistory } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 | // /api/user/jobhistory
18 | router.post('/user/jobhistory', isAuthenticated, createUserJobsHistory);
19 |
20 |
21 |
22 |
23 | module.exports = router;
--------------------------------------------------------------------------------
/bonus/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 10/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 11/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 6/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 7/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 8/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 9/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Jop portal App
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/part 10/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser, createUserJobsHistory } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 | // /api/user/jobhistory
18 | router.post('/user/jobhistory', isAuthenticated, createUserJobsHistory);
19 |
20 |
21 |
22 |
23 | module.exports = router;
--------------------------------------------------------------------------------
/part 11/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser, createUserJobsHistory } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 | // /api/user/jobhistory
18 | router.post('/user/jobhistory', isAuthenticated, createUserJobsHistory);
19 |
20 |
21 |
22 |
23 | module.exports = router;
--------------------------------------------------------------------------------
/part 8/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser, createUserJobsHistory } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 | // /api/user/jobhistory
18 | router.post('/user/jobhistory', isAuthenticated, createUserJobsHistory);
19 |
20 |
21 |
22 |
23 | module.exports = router;
--------------------------------------------------------------------------------
/part 9/backend/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const router = express.Router();
3 | const { allUsers, singleUser, editUser, deleteUser, createUserJobsHistory } = require('../controllers/userController');
4 | const { isAuthenticated, isAdmin } = require('../middleware/auth');
5 |
6 |
7 | //user routes
8 |
9 | // /api/allusers
10 | router.get('/allusers', isAuthenticated, isAdmin, allUsers);
11 | // /api/user/id
12 | router.get('/user/:id', isAuthenticated, singleUser);
13 | // /api/user/edit/id
14 | router.put('/user/edit/:id', isAuthenticated, editUser);
15 | // /api/admin/user/delete/id
16 | router.delete('/admin/user/delete/:id', isAuthenticated, isAdmin, deleteUser);
17 | // /api/user/jobhistory
18 | router.post('/user/jobhistory', isAuthenticated, createUserJobsHistory);
19 |
20 |
21 |
22 |
23 | module.exports = router;
--------------------------------------------------------------------------------
/bonus/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 | import SearchInputEl from './SearchInputEl';
5 |
6 | const Header = () => {
7 |
8 | const StyleHeader = styled(Box)(({ theme }) => (
9 | {
10 | display: "flex",
11 | justifyContent: 'center',
12 | alignItems: 'center',
13 | minHeight: 400,
14 | backgroundImage: `url(${headerImage})`,
15 | backgroundSize: "cover",
16 | backgroundPosition: "center",
17 | backgroundColor: theme.palette.secondary.main
18 | }
19 |
20 | ));
21 | return (
22 | <>
23 |
24 |
25 |
26 | >
27 | )
28 | }
29 |
30 | export default Header
--------------------------------------------------------------------------------
/part 10/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 | import SearchInputEl from './SearchInputEl';
5 |
6 | const Header = () => {
7 |
8 | const StyleHeader = styled(Box)(({ theme }) => (
9 | {
10 | display: "flex",
11 | justifyContent: 'center',
12 | alignItems: 'center',
13 | minHeight: 400,
14 | backgroundImage: `url(${headerImage})`,
15 | backgroundSize: "cover",
16 | backgroundPosition: "center",
17 | backgroundColor: theme.palette.secondary.main
18 | }
19 |
20 | ));
21 | return (
22 | <>
23 |
24 |
25 |
26 | >
27 | )
28 | }
29 |
30 | export default Header
--------------------------------------------------------------------------------
/part 11/frontend/src/component/Header.js:
--------------------------------------------------------------------------------
1 | import { Box, styled } from '@mui/material'
2 | import React from 'react'
3 | import headerImage from '../images/jobbg.jpg';
4 | import SearchInputEl from './SearchInputEl';
5 |
6 | const Header = () => {
7 |
8 | const StyleHeader = styled(Box)(({ theme }) => (
9 | {
10 | display: "flex",
11 | justifyContent: 'center',
12 | alignItems: 'center',
13 | minHeight: 400,
14 | backgroundImage: `url(${headerImage})`,
15 | backgroundSize: "cover",
16 | backgroundPosition: "center",
17 | backgroundColor: theme.palette.secondary.main
18 | }
19 |
20 | ));
21 | return (
22 | <>
23 |
24 |
25 |
26 | >
27 | )
28 | }
29 |
30 | export default Header
--------------------------------------------------------------------------------
/part 9/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import './App.css';
2 | import { BrowserRouter, Routes, Route } from 'react-router-dom';
3 | import Home from './pages/Home';
4 | import NotFound from './pages/NotFound';
5 | import { CssBaseline, ThemeProvider } from '@mui/material';
6 | import { theme } from './theme';
7 |
8 |
9 | const App = () => {
10 |
11 | return (
12 | <>
13 |
14 |
15 |
16 |
17 | } />
18 | } />
19 | } />
20 |
21 |
22 |
23 | >
24 | )
25 | }
26 |
27 | export default App
28 |
--------------------------------------------------------------------------------
/part 7/backend/controllers/jobsTypeController.js:
--------------------------------------------------------------------------------
1 | const JobType = require('../models/jobTypeModel');
2 | const ErrorResponse = require('../utils/errorResponse');
3 |
4 | //create job category
5 | exports.createJobType = async (req, res, next) => {
6 | try {
7 | const jobT = await JobType.create({
8 | jobTypeName: req.body.jobTypeName,
9 | user: req.user.id
10 | });
11 | res.status(201).json({
12 | success: true,
13 | jobT
14 | })
15 | } catch (error) {
16 | next(error);
17 | }
18 | }
19 |
20 |
21 | //all jobs category
22 | exports.allJobsType = async (req, res, next) => {
23 | try {
24 | const jobT = await JobType.find();
25 | res.status(200).json({
26 | success: true,
27 | jobT
28 | })
29 | } catch (error) {
30 | next(error);
31 | }
32 | }
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/reducers/themeModeReducer.js:
--------------------------------------------------------------------------------
1 | import { THEME_MODE } from "../constants/themeConstant";
2 |
3 |
4 | // export const modeReducer = (state = { mode: "light" }, action) => {
5 | // switch (action.type) {
6 | // case THEME_MODE:
7 | // //return { state.mode = mode === "light" ? "dark" : "light" }
8 | // //return state.mode = state.mode === "light" ? "dark" : "light";
9 | // return { ...state, mode: "light" ? "dark" : "light" };
10 | // default:
11 | // return state;
12 | // }
13 |
14 | // }
15 |
16 | export const modeReducer = (state = { toggleActive: true }, action) => {
17 | switch (action.type) {
18 | case THEME_MODE:
19 | return {
20 | ...state,
21 | toggleActive: !state.toggleActive,
22 | mode: state.toggleActive ? "light" : "dark"
23 | };
24 |
25 | default:
26 | return state;
27 | }
28 |
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/bonus/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 10/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 11/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 2/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.statusCode || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 3/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.statusCode || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 4/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 5/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 6/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 7/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 8/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/part 9/backend/middleware/error.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require("../utils/errorResponse");
2 |
3 | const errorHandler = (err, req, res, next) => {
4 |
5 | let error = { ...err };
6 | error.message = err.message;
7 |
8 | if (err.name === "CastError") {
9 | const message = `Ressource not found ${err.value}`;
10 | error = new ErrorResponse(message, 404);
11 | }
12 |
13 | //Mongoose duplicate value
14 | if (err.code === 11000) {
15 | const message = "Duplicate field value entered";
16 | error = new ErrorResponse(message, 400);
17 | }
18 |
19 | //Mongoose validation error
20 | if (err.name === "ValidationError") {
21 | const message = Object.values(err.errors).map(val => ' ' + val.message);
22 | error = new ErrorResponse(message, 400);
23 | }
24 |
25 | res.status(error.codeStatus || 500).json({
26 | success: false,
27 | error: error.message || "server error"
28 | })
29 |
30 | }
31 |
32 | module.exports = errorHandler;
--------------------------------------------------------------------------------
/bonus/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 10/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 11/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 5/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 6/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 7/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 8/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 9/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const ErrorResponse = require('../utils/errorResponse');
2 | const jwt = require('jsonwebtoken');
3 | const User = require("../models/userModel");
4 |
5 | // check is user is authenticated
6 | exports.isAuthenticated = async (req, res, next) => {
7 | const { token } = req.cookies;
8 | // Make sure token exists
9 | if (!token) {
10 | return next(new ErrorResponse('Not authorized to access this route', 401));
11 | }
12 |
13 | try {
14 | // Verify token
15 | const decoded = jwt.verify(token, process.env.JWT_SECRET);
16 | req.user = await User.findById(decoded.id);
17 | next();
18 |
19 | } catch (error) {
20 | return next(new ErrorResponse('Not authorized to access this route', 401));
21 | }
22 | }
23 |
24 | //middleware for admin
25 | exports.isAdmin = (req, res, next) => {
26 | if (req.user.role === 0) {
27 | return next(new ErrorResponse('Access denied, you must an admin', 401));
28 | }
29 | next();
30 | }
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/reducers/jobReducer.js:
--------------------------------------------------------------------------------
1 | import { JOB_LOAD_FAIL, JOB_LOAD_REQUEST, JOB_LOAD_RESET, JOB_LOAD_SUCCESS } from "../constants/jobconstant"
2 |
3 |
4 | export const loadJobReducer = (state = { jobs: [] }, action) => {
5 | switch (action.type) {
6 | case JOB_LOAD_REQUEST:
7 | return { loading: true }
8 | case JOB_LOAD_SUCCESS:
9 | return {
10 | loading: false,
11 | success: action.payload.success,
12 | page: action.payload.page,
13 | pages: action.payload.pages,
14 | count: action.payload.count,
15 | setUniqueLocation: action.payload.setUniqueLocation,
16 | jobs: action.payload.jobs
17 | }
18 | case JOB_LOAD_FAIL:
19 | return {
20 | loading: false,
21 | error: action.payload
22 | }
23 | case JOB_LOAD_RESET:
24 | return {}
25 | default:
26 | return state;
27 | }
28 | }
--------------------------------------------------------------------------------
/part 9/frontend/src/redux/reducers/jobReducer.js:
--------------------------------------------------------------------------------
1 | import { JOB_LOAD_FAIL, JOB_LOAD_REQUEST, JOB_LOAD_RESET, JOB_LOAD_SUCCESS } from "../constants/jobconstant"
2 |
3 |
4 | export const loadJobReducer = (state = { jobs: [] }, action) => {
5 | switch (action.type) {
6 | case JOB_LOAD_REQUEST:
7 | return { loading: true }
8 | case JOB_LOAD_SUCCESS:
9 | return {
10 | loading: false,
11 | success: action.payload.success,
12 | page: action.payload.page,
13 | pages: action.payload.pages,
14 | count: action.payload.count,
15 | setUniqueLocation: action.payload.setUniqueLocation,
16 | jobs: action.payload.jobs
17 | }
18 | case JOB_LOAD_FAIL:
19 | return {
20 | loading: false,
21 | error: action.payload
22 | }
23 | case JOB_LOAD_RESET:
24 | return {}
25 | default:
26 | return state;
27 | }
28 | }
--------------------------------------------------------------------------------
/part 10/frontend/src/redux/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, combineReducers, applyMiddleware } from 'redux';
2 | import thunk from 'redux-thunk';
3 | import { composeWithDevTools } from '@redux-devtools/extension';
4 | import { loadJobReducer } from './reducers/jobReducer';
5 | import { loadJobTypeReducer } from './reducers/jobTypeReducer';
6 | import { userReducerLogout, userReducerProfile, userReducerSignIn } from './reducers/userReducer';
7 |
8 | //combine reducers
9 | const reducer = combineReducers({
10 | loadJobs: loadJobReducer,
11 | jobTypeAll: loadJobTypeReducer,
12 | signIn: userReducerSignIn,
13 | logOut: userReducerLogout,
14 | userProfile: userReducerProfile
15 | });
16 |
17 |
18 | //initial state
19 | let initialState = {
20 | signIn: {
21 | userInfo: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : null
22 | }
23 | };
24 | const middleware = [thunk];
25 | const store = createStore(reducer, initialState, composeWithDevTools(applyMiddleware(...middleware)))
26 |
27 |
28 | export default store;
--------------------------------------------------------------------------------
/bonus/backend/models/jobModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobSchema = new mongoose.Schema({
7 |
8 | title: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'Title is required'],
12 | maxlength: 70,
13 | },
14 |
15 | description: {
16 | type: String,
17 | trim: true,
18 | required: [true, 'Description is required'],
19 | },
20 | salary: {
21 | type: String,
22 | trim: true,
23 | required: [true, 'Salary is required'],
24 | },
25 | location: {
26 | type: String,
27 | },
28 | available: {
29 | type: Boolean,
30 | default: true
31 | },
32 | jobType: {
33 | type: ObjectId,
34 | ref: "JobType",
35 | required: true
36 | },
37 | user: {
38 | type: ObjectId,
39 | ref: "User",
40 | required: true
41 | },
42 |
43 |
44 |
45 | }, { timestamps: true })
46 |
47 | module.exports = mongoose.model("Job", jobSchema);
--------------------------------------------------------------------------------
/part 10/backend/models/jobModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobSchema = new mongoose.Schema({
7 |
8 | title: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'Title is required'],
12 | maxlength: 70,
13 | },
14 |
15 | description: {
16 | type: String,
17 | trim: true,
18 | required: [true, 'Description is required'],
19 | },
20 | salary: {
21 | type: String,
22 | trim: true,
23 | required: [true, 'Salary is required'],
24 | },
25 | location: {
26 | type: String,
27 | },
28 | available: {
29 | type: Boolean,
30 | default: true
31 | },
32 | jobType: {
33 | type: ObjectId,
34 | ref: "JobType",
35 | required: true
36 | },
37 | user: {
38 | type: ObjectId,
39 | ref: "User",
40 | required: true
41 | },
42 |
43 |
44 |
45 | }, { timestamps: true })
46 |
47 | module.exports = mongoose.model("Job", jobSchema);
--------------------------------------------------------------------------------
/part 11/backend/models/jobModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobSchema = new mongoose.Schema({
7 |
8 | title: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'Title is required'],
12 | maxlength: 70,
13 | },
14 |
15 | description: {
16 | type: String,
17 | trim: true,
18 | required: [true, 'Description is required'],
19 | },
20 | salary: {
21 | type: String,
22 | trim: true,
23 | required: [true, 'Salary is required'],
24 | },
25 | location: {
26 | type: String,
27 | },
28 | available: {
29 | type: Boolean,
30 | default: true
31 | },
32 | jobType: {
33 | type: ObjectId,
34 | ref: "JobType",
35 | required: true
36 | },
37 | user: {
38 | type: ObjectId,
39 | ref: "User",
40 | required: true
41 | },
42 |
43 |
44 |
45 | }, { timestamps: true })
46 |
47 | module.exports = mongoose.model("Job", jobSchema);
--------------------------------------------------------------------------------
/part 7/backend/models/jobModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobSchema = new mongoose.Schema({
7 |
8 | title: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'Title is required'],
12 | maxlength: 70,
13 | },
14 |
15 | description: {
16 | type: String,
17 | trim: true,
18 | required: [true, 'Description is required'],
19 | },
20 | salary: {
21 | type: String,
22 | trim: true,
23 | required: [true, 'Salary is required'],
24 | },
25 | location: {
26 | type: String,
27 | },
28 | available: {
29 | type: Boolean,
30 | default: true
31 | },
32 | jobType: {
33 | type: ObjectId,
34 | ref: "JobType",
35 | required: true
36 | },
37 | user: {
38 | type: ObjectId,
39 | ref: "User",
40 | required: true
41 | },
42 |
43 |
44 |
45 | }, { timestamps: true })
46 |
47 | module.exports = mongoose.model("Job", jobSchema);
--------------------------------------------------------------------------------
/part 8/backend/models/jobModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobSchema = new mongoose.Schema({
7 |
8 | title: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'Title is required'],
12 | maxlength: 70,
13 | },
14 |
15 | description: {
16 | type: String,
17 | trim: true,
18 | required: [true, 'Description is required'],
19 | },
20 | salary: {
21 | type: String,
22 | trim: true,
23 | required: [true, 'Salary is required'],
24 | },
25 | location: {
26 | type: String,
27 | },
28 | available: {
29 | type: Boolean,
30 | default: true
31 | },
32 | jobType: {
33 | type: ObjectId,
34 | ref: "JobType",
35 | required: true
36 | },
37 | user: {
38 | type: ObjectId,
39 | ref: "User",
40 | required: true
41 | },
42 |
43 |
44 |
45 | }, { timestamps: true })
46 |
47 | module.exports = mongoose.model("Job", jobSchema);
--------------------------------------------------------------------------------
/part 9/backend/models/jobModel.js:
--------------------------------------------------------------------------------
1 |
2 | const mongoose = require('mongoose');
3 | const { ObjectId } = mongoose.Schema;
4 |
5 |
6 | const jobSchema = new mongoose.Schema({
7 |
8 | title: {
9 | type: String,
10 | trim: true,
11 | required: [true, 'Title is required'],
12 | maxlength: 70,
13 | },
14 |
15 | description: {
16 | type: String,
17 | trim: true,
18 | required: [true, 'Description is required'],
19 | },
20 | salary: {
21 | type: String,
22 | trim: true,
23 | required: [true, 'Salary is required'],
24 | },
25 | location: {
26 | type: String,
27 | },
28 | available: {
29 | type: Boolean,
30 | default: true
31 | },
32 | jobType: {
33 | type: ObjectId,
34 | ref: "JobType",
35 | required: true
36 | },
37 | user: {
38 | type: ObjectId,
39 | ref: "User",
40 | required: true
41 | },
42 |
43 |
44 |
45 | }, { timestamps: true })
46 |
47 | module.exports = mongoose.model("Job", jobSchema);
--------------------------------------------------------------------------------
/bonus/frontend/src/component/StatComponent.js:
--------------------------------------------------------------------------------
1 | import { Card, CardContent, IconButton, Typography, useTheme } from '@mui/material'
2 | import React from 'react'
3 |
4 | const StatComponent = ({ value, icon, description, money }) => {
5 | const { palette } = useTheme();
6 | return (
7 | <>
8 |
9 |
10 |
11 |
12 | {icon}
13 |
14 |
15 | {money !== '' ? money + value : value}
16 |
17 |
18 | {description}
19 |
20 |
21 |
22 |
23 | >
24 | )
25 | }
26 |
27 | export default StatComponent
--------------------------------------------------------------------------------
/part 11/frontend/src/component/StatComponent.js:
--------------------------------------------------------------------------------
1 | import { Card, CardContent, IconButton, Typography, useTheme } from '@mui/material'
2 | import React from 'react'
3 |
4 | const StatComponent = ({ value, icon, description, money }) => {
5 | const { palette } = useTheme();
6 | return (
7 | <>
8 |
9 |
10 |
11 |
12 | {icon}
13 |
14 |
15 | {money !== '' ? money + value : value}
16 |
17 |
18 | {description}
19 |
20 |
21 |
22 |
23 | >
24 | )
25 | }
26 |
27 | export default StatComponent
--------------------------------------------------------------------------------
/part 2/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 | const cookieParser = require("cookie-parser");
9 | const errorHandler = require("./middleware/error");
10 |
11 |
12 |
13 |
14 | //database connection
15 | mongoose.connect(process.env.DATABASE, {
16 | useNewUrlParser: true,
17 | useUnifiedTopology: true,
18 | useCreateIndex: true,
19 | useFindAndModify: false
20 | })
21 | .then(() => console.log("DB connected"))
22 | .catch((err) => console.log(err));
23 |
24 | //MIDDLEWARE
25 | app.use(morgan('dev'));
26 | app.use(bodyParser.json({ limit: "5mb" }));
27 | app.use(bodyParser.urlencoded({
28 | limit: "5mb",
29 | extended: true
30 | }));
31 | app.use(cookieParser());
32 | app.use(cors());
33 |
34 | // error middleware
35 | app.use(errorHandler);
36 |
37 | //port
38 | const port = process.env.PORT || 9000
39 |
40 | app.listen(port, () => {
41 | console.log(`Server running on port ${port}`);
42 | });
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, combineReducers, applyMiddleware } from 'redux';
2 | import thunk from 'redux-thunk';
3 | import { composeWithDevTools } from '@redux-devtools/extension';
4 | import { loadJobReducer, loadJobSingleReducer } from './reducers/jobReducer';
5 | import { loadJobTypeReducer } from './reducers/jobTypeReducer';
6 | import { allUserReducer, userApplyJobReducer, userReducerLogout, userReducerProfile, userReducerSignIn } from './reducers/userReducer';
7 |
8 | //combine reducers
9 | const reducer = combineReducers({
10 | loadJobs: loadJobReducer,
11 | jobTypeAll: loadJobTypeReducer,
12 | signIn: userReducerSignIn,
13 | logOut: userReducerLogout,
14 | userProfile: userReducerProfile,
15 | singleJob: loadJobSingleReducer,
16 | userJobApplication: userApplyJobReducer,
17 | allUsers: allUserReducer
18 |
19 | });
20 |
21 |
22 | //initial state
23 | let initialState = {
24 | signIn: {
25 | userInfo: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : null
26 | }
27 | };
28 | const middleware = [thunk];
29 | const store = createStore(reducer, initialState, composeWithDevTools(applyMiddleware(...middleware)))
30 |
31 |
32 | export default store;
--------------------------------------------------------------------------------
/bonus/frontend/src/pages/user/UserJobsHistory.js:
--------------------------------------------------------------------------------
1 | import { Typography } from '@mui/material'
2 | import { Box } from '@mui/material'
3 | import React from 'react'
4 | import { useSelector } from 'react-redux'
5 | import CardElement from '../../component/CardElement'
6 |
7 |
8 | const UserJobsHistory = () => {
9 | const { user } = useSelector(state => state.userProfile);
10 |
11 |
12 | return (
13 | <>
14 |
15 | Jobs History
16 |
17 | {
18 | user && user.jobsHistory.map((history, i) => (
19 |
27 | ))
28 | }
29 |
30 |
31 | >
32 | )
33 | }
34 |
35 | export default UserJobsHistory
--------------------------------------------------------------------------------
/part 11/frontend/src/pages/user/UserJobsHistory.js:
--------------------------------------------------------------------------------
1 | import { Typography } from '@mui/material'
2 | import { Box } from '@mui/material'
3 | import React from 'react'
4 | import { useSelector } from 'react-redux'
5 | import CardElement from '../../component/CardElement'
6 |
7 |
8 | const UserJobsHistory = () => {
9 | const { user } = useSelector(state => state.userProfile);
10 |
11 |
12 | return (
13 | <>
14 |
15 | Jobs History
16 |
17 | {
18 | user && user.jobsHistory.map((history, i) => (
19 |
27 | ))
28 | }
29 |
30 |
31 | >
32 | )
33 | }
34 |
35 | export default UserJobsHistory
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/constants/userConstant.js:
--------------------------------------------------------------------------------
1 |
2 | export const USER_SIGNIN_REQUEST = "USER_SIGNIN_REQUEST";
3 | export const USER_SIGNIN_SUCCESS = "USER_SIGNIN_SUCCESS";
4 | export const USER_SIGNIN_FAIL = "USER_SIGNIN_FAIL";
5 | export const USER_SIGNIN_RESET = "USER_SIGNIN_RESET";
6 |
7 | export const USER_LOGOUT_REQUEST = "USER_LOGOUT_REQUEST";
8 | export const USER_LOGOUT_SUCCESS = "USER_LOGOUT_SUCCESS";
9 | export const USER_LOGOUT_FAIL = "USER_LOGOUT_FAIL";
10 | export const USER_LOGOUT_RESET = "USER_LOGOUT_RESET";
11 |
12 | export const USER_LOAD_REQUEST = "USER_LOAD_REQUEST";
13 | export const USER_LOAD_SUCCESS = "USER_LOAD_SUCCESS";
14 | export const USER_LOAD_FAIL = "USER_LOAD_FAIL";
15 | export const USER_LOAD_RESET = "USER_LOAD_RESET";
16 |
17 | export const USER_APPLY_JOB_REQUEST = "USER_APPLY_JOB_REQUEST";
18 | export const USER_APPLY_JOB_SUCCESS = "USER_APPLY_JOB_SUCCESS";
19 | export const USER_APPLY_JOB_FAIL = "USER_APPLY_JOB_FAIL";
20 | export const USER_APPLY_JOB_RESET = "USER_APPLY_JOB_RESET";
21 |
22 | export const ALL_USER_LOAD_REQUEST = "ALL_USER_LOAD_REQUEST";
23 | export const ALL_USER_LOAD_SUCCESS = "ALL_USER_LOAD_SUCCESS";
24 | export const ALL_USER_LOAD_FAIL = "ALL_USER_LOAD_FAIL";
25 | export const ALL_USER_LOAD_RESET = "ALL_USER_LOAD_RESET";
26 |
27 |
--------------------------------------------------------------------------------
/part 3/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 | const cookieParser = require("cookie-parser");
9 | const errorHandler = require("./middleware/error");
10 |
11 |
12 |
13 | // import routes
14 | const authRoutes = require('./routes/authRoutes');
15 |
16 | //database connection
17 | mongoose.connect(process.env.DATABASE, {
18 | useNewUrlParser: true,
19 | useUnifiedTopology: true,
20 | useCreateIndex: true,
21 | useFindAndModify: false
22 | })
23 | .then(() => console.log("DB connected"))
24 | .catch((err) => console.log(err));
25 |
26 | //MIDDLEWARE
27 | app.use(morgan('dev'));
28 | app.use(bodyParser.json({ limit: "5mb" }));
29 | app.use(bodyParser.urlencoded({
30 | limit: "5mb",
31 | extended: true
32 | }));
33 | app.use(cookieParser());
34 | app.use(cors());
35 |
36 |
37 | //ROUTES MIDDLEWARE
38 | // app.get('/', (req, res) => {
39 | // res.send("Hello from Node Js");
40 | // })
41 | app.use('/api', authRoutes);
42 |
43 | // error middleware
44 | app.use(errorHandler);
45 |
46 | //port
47 | const port = process.env.PORT || 9000
48 |
49 | app.listen(port, () => {
50 | console.log(`Server running on port ${port}`);
51 | });
--------------------------------------------------------------------------------
/part 4/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | // import routes
13 | const authRoutes = require('./routes/authRoutes');
14 |
15 | const cookieParser = require("cookie-parser");
16 | const errorHandler = require("./middleware/error");
17 |
18 | //database connection
19 | mongoose.connect(process.env.DATABASE, {
20 | useNewUrlParser: true,
21 | useUnifiedTopology: true,
22 | useCreateIndex: true,
23 | useFindAndModify: false
24 | })
25 | .then(() => console.log("DB connected"))
26 | .catch((err) => console.log(err));
27 |
28 | //MIDDLEWARE
29 | app.use(morgan('dev'));
30 | app.use(bodyParser.json({ limit: "5mb" }));
31 | app.use(bodyParser.urlencoded({
32 | limit: "5mb",
33 | extended: true
34 | }));
35 | app.use(cookieParser());
36 | app.use(cors());
37 |
38 |
39 | //ROUTES MIDDLEWARE
40 | // app.get('/', (req, res) => {
41 | // res.send("Hello from Node Js");
42 | // })
43 | app.use('/api', authRoutes);
44 |
45 | // error middleware
46 | app.use(errorHandler);
47 |
48 | //port
49 | const port = process.env.PORT || 9000
50 |
51 | app.listen(port, () => {
52 | console.log(`Server running on port ${port}`);
53 | });
--------------------------------------------------------------------------------
/part 11/frontend/src/redux/actions/jobAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import {
3 | JOB_LOAD_FAIL,
4 | JOB_LOAD_REQUEST,
5 | JOB_LOAD_SINGLE_FAIL,
6 | JOB_LOAD_SINGLE_REQUEST,
7 | JOB_LOAD_SINGLE_SUCCESS,
8 | JOB_LOAD_SUCCESS
9 | } from "../constants/jobconstant"
10 |
11 |
12 | export const jobLoadAction = (pageNumber, keyword = '', cat = '', location = '') => async (dispatch) => {
13 | dispatch({ type: JOB_LOAD_REQUEST });
14 | try {
15 | const { data } = await axios.get(`/api/jobs/show/?pageNumber=${pageNumber}&keyword=${keyword}&cat=${cat}&location=${location}`)
16 | dispatch({
17 | type: JOB_LOAD_SUCCESS,
18 | payload: data
19 | });
20 | } catch (error) {
21 | dispatch({
22 | type: JOB_LOAD_FAIL,
23 | payload: error.response.data.error
24 | });
25 | }
26 | }
27 |
28 | // single job action
29 | export const jobLoadSingleAction = (id) => async (dispatch) => {
30 | dispatch({ type: JOB_LOAD_SINGLE_REQUEST });
31 | try {
32 | const { data } = await axios.get(`/api/job/${id}`);
33 | dispatch({
34 | type: JOB_LOAD_SINGLE_SUCCESS,
35 | payload: data
36 | });
37 | } catch (error) {
38 | dispatch({
39 | type: JOB_LOAD_SINGLE_FAIL,
40 | payload: error.response.data.error
41 | });
42 | }
43 | }
--------------------------------------------------------------------------------
/part 10/frontend/src/component/SelectComponent.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import Box from '@mui/material/Box';
3 | import InputLabel from '@mui/material/InputLabel';
4 | import MenuItem from '@mui/material/MenuItem';
5 | import FormControl from '@mui/material/FormControl';
6 | import Select from '@mui/material/Select';
7 | import { useSelector } from 'react-redux';
8 |
9 | const SelectComponent = ({ handleChangeCategory, cat }) => {
10 |
11 | const { jobType } = useSelector(state => state.jobTypeAll);
12 |
13 | return (
14 |
15 |
16 | Category
17 |
33 |
34 |
35 | )
36 | }
37 |
38 | export default SelectComponent
--------------------------------------------------------------------------------
/part 11/frontend/src/component/SelectComponent.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import Box from '@mui/material/Box';
3 | import InputLabel from '@mui/material/InputLabel';
4 | import MenuItem from '@mui/material/MenuItem';
5 | import FormControl from '@mui/material/FormControl';
6 | import Select from '@mui/material/Select';
7 | import { useSelector } from 'react-redux';
8 |
9 | const SelectComponent = ({ handleChangeCategory, cat }) => {
10 |
11 | const { jobType } = useSelector(state => state.jobTypeAll);
12 |
13 | return (
14 |
15 |
16 | Category
17 |
33 |
34 |
35 | )
36 | }
37 |
38 | export default SelectComponent
--------------------------------------------------------------------------------
/part 9/frontend/src/component/SelectComponent.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import Box from '@mui/material/Box';
3 | import InputLabel from '@mui/material/InputLabel';
4 | import MenuItem from '@mui/material/MenuItem';
5 | import FormControl from '@mui/material/FormControl';
6 | import Select from '@mui/material/Select';
7 | import { useSelector } from 'react-redux';
8 |
9 | const SelectComponent = ({ handleChangeCategory, cat }) => {
10 |
11 | const { jobType } = useSelector(state => state.jobTypeAll);
12 |
13 | return (
14 |
15 |
16 | Category
17 |
33 |
34 |
35 | )
36 | }
37 |
38 | export default SelectComponent
--------------------------------------------------------------------------------
/part 10/frontend/src/pages/user/UserJobsHistory.js:
--------------------------------------------------------------------------------
1 | import { Typography } from '@mui/material'
2 | import { Box } from '@mui/material'
3 | import React, { useEffect } from 'react'
4 | import { useDispatch, useSelector } from 'react-redux'
5 | import CardElement from '../../component/CardElement'
6 | import { userProfileAction } from '../../redux/actions/userAction'
7 |
8 | const UserJobsHistory = () => {
9 | const { user } = useSelector(state => state.userProfile);
10 | const dispatch = useDispatch();
11 | useEffect(() => {
12 | dispatch(userProfileAction());
13 | }, []);
14 |
15 | return (
16 | <>
17 |
18 | Jobs History
19 |
20 | {
21 | user && user.jobsHistory.map((history, i) => (
22 |
30 | ))
31 | }
32 |
33 |
34 | >
35 | )
36 | }
37 |
38 | export default UserJobsHistory
--------------------------------------------------------------------------------
/part 5/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | // import routes
13 | const authRoutes = require('./routes/authRoutes');
14 | const userRoutes = require('./routes/userRoutes');
15 |
16 | const cookieParser = require("cookie-parser");
17 | const errorHandler = require("./middleware/error");
18 |
19 | //database connection
20 | mongoose.connect(process.env.DATABASE, {
21 | useNewUrlParser: true,
22 | useUnifiedTopology: true,
23 | useCreateIndex: true,
24 | useFindAndModify: false
25 | })
26 | .then(() => console.log("DB connected"))
27 | .catch((err) => console.log(err));
28 |
29 | //MIDDLEWARE
30 | app.use(morgan('dev'));
31 | app.use(bodyParser.json({ limit: "5mb" }));
32 | app.use(bodyParser.urlencoded({
33 | limit: "5mb",
34 | extended: true
35 | }));
36 | app.use(cookieParser());
37 | app.use(cors());
38 |
39 |
40 | //ROUTES MIDDLEWARE
41 | // app.get('/', (req, res) => {
42 | // res.send("Hello from Node Js");
43 | // })
44 | app.use('/api', authRoutes);
45 | app.use('/api', userRoutes);
46 |
47 | // error middleware
48 | app.use(errorHandler);
49 |
50 | //port
51 | const port = process.env.PORT || 9000
52 |
53 | app.listen(port, () => {
54 | console.log(`Server running on port ${port}`);
55 | });
--------------------------------------------------------------------------------
/part 6/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | // import routes
13 | const authRoutes = require('./routes/authRoutes');
14 | const userRoutes = require('./routes/userRoutes');
15 |
16 | const cookieParser = require("cookie-parser");
17 | const errorHandler = require("./middleware/error");
18 |
19 | //database connection
20 | mongoose.connect(process.env.DATABASE, {
21 | useNewUrlParser: true,
22 | useUnifiedTopology: true,
23 | useCreateIndex: true,
24 | useFindAndModify: false
25 | })
26 | .then(() => console.log("DB connected"))
27 | .catch((err) => console.log(err));
28 |
29 | //MIDDLEWARE
30 | app.use(morgan('dev'));
31 | app.use(bodyParser.json({ limit: "5mb" }));
32 | app.use(bodyParser.urlencoded({
33 | limit: "5mb",
34 | extended: true
35 | }));
36 | app.use(cookieParser());
37 | app.use(cors());
38 |
39 |
40 | //ROUTES MIDDLEWARE
41 | // app.get('/', (req, res) => {
42 | // res.send("Hello from Node Js");
43 | // })
44 | app.use('/api', authRoutes);
45 | app.use('/api', userRoutes);
46 |
47 | // error middleware
48 | app.use(errorHandler);
49 |
50 | //port
51 | const port = process.env.PORT || 9000
52 |
53 | app.listen(port, () => {
54 | console.log(`Server running on port ${port}`);
55 | });
--------------------------------------------------------------------------------
/part 6/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.10.6",
7 | "@emotion/styled": "^11.10.6",
8 | "@mui/icons-material": "^5.11.9",
9 | "@mui/material": "^5.11.10",
10 | "@testing-library/jest-dom": "^5.16.5",
11 | "@testing-library/react": "^13.4.0",
12 | "@testing-library/user-event": "^13.5.0",
13 | "axios": "^1.1.3",
14 | "formik": "^2.2.9",
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "react-redux": "^8.0.5",
18 | "react-router-dom": "^6.8.1",
19 | "react-scripts": "5.0.1",
20 | "react-toastify": "^9.1.1",
21 | "redux": "^4.2.1",
22 | "redux-thunk": "^2.4.2",
23 | "web-vitals": "^2.1.4",
24 | "yup": "^1.0.0"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": [
34 | "react-app",
35 | "react-app/jest"
36 | ]
37 | },
38 | "browserslist": {
39 | "production": [
40 | ">0.2%",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | "last 1 chrome version",
46 | "last 1 firefox version",
47 | "last 1 safari version"
48 | ]
49 | },
50 | "devDependencies": {
51 | "@redux-devtools/extension": "^3.2.5"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/part 7/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.10.6",
7 | "@emotion/styled": "^11.10.6",
8 | "@mui/icons-material": "^5.11.9",
9 | "@mui/material": "^5.11.10",
10 | "@testing-library/jest-dom": "^5.16.5",
11 | "@testing-library/react": "^13.4.0",
12 | "@testing-library/user-event": "^13.5.0",
13 | "axios": "^1.1.3",
14 | "formik": "^2.2.9",
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "react-redux": "^8.0.5",
18 | "react-router-dom": "^6.8.1",
19 | "react-scripts": "5.0.1",
20 | "react-toastify": "^9.1.1",
21 | "redux": "^4.2.1",
22 | "redux-thunk": "^2.4.2",
23 | "web-vitals": "^2.1.4",
24 | "yup": "^1.0.0"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": [
34 | "react-app",
35 | "react-app/jest"
36 | ]
37 | },
38 | "browserslist": {
39 | "production": [
40 | ">0.2%",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | "last 1 chrome version",
46 | "last 1 firefox version",
47 | "last 1 safari version"
48 | ]
49 | },
50 | "devDependencies": {
51 | "@redux-devtools/extension": "^3.2.5"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/part 8/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.10.6",
7 | "@emotion/styled": "^11.10.6",
8 | "@mui/icons-material": "^5.11.9",
9 | "@mui/material": "^5.11.10",
10 | "@testing-library/jest-dom": "^5.16.5",
11 | "@testing-library/react": "^13.4.0",
12 | "@testing-library/user-event": "^13.5.0",
13 | "axios": "^1.1.3",
14 | "formik": "^2.2.9",
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "react-redux": "^8.0.5",
18 | "react-router-dom": "^6.8.1",
19 | "react-scripts": "5.0.1",
20 | "react-toastify": "^9.1.1",
21 | "redux": "^4.2.1",
22 | "redux-thunk": "^2.4.2",
23 | "web-vitals": "^2.1.4",
24 | "yup": "^1.0.0"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": [
34 | "react-app",
35 | "react-app/jest"
36 | ]
37 | },
38 | "browserslist": {
39 | "production": [
40 | ">0.2%",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | "last 1 chrome version",
46 | "last 1 firefox version",
47 | "last 1 safari version"
48 | ]
49 | },
50 | "devDependencies": {
51 | "@redux-devtools/extension": "^3.2.5"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/part 9/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.10.6",
7 | "@emotion/styled": "^11.10.6",
8 | "@mui/icons-material": "^5.11.9",
9 | "@mui/material": "^5.11.10",
10 | "@testing-library/jest-dom": "^5.16.5",
11 | "@testing-library/react": "^13.4.0",
12 | "@testing-library/user-event": "^13.5.0",
13 | "axios": "^1.1.3",
14 | "formik": "^2.2.9",
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "react-redux": "^8.0.5",
18 | "react-router-dom": "^6.8.1",
19 | "react-scripts": "5.0.1",
20 | "react-toastify": "^9.1.1",
21 | "redux": "^4.2.1",
22 | "redux-thunk": "^2.4.2",
23 | "web-vitals": "^2.1.4",
24 | "yup": "^1.0.0"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": [
34 | "react-app",
35 | "react-app/jest"
36 | ]
37 | },
38 | "browserslist": {
39 | "production": [
40 | ">0.2%",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | "last 1 chrome version",
46 | "last 1 firefox version",
47 | "last 1 safari version"
48 | ]
49 | },
50 | "devDependencies": {
51 | "@redux-devtools/extension": "^3.2.5"
52 | },
53 | "proxy": "http://localhost:9000"
54 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # job-portal-mern-stack
2 | This is a Full stack job App made with MERN Stack, MUI, Datagrid, cookie, etc. It is a Youtube series to teach step by step how to make a full stack App
3 |
4 | ##### To use this app: clone this repo, in the root of bonus folder create a .env file with these variables PORT=9000 DATABASE=YOUR_MONGO_URL JWT_SECRET=fidbfbFCDSm1558 NODE_ENV=development if in development mode and NODE_ENV=production if you're deploying your App; after that, run "npm install" in the bonus root folder. Go inside frontend folder in bonus folder, run "npm install "
5 |
6 | 
7 |
8 | 
9 |
10 |
11 |
12 | # Features:
13 | ##### - Software Architecture: MVC pattern;
14 | ##### - HOC (High Order Component);
15 | ##### - Dark & Light theme mode with MUI (Material UI);
16 | ##### - Admin & user dashboard, pagination, Datagrid, Download in CSV, etc;
17 | ##### - Open & close dashboard sidebar;
18 | ##### - Admin can create jobs, create category, etc.
19 | ##### - Dashboard Analytic;
20 | ##### - Responsive App / MUI: Material UI;
21 | ##### - User can see his jobs history in user dashboard;
22 | ##### - Log In & Register Form with Formik and Yup for validation;
23 | ##### - Modern authentication system with JWT and cookie;
24 | ##### - Search job, filter jobs by category and location;
25 | ##### - Apply for a job in the single page job, if the user is already log In;
26 | ##### - Toast notification;
27 |
28 |
29 |
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/constants/userConstant.js:
--------------------------------------------------------------------------------
1 |
2 | export const USER_SIGNIN_REQUEST = "USER_SIGNIN_REQUEST";
3 | export const USER_SIGNIN_SUCCESS = "USER_SIGNIN_SUCCESS";
4 | export const USER_SIGNIN_FAIL = "USER_SIGNIN_FAIL";
5 | export const USER_SIGNIN_RESET = "USER_SIGNIN_RESET";
6 |
7 | export const USER_LOGOUT_REQUEST = "USER_LOGOUT_REQUEST";
8 | export const USER_LOGOUT_SUCCESS = "USER_LOGOUT_SUCCESS";
9 | export const USER_LOGOUT_FAIL = "USER_LOGOUT_FAIL";
10 | export const USER_LOGOUT_RESET = "USER_LOGOUT_RESET";
11 |
12 | export const USER_LOAD_REQUEST = "USER_LOAD_REQUEST";
13 | export const USER_LOAD_SUCCESS = "USER_LOAD_SUCCESS";
14 | export const USER_LOAD_FAIL = "USER_LOAD_FAIL";
15 | export const USER_LOAD_RESET = "USER_LOAD_RESET";
16 |
17 | export const USER_APPLY_JOB_REQUEST = "USER_APPLY_JOB_REQUEST";
18 | export const USER_APPLY_JOB_SUCCESS = "USER_APPLY_JOB_SUCCESS";
19 | export const USER_APPLY_JOB_FAIL = "USER_APPLY_JOB_FAIL";
20 | export const USER_APPLY_JOB_RESET = "USER_APPLY_JOB_RESET";
21 |
22 | export const ALL_USER_LOAD_REQUEST = "ALL_USER_LOAD_REQUEST";
23 | export const ALL_USER_LOAD_SUCCESS = "ALL_USER_LOAD_SUCCESS";
24 | export const ALL_USER_LOAD_FAIL = "ALL_USER_LOAD_FAIL";
25 | export const ALL_USER_LOAD_RESET = "ALL_USER_LOAD_RESET";
26 |
27 | export const USER_SIGNUP_REQUEST = "USER_SIGNUP_REQUEST";
28 | export const USER_SIGNUP_SUCCESS = "USER_SIGNUP_SUCCESS";
29 | export const USER_SIGNUP_FAIL = "USER_SIGNUP_FAIL";
30 | export const USER_SIGNUP_RESET = "USER_SIGNUP_RESET";
31 |
32 |
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/actions/jobTypeAction.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { toast } from 'react-toastify';
3 | import {
4 | CREATE_JOB_TYPE_FAIL,
5 | CREATE_JOB_TYPE_REQUEST,
6 | CREATE_JOB_TYPE_SUCCESS,
7 | JOB_TYPE_LOAD_FAIL,
8 | JOB_TYPE_LOAD_REQUEST,
9 | JOB_TYPE_LOAD_SUCCESS
10 | } from '../constants/jobTypeConstant';
11 |
12 |
13 | // load jobs type
14 | export const jobTypeLoadAction = () => async (dispatch) => {
15 | dispatch({ type: JOB_TYPE_LOAD_REQUEST });
16 | try {
17 | const { data } = await axios.get('/api/type/jobs');
18 | dispatch({
19 | type: JOB_TYPE_LOAD_SUCCESS,
20 | payload: data
21 | });
22 | } catch (error) {
23 | dispatch({
24 | type: JOB_TYPE_LOAD_FAIL,
25 | payload: error.response.data.error
26 | });
27 | }
28 | }
29 |
30 |
31 | // create jobs category
32 | export const createJobTypeAction = (jobtype) => async (dispatch) => {
33 | dispatch({ type: CREATE_JOB_TYPE_REQUEST })
34 |
35 | try {
36 | const { data } = await axios.post("/api/type/create", jobtype)
37 | dispatch({
38 | type: CREATE_JOB_TYPE_SUCCESS,
39 | payload: data
40 | })
41 | toast.success("Job type created successfully");
42 |
43 |
44 | } catch (error) {
45 | dispatch({
46 | type: CREATE_JOB_TYPE_FAIL,
47 | payload: error.response.data.error
48 | })
49 | toast.error(error.response.data.error);
50 |
51 | }
52 | }
--------------------------------------------------------------------------------
/part 10/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.10.6",
7 | "@emotion/styled": "^11.10.6",
8 | "@mui/icons-material": "^5.11.9",
9 | "@mui/material": "^5.11.10",
10 | "@testing-library/jest-dom": "^5.16.5",
11 | "@testing-library/react": "^13.4.0",
12 | "@testing-library/user-event": "^13.5.0",
13 | "axios": "^1.1.3",
14 | "formik": "^2.2.9",
15 | "react": "^18.2.0",
16 | "react-dom": "^18.2.0",
17 | "react-pro-sidebar": "^1.0.0",
18 | "react-redux": "^8.0.5",
19 | "react-router-dom": "^6.8.1",
20 | "react-scripts": "5.0.1",
21 | "react-toastify": "^9.1.1",
22 | "redux": "^4.2.1",
23 | "redux-thunk": "^2.4.2",
24 | "web-vitals": "^2.1.4",
25 | "yup": "^1.0.0"
26 | },
27 | "scripts": {
28 | "start": "react-scripts start",
29 | "build": "react-scripts build",
30 | "test": "react-scripts test",
31 | "eject": "react-scripts eject"
32 | },
33 | "eslintConfig": {
34 | "extends": [
35 | "react-app",
36 | "react-app/jest"
37 | ]
38 | },
39 | "browserslist": {
40 | "production": [
41 | ">0.2%",
42 | "not dead",
43 | "not op_mini all"
44 | ],
45 | "development": [
46 | "last 1 chrome version",
47 | "last 1 firefox version",
48 | "last 1 safari version"
49 | ]
50 | },
51 | "devDependencies": {
52 | "@redux-devtools/extension": "^3.2.5"
53 | },
54 | "proxy": "http://localhost:9000"
55 | }
56 |
--------------------------------------------------------------------------------
/bonus/frontend/src/theme.js:
--------------------------------------------------------------------------------
1 | // import { createTheme } from '@mui/material/styles';
2 | import { blue, grey, lightBlue } from '@mui/material/colors';
3 |
4 | // export const theme = createTheme({
5 | // palette: {
6 | // primary: {
7 | // main: blue[500]
8 | // },
9 | // secondary: {
10 | // main: lightBlue[800],
11 | // midNightBlue: "#003366"
12 | // }
13 | // }
14 | // });
15 |
16 | export const themeColors = (mode) => ({
17 | palette: {
18 | mode,
19 | ...(mode === 'light'
20 | ? {
21 | // palette values for light mode
22 | primary: {
23 | main: blue[500],
24 | white: "#fff"
25 | },
26 | secondary: {
27 | main: lightBlue[800],
28 | midNightBlue: "#003366"
29 | },
30 | }
31 | : {
32 | // palette values for dark mode
33 | primary: {
34 | main: "#003366",
35 | white: "#003366"
36 | },
37 | secondary: {
38 | main: blue[500],
39 | midNightBlue: "#2196f3"
40 | },
41 | background: {
42 | default: "#1e1e1e",
43 | },
44 | text: {
45 | primary: '#fff',
46 | secondary: grey[500],
47 | },
48 | }),
49 | },
50 | });
51 |
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, combineReducers, applyMiddleware } from 'redux';
2 | import thunk from 'redux-thunk';
3 | import { composeWithDevTools } from '@redux-devtools/extension';
4 | import { loadJobReducer, loadJobSingleReducer, registerAjobReducer } from './reducers/jobReducer';
5 | import { createJobTypeReducer, loadJobTypeReducer } from './reducers/jobTypeReducer';
6 | import {
7 | allUserReducer,
8 | userApplyJobReducer,
9 | userReducerLogout,
10 | userReducerProfile,
11 | userReducerSignIn,
12 | userReducerSignUp
13 | } from './reducers/userReducer';
14 | import { modeReducer } from './reducers/themeModeReducer';
15 |
16 | //combine reducers
17 | const reducer = combineReducers({
18 | loadJobs: loadJobReducer,
19 | jobTypeAll: loadJobTypeReducer,
20 | signIn: userReducerSignIn,
21 | logOut: userReducerLogout,
22 | userProfile: userReducerProfile,
23 | singleJob: loadJobSingleReducer,
24 | userJobApplication: userApplyJobReducer,
25 | allUsers: allUserReducer,
26 | signUp: userReducerSignUp,
27 | mode: modeReducer,
28 | registerJob: registerAjobReducer,
29 | createJobType: createJobTypeReducer
30 |
31 | });
32 |
33 |
34 | //initial state
35 | let initialState = {
36 | signIn: {
37 | userInfo: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : null
38 | },
39 | mode: {
40 | mode: "light"
41 | }
42 | };
43 | const middleware = [thunk];
44 | const store = createStore(reducer, initialState, composeWithDevTools(applyMiddleware(...middleware)))
45 |
46 |
47 | export default store;
--------------------------------------------------------------------------------
/bonus/frontend/src/redux/reducers/jobTypeReducer.js:
--------------------------------------------------------------------------------
1 | import {
2 | CREATE_JOB_TYPE_FAIL,
3 | CREATE_JOB_TYPE_REQUEST,
4 | CREATE_JOB_TYPE_RESET,
5 | CREATE_JOB_TYPE_SUCCESS,
6 | JOB_TYPE_LOAD_FAIL,
7 | JOB_TYPE_LOAD_REQUEST,
8 | JOB_TYPE_LOAD_RESET,
9 | JOB_TYPE_LOAD_SUCCESS
10 | } from "../constants/jobTypeConstant"
11 |
12 | // load job type reducer
13 | export const loadJobTypeReducer = (state = { jobType: [] }, action) => {
14 | switch (action.type) {
15 | case JOB_TYPE_LOAD_REQUEST:
16 | return { loading: true }
17 | case JOB_TYPE_LOAD_SUCCESS:
18 | return {
19 | loading: false,
20 | jobType: action.payload.jobT
21 | }
22 | case JOB_TYPE_LOAD_FAIL:
23 | return {
24 | loading: false,
25 | error: action.payload
26 | }
27 | case JOB_TYPE_LOAD_RESET:
28 | return {}
29 | default:
30 | return state;
31 | }
32 | }
33 |
34 | // create job type reducer
35 | export const createJobTypeReducer = (state = {}, action) => {
36 | switch (action.type) {
37 | case CREATE_JOB_TYPE_REQUEST:
38 | return { loading: true }
39 | case CREATE_JOB_TYPE_SUCCESS:
40 | return {
41 | loading: false,
42 | jobType: action.payload,
43 | }
44 | case CREATE_JOB_TYPE_FAIL:
45 | return { loading: false, error: action.payload }
46 | case CREATE_JOB_TYPE_RESET:
47 | return {}
48 | default:
49 | return state;
50 | }
51 |
52 | }
--------------------------------------------------------------------------------
/part 10/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | // import routes
13 | const authRoutes = require('./routes/authRoutes');
14 | const userRoutes = require('./routes/userRoutes');
15 | const jobTypeRoute = require('./routes/jobsTypeRoutes');
16 | const jobRoute = require('./routes/jobsRoutes');
17 |
18 | const cookieParser = require("cookie-parser");
19 | const errorHandler = require("./middleware/error");
20 |
21 | //database connection
22 | mongoose.connect(process.env.DATABASE, {
23 | useNewUrlParser: true,
24 | useUnifiedTopology: true,
25 | useCreateIndex: true,
26 | useFindAndModify: false
27 | })
28 | .then(() => console.log("DB connected"))
29 | .catch((err) => console.log(err));
30 |
31 | //MIDDLEWARE
32 | app.use(morgan('dev'));
33 | app.use(bodyParser.json({ limit: "5mb" }));
34 | app.use(bodyParser.urlencoded({
35 | limit: "5mb",
36 | extended: true
37 | }));
38 | app.use(cookieParser());
39 | app.use(cors());
40 |
41 |
42 | //ROUTES MIDDLEWARE
43 | // app.get('/', (req, res) => {
44 | // res.send("Hello from Node Js");
45 | // })
46 | app.use('/api', authRoutes);
47 | app.use('/api', userRoutes);
48 | app.use('/api', jobTypeRoute);
49 | app.use('/api', jobRoute);
50 |
51 | // error middleware
52 | app.use(errorHandler);
53 |
54 | //port
55 | const port = process.env.PORT || 9000
56 |
57 | app.listen(port, () => {
58 | console.log(`Server running on port ${port}`);
59 | });
--------------------------------------------------------------------------------
/part 11/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | // import routes
13 | const authRoutes = require('./routes/authRoutes');
14 | const userRoutes = require('./routes/userRoutes');
15 | const jobTypeRoute = require('./routes/jobsTypeRoutes');
16 | const jobRoute = require('./routes/jobsRoutes');
17 |
18 | const cookieParser = require("cookie-parser");
19 | const errorHandler = require("./middleware/error");
20 |
21 | //database connection
22 | mongoose.connect(process.env.DATABASE, {
23 | useNewUrlParser: true,
24 | useUnifiedTopology: true,
25 | useCreateIndex: true,
26 | useFindAndModify: false
27 | })
28 | .then(() => console.log("DB connected"))
29 | .catch((err) => console.log(err));
30 |
31 | //MIDDLEWARE
32 | app.use(morgan('dev'));
33 | app.use(bodyParser.json({ limit: "5mb" }));
34 | app.use(bodyParser.urlencoded({
35 | limit: "5mb",
36 | extended: true
37 | }));
38 | app.use(cookieParser());
39 | app.use(cors());
40 |
41 |
42 | //ROUTES MIDDLEWARE
43 | // app.get('/', (req, res) => {
44 | // res.send("Hello from Node Js");
45 | // })
46 | app.use('/api', authRoutes);
47 | app.use('/api', userRoutes);
48 | app.use('/api', jobTypeRoute);
49 | app.use('/api', jobRoute);
50 |
51 | // error middleware
52 | app.use(errorHandler);
53 |
54 | //port
55 | const port = process.env.PORT || 9000
56 |
57 | app.listen(port, () => {
58 | console.log(`Server running on port ${port}`);
59 | });
--------------------------------------------------------------------------------
/part 7/backend/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const morgan = require("morgan");
5 | const bodyParser = require("body-parser");
6 | require("dotenv").config();
7 | var cors = require('cors');
8 |
9 |
10 |
11 |
12 | // import routes
13 | const authRoutes = require('./routes/authRoutes');
14 | const userRoutes = require('./routes/userRoutes');
15 | const jobTypeRoute = require('./routes/jobsTypeRoutes');
16 | const jobRoute = require('./routes/jobsRoutes');
17 |
18 | const cookieParser = require("cookie-parser");
19 | const errorHandler = require("./middleware/error");
20 |
21 | //database connection
22 | mongoose.connect(process.env.DATABASE, {
23 | useNewUrlParser: true,
24 | useUnifiedTopology: true,
25 | useCreateIndex: true,
26 | useFindAndModify: false
27 | })
28 | .then(() => console.log("DB connected"))
29 | .catch((err) => console.log(err));
30 |
31 | //MIDDLEWARE
32 | app.use(morgan('dev'));
33 | app.use(bodyParser.json({ limit: "5mb" }));
34 | app.use(bodyParser.urlencoded({
35 | limit: "5mb",
36 | extended: true
37 | }));
38 | app.use(cookieParser());
39 | app.use(cors());
40 |
41 |
42 | //ROUTES MIDDLEWARE
43 | // app.get('/', (req, res) => {
44 | // res.send("Hello from Node Js");
45 | // })
46 | app.use('/api', authRoutes);
47 | app.use('/api', userRoutes);
48 | app.use('/api', jobTypeRoute);
49 | app.use('/api', jobRoute);
50 |
51 | // error middleware
52 | app.use(errorHandler);
53 |
54 | //port
55 | const port = process.env.PORT || 9000
56 |
57 | app.listen(port, () => {
58 | console.log(`Server running on port ${port}`);
59 | });
--------------------------------------------------------------------------------