From 861fa38812ce044e14f0af119666de2e6555f376 Mon Sep 17 00:00:00 2001 From: Haris Shah Date: Sat, 24 Feb 2024 19:12:39 +0500 Subject: [PATCH] feat: add CRUD routes and controllers for jobs --- apps/api/src/controllers/job_controller.ts | 95 ++++++++++++++++++++-- apps/api/src/routes/job_route.ts | 25 +++++- 2 files changed, 113 insertions(+), 7 deletions(-) diff --git a/apps/api/src/controllers/job_controller.ts b/apps/api/src/controllers/job_controller.ts index 210b348..f768de6 100644 --- a/apps/api/src/controllers/job_controller.ts +++ b/apps/api/src/controllers/job_controller.ts @@ -1,12 +1,14 @@ import { Request, Response } from 'express' import { JOB_SCHEMA } from '../models/job_model' +import { isValidObjectId } from 'mongoose' //* @desc Get all jobs //* route GET /api/jobs -//* @access Public -export async function get_jobs(req: Request, res: Response): Promise { +//? @access Public +export async function get_jobs(_: Request, res: Response): Promise { + // fetch jobs try { - const jobs = await JOB_SCHEMA.find() + const jobs = await JOB_SCHEMA.find({}).sort({ createdAt: -1 }) res.status(200).json({ jobs }) } catch (error) { console.error('Error fetching jobs:', error) @@ -14,14 +16,95 @@ export async function get_jobs(req: Request, res: Response): Promise { } } -//* @desc Post a job +//* @desc Get job +//* route GET /api/jobs/:id +//? @access Public +export async function get_job(req: Request, res: Response): Promise { + const { id } = req.params + //* check if id is valid + if (!isValidObjectId(id)) { + res.status(400).json({ error: 'Invalid id' }) + return + } + //* check if job exists + const job = await JOB_SCHEMA.findById(id) + if (!job) { + res.status(404).json({ error: 'Job not found' }) + return + } + // fetch job + try { + const job = await JOB_SCHEMA.findById(id) + res.status(200).json(job) + } catch (error) { + console.error('Error fetching jobs:', error) + res.status(500).json({ error: 'Internal server error' }) + } +} + +//* @desc Post job //* route POST /api/jobs/job -//* @access Private +//! @access Private export async function post_job(req: Request, res: Response): Promise { + //* post job try { const jobData = req.body const newJob = await JOB_SCHEMA.create(jobData) - res.status(201).json({ message: 'Job posted', newJob }) + res.status(201).json(newJob) + } catch (error) { + console.error('Error fetching jobs:', error) + res.status(500).json({ error: 'Internal server error' }) + } +} + +//* @desc Delete job +//* route DELETE /api/jobs/:id +//! @access Private +export async function delete_job(req: Request, res: Response): Promise { + const { id } = req.params + //* check if id is valid + if (!isValidObjectId(id)) { + res.status(400).json({ error: 'Invalid id' }) + return + } + //* check if job exists + const job = await JOB_SCHEMA.findById(id) + if (!job) { + res.status(404).json({ error: 'Job not found' }) + return + } + //* delete job + try { + const deleted_job = await JOB_SCHEMA.findByIdAndDelete(id) + res.status(200).json(deleted_job) + } catch (error) { + console.error('Error fetching jobs:', error) + res.status(500).json({ error: 'Internal server error' }) + } +} + +//* @desc Update job +//* route PATCH /api/jobs/:id +//! @access Private +export async function update_job(req: Request, res: Response): Promise { + const { id } = req.params + //* check if id is valid + if (!isValidObjectId(id)) { + res.status(400).json({ error: 'Invalid id' }) + return + } + //* check if job exists + const job = await JOB_SCHEMA.findById(id) + if (!job) { + res.status(404).json({ error: 'Job not found' }) + return + } + //* update job + try { + const updated_job = await JOB_SCHEMA.findByIdAndUpdate(id, req.body, { + new: true, + }) + res.status(200).json(updated_job) } catch (error) { console.error('Error fetching jobs:', error) res.status(500).json({ error: 'Internal server error' }) diff --git a/apps/api/src/routes/job_route.ts b/apps/api/src/routes/job_route.ts index 2df82bc..cf9f494 100644 --- a/apps/api/src/routes/job_route.ts +++ b/apps/api/src/routes/job_route.ts @@ -1,9 +1,32 @@ import express from 'express' -import { get_jobs, post_job } from '../controllers/job_controller' +import { + delete_job, + get_job, + get_jobs, + post_job, + update_job, +} from '../controllers/job_controller' const router = express.Router() +//* @desc Get all jobs +//? @access Public router.get('/', get_jobs) + +//* @desc Get job +//? @access Public +router.get('/:id', get_job) + +//* @desc Post job +//! @access Private router.post('/job', post_job) +//* @desc Delete job +//! @access Private +router.delete('/:id', delete_job) + +//* @desc Update job +//! @access Private +router.patch('/:id', update_job) + export default router