Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
8 changes: 8 additions & 0 deletions backend/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
MONGO_URI=mongodb+srv://Adil:Adil123@cluster0.ldkvky8.mongodb.net/DoubtsolvingApp
JWT_SECRET=tutorconnect_secret_key_2026
PORT=3000
CLOUDINARY_CLOUD_NAME=eiituglz
CLOUDINARY_API_KEY=891458726249395


CLOUDINARY_API_SECRET=K-a9Ab_J7VsLeFpwCSO0iUyg5yQ
9 changes: 9 additions & 0 deletions backend/cloudinary.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const cloudinary = require("cloudinary").v2;

cloudinary.config({
cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
api_key: process.env.CLOUDINARY_API_KEY,
api_secret: process.env.CLOUDINARY_API_SECRET,
});

module.exports = cloudinary;
39 changes: 0 additions & 39 deletions backend/db/index.js

This file was deleted.

56 changes: 37 additions & 19 deletions backend/index.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,49 @@
const express = require("express");
const cors = require("cors");
const http = require("http"); // 👈 add this
const mongoose = require("mongoose");
const http = require("http");
const bodyParser = require("body-parser");
require("dotenv").config();

const dns = require("node:dns");

dns.setServers(["8.8.8.8", "1.1.1.1"]);
dns.setDefaultResultOrder("ipv4first");

const app = express();
const server = http.createServer(app); // 👈 create HTTP server from express app
const server = http.createServer(app);

app.use(cors());
app.use(express.json());
app.use(bodyParser.json());
app.use("/api/auth", require("./routes/auth"));
app.use("/api/teacher-courses", require("./routes/teacherCourses"));
app.use("/api/courses", require("./routes/courses"));
app.use("/api/student", require("./routes/student"));
app.use("/api/orders", require("./routes/orders"));
// app.use("/api/doubts", require("./routes/doubts"));
app.use("/api/support", require("./routes/support"));
// app.use("/api/admin", require("./routes/admin"));
// app.use("/api/tutor", require("./routes/tutor"));
// app.use("/api/user", require("./routes/user"));
app.use("/api/exam", require("./routes/exam"));
app.use("/api/result", require("./routes/result"));

const adminRouter = require("./routes/admin");
const userRouter = require("./routes/user");
const doubtsRouter = require("./routes/doubts");
const tutorRouter = require("./routes/tutor");
const courseRouter = require('./routes/courses');

app.use("/admin", adminRouter);
app.use("/user", userRouter);
app.use("/doubts", doubtsRouter);
app.use("/tutor", tutorRouter);
app.use("/courses", courseRouter);

// 👇 pass the server to your WebSocket setup
require('./server')(server);

const port = process.env.PORT || 3000;
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});
mongoose
.connect(process.env.MONGO_URI, {
serverSelectionTimeoutMS: 10000,
family: 4,
})
.then(() => {
console.log("✅ Connected to MongoDB successfully!");

server.listen(process.env.PORT || 3000, () => {
console.log(`🚀 Server running on port ${process.env.PORT || 3000}`);
});
})
.catch((err) => {
console.error("❌ MongoDB connection error:");
console.error(err);
});
29 changes: 29 additions & 0 deletions backend/models/Courses.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const mongoose = require("mongoose");

const noteSchema = new mongoose.Schema({
title: { type: String },
fileUrl: { type: String },
}, { _id: false });

const lectureSchema = new mongoose.Schema({
title: { type: String },
videoUrl: { type: String },
notes: [noteSchema], // <-- notes now live under their lecture
}, { _id: false });

const courseSchema = new mongoose.Schema({
title: { type: String, required: true },
subject: { type: String, required: true },
description: { type: String },
price: { type: Number, required: true },
tutor: { type: String, required: true },
tutorId: { type: mongoose.Schema.Types.ObjectId, ref: "Teacher" },
thumbnailUrl: { type: String },
lectures: [lectureSchema],
rating: { type: Number, default: 0 },
students: { type: Number, default: 0 },
color: { type: String, default: "#4FB88A" },
createdAt: { type: Date, default: Date.now },
});

module.exports = mongoose.model("Course", courseSchema);
8 changes: 8 additions & 0 deletions backend/models/Doubts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const mongoose=require("mongoose");
const doubtSchema=new mongoose.Schema({
title:String,
description:String,
image:String
})
const Doubts=mongoose.model("Doubts",doubtSchema);
module.exports={Doubts};
19 changes: 19 additions & 0 deletions backend/models/Exam.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const mongoose = require("mongoose");

const questionSchema = new mongoose.Schema({
question: { type: String },
options: [String],
answer: { type: String }
}, { _id: false });

const examSchema = new mongoose.Schema({
name: { type: String, required: true },
subject: { type: String },
type: { type: String, default: "normal" }, // "normal" or "proctored"
duration: { type: Number },
color: { type: String },
questions: [questionSchema],
createdAt: { type: Date, default: Date.now }
});

module.exports = mongoose.model("Exam", examSchema);
32 changes: 32 additions & 0 deletions backend/models/Order.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
const mongoose = require("mongoose");

const orderSchema = new mongoose.Schema({
student: {
type: mongoose.Schema.Types.ObjectId,
ref: "Student",
required: true,
},

course: {
type: mongoose.Schema.Types.ObjectId,
ref: "Course",
required: true,
},

amount: {
type: Number,
required: true,
},

paymentStatus: {
type: String,
default: "Completed",
},

purchasedAt: {
type: Date,
default: Date.now,
},
});

module.exports = mongoose.model("Order", orderSchema);
22 changes: 22 additions & 0 deletions backend/models/Result.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const mongoose = require("mongoose");

const violationSchema = new mongoose.Schema({
type: { type: String },
time: { type: String },
deduction: { type: Number }
}, { _id: false });

const resultSchema = new mongoose.Schema({
examId: { type: String },
examName: { type: String },
studentUsername: { type: String },
examScore: { type: Number },
integrityScore: { type: Number },
finalScore: { type: Number },
totalMarks: { type: Number },
examType: { type: String },
violations: [violationSchema],
submittedAt: { type: Date, default: Date.now }
});

module.exports = mongoose.model("Result", resultSchema);
46 changes: 46 additions & 0 deletions backend/models/Student.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
const mongoose = require("mongoose");

const enrolledCourseSchema = new mongoose.Schema({
course: {
type: mongoose.Schema.Types.ObjectId,
ref: "Course",
},

progress: {
type: Number,
default: 0,
},

completedLectures: [
{
type: Number,
},
],

enrolledAt: {
type: Date,
default: Date.now,
},
});

const studentSchema = new mongoose.Schema({
firstName: { type: String, required: true },
lastName: { type: String, required: true },
email: { type: String, required: true, unique: true },
phone: { type: String },
dob: { type: String },
gender: { type: String },
grade: { type: String },
board: { type: String },
school: { type: String },
city: { type: String },
state: { type: String },
password: { type: String, required: true },
role: { type: String, default: "student" },

enrolledCourses: [enrolledCourseSchema],

createdAt: { type: Date, default: Date.now },
});

module.exports = mongoose.model("Student", studentSchema);
24 changes: 24 additions & 0 deletions backend/models/SupportRequest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const mongoose = require("mongoose");

const supportRequestSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true },
phone: { type: String, required: true },
role: {
type: String,
enum: ["student", "teacher"],
required: true,
},
reason: { type: String, required: true },
description: { type: String, required: true },
status: {
type: String,
default: "Pending",
},
createdAt: {
type: Date,
default: Date.now,
},
});

module.exports = mongoose.model("SupportRequest", supportRequestSchema);
29 changes: 29 additions & 0 deletions backend/models/Teacher.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const mongoose = require("mongoose");

const teacherSchema = new mongoose.Schema({
firstName: { type: String, required: true },
lastName: { type: String, required: true },
email: { type: String, required: true, unique: true },
phone: { type: String },
dob: { type: String },
gender: { type: String },
city: { type: String },
state: { type: String },
qualification: { type: String },
subject: { type: String },
experience: { type: String },
bio: { type: String },
accountName: { type: String },
accountNumber: { type: String },
ifsc: { type: String },
upi: { type: String },
aadharUrl: { type: String },
resumeUrl: { type: String },
marksheetUrl: { type: String },
password: { type: String, required: true },
role: { type: String, default: "teacher" },
isVerified: { type: Boolean, default: false },
createdAt: { type: Date, default: Date.now },
});

module.exports = mongoose.model("Teacher", teacherSchema);
16 changes: 16 additions & 0 deletions backend/node_modules/.bin/bcrypt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions backend/node_modules/.bin/bcrypt.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading