diff --git a/app.js b/app.js index 52cf441..6ee566b 100644 --- a/app.js +++ b/app.js @@ -1,36 +1,36 @@ - import dotenv from "dotenv"; -import express from 'express' +import express from "express"; const app = express(); import bodyParser from "body-parser"; -import fileUpload from "express-fileupload"// important pkg for file upload -import cors from 'cors' -import cookieParser from "cookie-parser" +import fileUpload from "express-fileupload"; // important pkg for file upload +import cors from "cors"; +import cookieParser from "cookie-parser"; // app.use(express.json({ limit: "50mb" })); // app.use(express.urlencoded({ extended: true, limit: "50mb" })); app.use(cookieParser()); - //handdle cores -app.use(cors()) -app.use(express.json()) +app.use(cors()); +app.use(express.json()); app.use(bodyParser.urlencoded({ extended: true })); -app.use(fileUpload({ - useTempFiles: true -})); +app.use( + fileUpload({ + useTempFiles: true, + }) +); //auth -import user from "./resources/user/userRoute.js" +import user from "./resources/user/userRoute.js"; import ProductRouter from "./resources/Products/ProductRoute.js"; //Businesses import BusinessRoute from "./resources/Businesses/BusinessRoute.js"; -import orderRoute from './resources/Orders/orderRoute.js'; +import orderRoute from "./resources/Orders/orderRoute.js"; import DepartureRouter from "./resources/Departure/DepartureRoute.js"; import InformationRoute from "./resources/Informations/InformationRoute.js"; import Testimonial from "./resources/Testimonials/TestimonialRoute.js"; -import ContactRequest from "./resources/ContactRequests/ContactRequestRoute.js" +import ContactRequest from "./resources/ContactRequests/ContactRequestRoute.js"; import StateRouter from "./resources/setting/state/state_routes.js"; // @@ -43,6 +43,11 @@ import Business_TypeRoute from "./resources/setting/Business_Type/Business_route import ConfigRouter from "./resources/setting/Configration/Config_routes.js"; import TaxRouter from "./resources/Tax/tax_routes.js"; +//specialties +import SpecialtiesRouter from "./resources/Specialties/SpecialtiesRoute.js"; +//specialist +import SpecialistRouter from "./resources/Specialist/SpecialistRoute.js"; + app.use("/api/v1/", user); //Product @@ -70,6 +75,10 @@ app.use("/api/business", Business_TypeRoute); //Tax app.use("/api/tax", TaxRouter); //config -app.use("/api/config", ConfigRouter) +app.use("/api/config", ConfigRouter); +//config specialty +app.use("/api/config/specialty", SpecialtiesRouter); +//specialties +app.use("/api/specialist", SpecialistRouter); -export default app; \ No newline at end of file +export default app; diff --git a/resources/Specialist/SpecialistController.js b/resources/Specialist/SpecialistController.js new file mode 100644 index 0000000..3652209 --- /dev/null +++ b/resources/Specialist/SpecialistController.js @@ -0,0 +1,101 @@ +import catchAsyncErrors from "../../middlewares/catchAsyncErrors.js"; +import { Specialist } from "./SpecialistModel.js"; + +// create a new specialist +// POST /api/specialist +export const createSpecialist = async (req, res, next) => { + try { + const specialist = await Specialist.create(req.body); + res.status(201).json({ + success: true, + specialist, + }); + } catch (error) { + res.status(400).json({ + success: false, + message: error.message, + }); + } +}; + +// get all specialists +// GET /api/specialist +export const getAllSpecialist = catchAsyncErrors(async (req, res, next) => { + const specialist = await Specialist.find(); + + res.status(200).json({ + success: true, + specialist, + }); +}); + +// get a single specialist +// GET /api/specialist/:id +export const getSingleSpecialist = catchAsyncErrors(async (req, res, next) => { + const specialist = await Specialist.findById(req.params.id); + + if (!specialist) { + return res.status(404).json({ + success: false, + message: "Specialist not found", + }); + } + + res.status(200).json({ + success: true, + specialist, + }); +}); + +// update a single specialist +// PUT /api/specialist/:id +export const updateSpecialist = async (req, res, next) => { + try { + const { id } = req.params; + const update = req.body; + const options = { new: true }; + + const updatedSpecialist = await Specialist.findByIdAndUpdate( + id, + update, + options + ); + + if (!updatedSpecialist) { + return res.status(404).json({ + success: false, + message: "Specialist not found", + }); + } + + res.status(200).json({ + success: true, + updatedSpecialist, + }); + } catch (error) { + res.status(500).json({ + success: false, + message: error.message, + }); + } +}; + +// delete a single specialist +// DELETE /api/specialist/:id +export const deleteSpecialist = catchAsyncErrors(async (req, res, next) => { + const specialist = await Specialist.findById(req.params.id); + + if (!specialist) { + return res.status(404).json({ + success: false, + message: "Specialist not found", + }); + } + + await specialist.remove(); + + res.status(200).json({ + success: true, + message: "Specialist deleted successfully", + }); +}); diff --git a/resources/Specialist/SpecialistModel.js b/resources/Specialist/SpecialistModel.js new file mode 100644 index 0000000..577a4b2 --- /dev/null +++ b/resources/Specialist/SpecialistModel.js @@ -0,0 +1,68 @@ +import { mongoose } from "mongoose"; + +// specialistName: "", +// specialty: "", +// location: "", +// daysAvailable: daysAvailable, +// phone: "", + +const daysAvailableSchema = new mongoose.Schema({ + label: { + type: String, + required: true, + enum: [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", + ], + }, + available: { + type: Boolean, + required: true, + default: false, + }, + timeSlots: [ + { + startTime: String, + endTime: String, + }, + ], +}); + +const specialistSchema = new mongoose.Schema({ + specialistName: { + type: String, + required: [true, "Please enter specialist name"], + trim: true, + maxlength: [100, "Specialist name cannot exceed 100 characters"], + }, + specialty: { + type: String, + required: [true, "Please enter specialty name"], + trim: true, + maxlength: [100, "Specialty name cannot exceed 100 characters"], + }, + location: { + type: String, + trim: true, + maxlength: [100, "Location cannot exceed 100 characters"], + }, + daysAvailable: { + type: [daysAvailableSchema], + }, + phone: { + type: String, + trim: true, + maxlength: [100, "Phone number cannot exceed 100 characters"], + }, + createdAt: { + type: Date, + default: Date.now, + }, +}); + +export const Specialist = mongoose.model("Specialist", specialistSchema); diff --git a/resources/Specialist/SpecialistRoute.js b/resources/Specialist/SpecialistRoute.js new file mode 100644 index 0000000..27a32d9 --- /dev/null +++ b/resources/Specialist/SpecialistRoute.js @@ -0,0 +1,23 @@ +import { Router } from "express"; +import { + isAuthenticatedUser, + authorizeRoles, + isBusinessAuthenticated, +} from "../../middlewares/auth.js"; +import { + createSpecialist, + deleteSpecialist, + getAllSpecialist, + getSingleSpecialist, + updateSpecialist, +} from "./SpecialistController.js"; + +const router = Router(); + +router.route("/add").post(createSpecialist); +router.route("/getall").get(getAllSpecialist); +router.route("/get/:id").get(getSingleSpecialist); +router.route("/delete/:id").delete(deleteSpecialist); +router.route("/update/:id").patch(updateSpecialist); + +export default router; diff --git a/resources/Specialties/SpecialtiesController.js b/resources/Specialties/SpecialtiesController.js new file mode 100644 index 0000000..0d473f1 --- /dev/null +++ b/resources/Specialties/SpecialtiesController.js @@ -0,0 +1,68 @@ +import catchAsyncErrors from "../../middlewares/catchAsyncErrors.js"; +import { Specialty } from "./SpecialtiesModel.js"; + +// add a new specialty +// POST /api/specialty/add +export const createSpecialty = async (req, res, next) => { + try { + const specialty = await Specialty.create(req.body); + res.status(201).json({ + success: true, + specialty, + }); + } catch (error) { + res.status(400).json({ + success: false, + message: error.message, + }); + } +}; + +// get all specialties +// GET /api/specialty +export const getAllSpecialty = catchAsyncErrors(async (req, res, next) => { + const specialty = await Specialty.find(); + + res.status(200).json({ + success: true, + specialty, + }); +}); + +// get a single specialty +// GET /api/specialty/:id +export const getSingleSpecialty = catchAsyncErrors(async (req, res, next) => { + const specialty = await Specialty.findById(req.params.id); + + if (!specialty) { + return res.status(404).json({ + success: false, + message: "Specialty not found", + }); + } + + res.status(200).json({ + success: true, + specialty, + }); +}); + +// delete a single specialty +// DELETE /api/specialty/:id +export const deleteSpecialty = catchAsyncErrors(async (req, res, next) => { + const specialty = await Specialty.findById(req.params.id); + + if (!specialty) { + return res.status(404).json({ + success: false, + message: "Specialty not found", + }); + } + + await specialty.remove(); + + res.status(200).json({ + success: true, + message: "Specialty deleted", + }); +}); diff --git a/resources/Specialties/SpecialtiesModel.js b/resources/Specialties/SpecialtiesModel.js new file mode 100644 index 0000000..9dacbe2 --- /dev/null +++ b/resources/Specialties/SpecialtiesModel.js @@ -0,0 +1,16 @@ +import { mongoose } from "mongoose"; + +const specialtySchema = new mongoose.Schema({ + name: { + type: String, + required: [true, "Please enter specialty name"], + trim: true, + maxlength: [100, "Specialty name cannot exceed 100 characters"], + }, + createdAt: { + type: Date, + default: Date.now, + }, +}); + +export const Specialty = mongoose.model("Specialty", specialtySchema); diff --git a/resources/Specialties/SpecialtiesRoute.js b/resources/Specialties/SpecialtiesRoute.js new file mode 100644 index 0000000..8aefb26 --- /dev/null +++ b/resources/Specialties/SpecialtiesRoute.js @@ -0,0 +1,21 @@ +import { Router } from "express"; +import { + isAuthenticatedUser, + authorizeRoles, + isBusinessAuthenticated, +} from "../../middlewares/auth.js"; +import { + createSpecialty, + deleteSpecialty, + getAllSpecialty, + getSingleSpecialty, +} from "./SpecialtiesController.js"; + +const router = Router(); + +router.route("/add").post(createSpecialty); +router.route("/getall").get(getAllSpecialty); +router.route("/get/:id").get(getSingleSpecialty); +router.route("/delete/:id").delete(deleteSpecialty); + +export default router;