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 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ Install dependencies with `npm install`, then start the server by running `npm r
## View it live

Every project should be deployed somewhere. Be sure to include the link to the deployed project so that the viewer can click around and see what it's all about.

Render: https://js-project-api-gx01.onrender.com/
49 changes: 49 additions & 0 deletions middleware/authMiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { User } from "../models/user.js";

export const authenticateUser = async (req, res, next) => {
const authHeader = req.header("Authorization")

try {
if(!authHeader) {
return res.status(401).json({
success: false,
message: "Authentication missing or invalid",
logOut: true,
})
}

const user = await User.findOne({
accessToken: authHeader.replace("Bearer ", "")
})

if(user) {
req.user = user
next()
} else {
res.status(401).json({
success: false,
message: "Authentication missing or invalid",
logOut: true,
})
}
} catch (err) {
res.status(500).json({
success: false,
message: "Internal server error",
error: err.message
})
}
}

// Middleware to optionally authenticate user
export const optionalAuthenticate = async (req, res, next) => {
const authHeader = req.headers.authorization

if (authHeader?.startsWith("Bearer ")) {
const token = authHeader.replace("Bearer ", "")
const user = await User.findOne({ accessToken: token })
if (user) req.userId = user._id.toString()
}

next()
}
23 changes: 23 additions & 0 deletions models/message.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import mongoose, { Schema } from "mongoose";

const messageSchema = new mongoose.Schema({
message: {
type: String,
required: true,
},
hearts: Number,
createdAt: {
type: Date,
default: Date.now,
},
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: false, // Allow messages without logged-in users
},
likedByClients: [{
type: String,
}]
})

export const Message = mongoose.model("Message", messageSchema)
24 changes: 24 additions & 0 deletions models/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import mongoose, { Schema } from "mongoose";
import crypto from "crypto";

const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true,
unique: true,
},
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
accessToken: {
type: String,
default: () => crypto.randomBytes(128).toString("hex"),},
})

export const User = mongoose.model("User", UserSchema)
Loading