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
  •  
  •  
  •  
109 changes: 109 additions & 0 deletions BACKEND/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import express from "express";
import mongoose from "mongoose";
import cors from "cors";
import session from "express-session";
import passport from "passport";

import User from "./models/user.js";

const app = express();

// CORS Configuration
app.use(cors({
origin: ["http://localhost:5173", "http://localhost:5174", "http://localhost:5175"],
credentials: true
}));
app.use(express.json());

// Session Config
const sessionOptions = {
secret: process.env.SESSION_SECRET || "mysupersecretkey",
resave: false,
saveUninitialized: false,
};

// Middleware
app.use(session(sessionOptions));
app.use(passport.initialize());
app.use(passport.session());

// Passport Config
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

// Routes
import userRouter from "./routes/user.js"
import noteRouter from "./routes/note.js";

// MongoDB Connection
async function connectDB() {
try {
await mongoose.connect(process.env.MONGO_URI || "mongodb://127.0.0.1:27017/Vibe");
console.log("Connected to MongoDB database");
} catch (error) {
console.error("MongoDB connection failed:", error);
process.exit(1);
}
}

connectDB();

// Demo Route - Only for development
app.get("/demouser", async (req, res) => {
try {
let fakeUser = new User({
email: "bikram@gmail.com",
username: "bikram",
});

let newUser = await User.register(fakeUser, "hellopassword");
res.json({
success: true,
message: "Demo user created",
user: newUser
});
} catch (err) {
res.status(500).json({
success: false,
message: err.message
});
}
});

// API Routes
app.use("/api/auth", userRouter);
app.use("/api/notes", noteRouter);

// Root Route
app.get("/", (req, res) => {
res.json({ message: "Welcome to API" });
});

// Health Check
app.get("/health", (req, res) => {
res.json({ status: "Server is running" });
});

// 404 Handler
app.use((req, res) => {
res.status(404).json({
success: false,
message: "Route not found",
});
});

// Global Error Handler
app.use((err, req, res, next) => {
console.error("Error:", err);
res.status(err.status || 500).json({
success: false,
message: err.message || "Internal Server Error",
});
});

// Start Server
const PORT = process.env.PORT || 8000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
28 changes: 28 additions & 0 deletions BACKEND/models/note.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import mongoose from "mongoose";

const noteSchema = new mongoose.Schema(
{
title: {
type: String,
required: true,
trim: true,
},
note: {
type: String,
required: true,
trim: true,
},
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
},
{
timestamps: true,
}
);

const Note = mongoose.model("Note", noteSchema);

export default Note;
24 changes: 24 additions & 0 deletions BACKEND/models/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import mongoose from "mongoose";
import passportLocalMongoose from "passport-local-mongoose";

const userSchema = new mongoose.Schema({
email: {
type: String,
required: true,
unique: true,
},
username: {
type: String,
required: true,
},
});

const plugin = passportLocalMongoose.default || passportLocalMongoose;

userSchema.plugin(plugin, {
usernameField: "email",
});

const User = mongoose.model("User", userSchema);

export default User;
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.

28 changes: 28 additions & 0 deletions BACKEND/node_modules/.bin/bcrypt.ps1

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

16 changes: 16 additions & 0 deletions BACKEND/node_modules/.bin/nodemon

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/nodemon.cmd

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

28 changes: 28 additions & 0 deletions BACKEND/node_modules/.bin/nodemon.ps1

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

16 changes: 16 additions & 0 deletions BACKEND/node_modules/.bin/nodetouch

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/nodetouch.cmd

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

28 changes: 28 additions & 0 deletions BACKEND/node_modules/.bin/nodetouch.ps1

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

16 changes: 16 additions & 0 deletions BACKEND/node_modules/.bin/semver

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/semver.cmd

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

Loading