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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,504 changes: 2,504 additions & 0 deletions backend/package-lock.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,16 @@
},
"type": "module",
"dependencies": {
"axios": "^1.7.9",
"bcrypt": "^5.1.1",
"cloudinary": "^2.5.1",
"cookie-parser": "^1.4.7",
"cors": "^2.8.5",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"jsonwebtoken": "^9.0.2",
"mongoose": "^8.9.5",
"mongodb": "^6.13.0",
"mongoose": "^8.9.6",
"mongoose-aggregate-paginate-v2": "^1.1.3",
"multer": "^1.4.5-lts.1"
},
Expand Down
Binary file added backend/public/temp/output-Photoroom.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added backend/public/temp/output.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 12 additions & 1 deletion backend/src/app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import express from "express";
import cors from "cors";
import cookieParser from "cookie-parser";

import axios from "axios";
const app = express();

app.use(
Expand Down Expand Up @@ -30,4 +30,15 @@ app.use("/users", userRouter);
app.use("/assignments", assignmentRouter);
app.use("/tasks", taskRouter);

app.get('/quote', async (req, res) => {
try {
// Ensure you are hitting the correct API URL
const response = await axios.get("https://zenquotes.io/api/random");
res.json(response.data);
} catch (error) {
console.error("Error fetching quote from ZenQuotes API:", error);
res.status(500).json({ error: "Failed to fetch quote from ZenQuotes" });
}
});

export { app };
7 changes: 5 additions & 2 deletions backend/src/controllers/assignment.controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { ApiError } from "../utils/ApiError.js";
import { ApiResponse } from "../utils/ApiResponse.js";
import { asyncHandler } from "../utils/asyncHandler.js";
import { uploadToCloud } from "../utils/cloudinary.js";

import mongoose from "mongoose";
import cloudinary from "cloudinary";
const createAssignment = asyncHandler(async (req, res) => {
const { title, description, due_date } = req.body;

Expand Down Expand Up @@ -31,6 +32,8 @@ const createAssignment = asyncHandler(async (req, res) => {
user: req.user._id,
});



const assignmentFromDB = await Assignment.findById(assignment._id);

if (!assignmentFromDB) {
Expand Down Expand Up @@ -63,7 +66,7 @@ const updateAssignment = asyncHandler(async (req, res) => {
const { title, description, due_date } = req.body;

// Validate ObjectId
if (!isValidObjectId(assignmentId)) {
if (!mongoose.Types.ObjectId.isValid(assignmentId)) {
throw new ApiError(400, "Invalid Assignment ID");
}

Expand Down
93 changes: 93 additions & 0 deletions backend/src/controllers/message.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { User } from "../models/user.models.js";
import Message from "../models/message.models.js";
import { ApiError } from "../utils/ApiError.js";
import { ApiResponse } from "../utils/ApiResponse.js";
import { asyncHandler } from "../utils/asyncHandler.js";
import { uploadToCloud } from "../utils/cloudinary.js";

const getUsers = asyncHandler(async (req, res) => {
try {
const loggedUserId = req.user._id;

// Get all users except the logged in user
const filteredUsers = await User.find({
_id: { $ne: loggedUserId },
}).select("-password");

if (!filteredUsers) {
return res.status(404).json(new ApiResponse(404, null, "No users found"));
}

return res
.status(200)
.json(new ApiResponse(200, filteredUsers, "Users fetched"));
} catch (error) {
console.error("Error in getUsersForSidebar: ", error.message);
throw new ApiError(500, "Something went wrong while fetching users");
}
});

const getMessages = asyncHandler(async (req, res) => {
try {
const loggedUserId = req.user._id;
const receiverId = req.params.id;

// Fetching messages
const messages = await Message.find({
$or: [
{ sender: loggedUserId, receiver: receiverId },
{ sender: receiverId, receiver: loggedUserId },
],
}).sort({ createdAt: 1 });

if (!messages) {
return res
.status(404)
.json(new ApiResponse(404, null, "No messages found"));
}

return res
.status(200)
.json(new ApiResponse(200, messages, "Messages fetched"));
} catch (error) {
console.error("Error in getMessages: ", error.message);
throw new ApiError(500, "Something went wrong while fetching messages");
}
});

const sendMessage = asyncHandler(async (req, res) => {
try {
const loggedUserId = req.user._id;
const receiverId = req.params.id;
const { text } = req.body;

let doc = null;
const file = req.file;
if (file) {
const localPath = file.path;
doc = await uploadToCloud(localPath);

if (!doc) {
throw new ApiError(400, "File couldn't be saved");
}
}

const message = await Message.create({
sender: loggedUserId,
receiver: receiverId,
text,
doc: doc ? doc.url : null,
});

if (!message) {
throw new ApiError(400, "Message couldn't be saved");
}

return res.status(201).json(new ApiResponse(201, message, "Message sent"));
} catch (error) {
console.error("Error in sendMessage: ", error.message);
throw new ApiError(500, "Something went wrong while sending message");
}
});

export { getUsers, getMessages, sendMessage };
3 changes: 2 additions & 1 deletion backend/src/controllers/task.controller.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import mongoose from "mongoose";
import { Task } from "../models/task.models.js";
import { ApiError } from "../utils/ApiError.js";
import { ApiResponse } from "../utils/ApiResponse.js";
Expand Down Expand Up @@ -47,7 +48,7 @@ const updateTask = asyncHandler(async (req, res) => {
const { title, description, due_date } = req.body;

// Validate ObjectId
if (!isValidObjectId(taskId)) {
if (!mongoose.Types.ObjectId.isValid(taskId)) {
throw new ApiError(400, "Invalid Task ID");
}

Expand Down
27 changes: 27 additions & 0 deletions backend/src/models/message.models.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import mongoose, { Schema } from "mongoose";

const messageSchema = new Schema(
{
senderId: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
receiverId: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
text: {
type: String,
},
image: {
type: String, //URL 😏
},
},
{ timestamps: true }
);

const Message = mongoose.model("Message", messageSchema);

export default Message;
2 changes: 1 addition & 1 deletion backend/src/routes/assignment.routes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Router } from "express";
import { verifyJWT } from "../middlewares/auth.middleware";
import {verifyJWT} from "../middlewares/auth.middleware.js";
import { upload } from "../middlewares/multer.middleware.js";
import {
createAssignment,
Expand Down
17 changes: 17 additions & 0 deletions backend/src/routes/message.routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Router } from "express";
import { verifyJWT } from "../middlewares/auth.middleware.js";
import {
getUsers,
getMessages,
sendMessage,
} from "../controllers/message.controller.js";
import { upload } from "../middlewares/multer.middleware.js";

const router = Router();

router.get("/users", verifyJWT, getUsers);
router.get("/:id", verifyJWT, getMessages);

router.post("/send/:id", verifyJWT, upload.single("img"), sendMessage);

export default router;
2 changes: 1 addition & 1 deletion backend/src/routes/task.routes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Router } from "express";
import { verifyJWT } from "../middlewares/auth.middleware";
import { verifyJWT } from "../middlewares/auth.middleware.js";
import {
createTask,
getUserTasks,
Expand Down
Loading