feat : add academics api
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Inquiry" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"fullName" TEXT NOT NULL,
|
||||||
|
"number" TEXT NOT NULL,
|
||||||
|
"emailId" TEXT,
|
||||||
|
"subject" TEXT,
|
||||||
|
"message" TEXT,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "Inquiry_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "AcademicsResearch" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"fullName" TEXT NOT NULL,
|
||||||
|
"number" TEXT NOT NULL,
|
||||||
|
"emailId" TEXT,
|
||||||
|
"subject" TEXT,
|
||||||
|
"courseName" TEXT,
|
||||||
|
"message" TEXT,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "AcademicsResearch_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
@@ -147,3 +147,30 @@ model Appointment {
|
|||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model Inquiry {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
|
||||||
|
fullName String
|
||||||
|
number String
|
||||||
|
emailId String?
|
||||||
|
subject String?
|
||||||
|
message String?
|
||||||
|
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
model AcademicsResearch {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
|
||||||
|
fullName String
|
||||||
|
number String
|
||||||
|
emailId String?
|
||||||
|
subject String?
|
||||||
|
courseName String?
|
||||||
|
message String?
|
||||||
|
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
}
|
||||||
@@ -10,6 +10,8 @@ import doctorRoutes from "./routes/doctor.routes.js";
|
|||||||
import careerRoutes from "./routes/career.routes.js";
|
import careerRoutes from "./routes/career.routes.js";
|
||||||
import candidateRoutes from "./routes/candidate.routes.js";
|
import candidateRoutes from "./routes/candidate.routes.js";
|
||||||
import appointmentRoutes from "./routes/appointment.routes.js";
|
import appointmentRoutes from "./routes/appointment.routes.js";
|
||||||
|
import inquiryRoutes from "./routes/inquiry.routes.js";
|
||||||
|
import academicsResearchRoutes from "./routes/academicsResearch.routes.js";
|
||||||
|
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
@@ -43,6 +45,8 @@ app.use("/api/doctors", doctorRoutes);
|
|||||||
app.use("/api/careers", careerRoutes);
|
app.use("/api/careers", careerRoutes);
|
||||||
app.use("/api/candidates", candidateRoutes);
|
app.use("/api/candidates", candidateRoutes);
|
||||||
app.use("/api/appointments", appointmentRoutes);
|
app.use("/api/appointments", appointmentRoutes);
|
||||||
|
app.use("/api/inquiry", inquiryRoutes);
|
||||||
|
app.use("/api/academics", academicsResearchRoutes);
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000;
|
const PORT = process.env.PORT || 3000;
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
|
|||||||
117
backend/src/controllers/academicsResearch.controller.js
Normal file
117
backend/src/controllers/academicsResearch.controller.js
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
import prisma from "../prisma/client.js";
|
||||||
|
|
||||||
|
// CREATE ACADEMICS & RESEARCH
|
||||||
|
|
||||||
|
export const createAcademicsResearch = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const {fullName, number, emailId, subject, courseName, message} = req.body;
|
||||||
|
|
||||||
|
if (!fullName || !number) {
|
||||||
|
return res.status(400).json({
|
||||||
|
success: false,
|
||||||
|
message: "Full name and number are required",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await prisma.academicsResearch.create({
|
||||||
|
data: {
|
||||||
|
fullName,
|
||||||
|
number,
|
||||||
|
emailId,
|
||||||
|
subject,
|
||||||
|
courseName,
|
||||||
|
message,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(200).json({
|
||||||
|
success: true,
|
||||||
|
status: 200,
|
||||||
|
data,
|
||||||
|
message: "Academics & Research added successfully",
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to add Academics & Research inquiry",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// GET ALL
|
||||||
|
|
||||||
|
export const getAcademicsResearch = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const data = await prisma.academicsResearch.findMany({
|
||||||
|
orderBy: {
|
||||||
|
createdAt: "desc",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to fetch records",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// GET SINGLE
|
||||||
|
|
||||||
|
export const getSingleAcademicsResearch = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const {id} = req.params;
|
||||||
|
|
||||||
|
const data = await prisma.academicsResearch.findUnique({
|
||||||
|
where: {
|
||||||
|
id: Number(id),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return res.status(404).json({
|
||||||
|
success: false,
|
||||||
|
message: "Record not found",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to fetch record",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// DELETE
|
||||||
|
|
||||||
|
export const deleteAcademicsResearch = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const {id} = req.params;
|
||||||
|
|
||||||
|
await prisma.academicsResearch.delete({
|
||||||
|
where: {
|
||||||
|
id: Number(id),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
message: "Record deleted successfully",
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to delete record",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
108
backend/src/controllers/inquiry.controller.js
Normal file
108
backend/src/controllers/inquiry.controller.js
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
import prisma from "../prisma/client.js";
|
||||||
|
|
||||||
|
/* CREATE INQUIRY */
|
||||||
|
export const createInquiry = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const {fullName, number, emailId, subject, message} = req.body;
|
||||||
|
|
||||||
|
if (!fullName || !number) {
|
||||||
|
return res.status(400).json({
|
||||||
|
success: false,
|
||||||
|
message: "Full name and number are required",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const inquiry = await prisma.inquiry.create({
|
||||||
|
data: {
|
||||||
|
fullName,
|
||||||
|
number,
|
||||||
|
emailId,
|
||||||
|
subject,
|
||||||
|
message,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(200).json({
|
||||||
|
success: true,
|
||||||
|
status: 200,
|
||||||
|
data: inquiry,
|
||||||
|
message: "Inquiry added successfully",
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to add inquiry",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* GET ALL */
|
||||||
|
export const getInquiries = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const inquiries = await prisma.inquiry.findMany({
|
||||||
|
orderBy: {
|
||||||
|
createdAt: "desc",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
data: inquiries,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to fetch inquiries",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* GET SINGLE */
|
||||||
|
export const getInquiry = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const {id} = req.params;
|
||||||
|
|
||||||
|
const inquiry = await prisma.inquiry.findUnique({
|
||||||
|
where: {id: Number(id)},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!inquiry) {
|
||||||
|
return res.status(404).json({
|
||||||
|
success: false,
|
||||||
|
message: "Inquiry not found",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
data: inquiry,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to fetch inquiry",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* DELETE */
|
||||||
|
export const deleteInquiry = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const {id} = req.params;
|
||||||
|
|
||||||
|
await prisma.inquiry.delete({
|
||||||
|
where: {id: Number(id)},
|
||||||
|
});
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
message: "Inquiry deleted successfully",
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "Failed to delete inquiry",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
18
backend/src/routes/academicsResearch.routes.js
Normal file
18
backend/src/routes/academicsResearch.routes.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import express from "express";
|
||||||
|
import {
|
||||||
|
createAcademicsResearch,
|
||||||
|
getAcademicsResearch,
|
||||||
|
getSingleAcademicsResearch,
|
||||||
|
deleteAcademicsResearch,
|
||||||
|
} from "../controllers/academicsResearch.controller.js";
|
||||||
|
|
||||||
|
import jwtAuthMiddleware from "../middleware/auth.js";
|
||||||
|
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.post("/", createAcademicsResearch);
|
||||||
|
router.get("/getAll", getAcademicsResearch);
|
||||||
|
router.get("/:id", getSingleAcademicsResearch);
|
||||||
|
router.delete("/:id", jwtAuthMiddleware, deleteAcademicsResearch);
|
||||||
|
|
||||||
|
export default router;
|
||||||
19
backend/src/routes/inquiry.routes.js
Normal file
19
backend/src/routes/inquiry.routes.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import express from "express";
|
||||||
|
import {
|
||||||
|
createInquiry,
|
||||||
|
getInquiries,
|
||||||
|
getInquiry,
|
||||||
|
deleteInquiry,
|
||||||
|
} from "../controllers/inquiry.controller.js";
|
||||||
|
|
||||||
|
import jwtAuthMiddleware from "../middleware/auth.js";
|
||||||
|
|
||||||
|
const router = express.Router();
|
||||||
|
|
||||||
|
router.post("/", createInquiry);
|
||||||
|
|
||||||
|
router.get("/getAll", getInquiries);
|
||||||
|
router.get("/:id", getInquiry);
|
||||||
|
router.delete("/:id", jwtAuthMiddleware, deleteInquiry);
|
||||||
|
|
||||||
|
export default router;
|
||||||
18806
frontend/package-lock.json
generated
18806
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user