Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
adf823f
setting up, expanding dataset, started creating endpoints
mimmi-eriksson May 28, 2025
7e877ce
added popular endpoint to get most liked messages
mimmi-eriksson May 28, 2025
3a1fb77
added sorting option on hearts
mimmi-eriksson May 30, 2025
b9307a1
added sorting option on createdAt and recent thoughts endpoint
mimmi-eriksson May 30, 2025
9b3a5d6
setting up database connection, created model for data and seeded dat…
mimmi-eriksson Jun 3, 2025
019eea9
updated endpoints thoughts and popular to use mongoose
mimmi-eriksson Jun 3, 2025
53f5cd9
updated recent endpoint and endpoint to get one thougth by id
mimmi-eriksson Jun 4, 2025
8a8e4c4
added endpoints to post, delete, edit and like thoughts
mimmi-eriksson Jun 4, 2025
a32d255
changed like endpoint to patch instead of post
mimmi-eriksson Jun 4, 2025
c0cd6b8
changed date.now
mimmi-eriksson Jun 9, 2025
f1c040e
added total count of thoughts for a query in the response, to be able…
mimmi-eriksson Jun 10, 2025
e1709d7
added user model and routes, and refractoring
mimmi-eriksson Jun 12, 2025
d64dcd1
added validation for user input in register and login routes
mimmi-eriksson Jun 13, 2025
9a68ef3
small code fix
mimmi-eriksson Jun 13, 2025
1f5a230
fixing error with deleting and editing thoughts
mimmi-eriksson Jun 13, 2025
6ca313f
added user to messages
mimmi-eriksson Jun 13, 2025
aa46d47
fixed error in delete and edit functions
mimmi-eriksson Jun 16, 2025
d455623
changing error message
mimmi-eriksson Jun 16, 2025
0222af5
added endpoint to get all thoughts by a specific user
mimmi-eriksson Jun 16, 2025
d74d522
added a like model to track a users liked messages and endpoint to fe…
mimmi-eriksson Jun 16, 2025
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
488 changes: 428 additions & 60 deletions data.json

Large diffs are not rendered by default.

45 changes: 45 additions & 0 deletions middleware/authMiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { User } from "../models/User.js"

export const authenticateUser = async (req, res, next) => {
try {
const accessToken = req.header("Authorization")
const user = await User.findOne({ accessToken: accessToken })
if (user) {
req.user = user
next()
} else {
res.status(401).json({
message: "Authentication missing or invalid.",
loggedOut: true
})
}
} catch (error) {
res.status(500).json({
message: "Internal server error",
error: error.message
});
}
}

export const authenticateUserOptional = async (req, res, next) => {
try {
const accessToken = req.header("Authorization")
if (accessToken) {
const user = await User.findOne({ accessToken: accessToken })
if (user) {
req.user = user
} else {
return res.status(401).json({
message: "Authentication missing or invalid.",
loggedOut: true
})
}
}
next()
} catch (error) {
res.status(500).json({
message: "Internal server error",
error: error.message
})
}
}
23 changes: 23 additions & 0 deletions models/Like.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import mongoose from "mongoose"

const likeSchema = new mongoose.Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true
},
thought: {
type: mongoose.Schema.Types.ObjectId,
ref: "Thought",
required: true
},
createdAt: {
type: Date,
default: Date.now
}
})

// Ensure that a user can only like a thought once
likeSchema.index({ user: 1, thought: 1 }, { unique: true })

export const Like = mongoose.model("Like", likeSchema)
32 changes: 32 additions & 0 deletions models/Thought.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import mongoose from "mongoose"

const thoughtSchema = new mongoose.Schema({
message: {
type: String,
required: true,
minLength: 5,
maxLength: 140
},
hearts: {
type: Number,
default: 0,
min: 0
},
tags: {
type: [String],
required: true,
lowercase: true,
enum: ["travel", "food", "family", "friends", "humor", "nature", "wellness", "home", "entertainment", "work", "other"],
default: "other"
},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
createdAt: {
type: Date,
default: Date.now
}
})

export const Thought = mongoose.model("Thought", thoughtSchema)
20 changes: 20 additions & 0 deletions models/User.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import mongoose from "mongoose"
import crypto from "crypto"

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

export const User = mongoose.model("User", userSchema)
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@
"@babel/core": "^7.17.9",
"@babel/node": "^7.16.8",
"@babel/preset-env": "^7.16.11",
"bcrypt-nodejs": "^0.0.3",
"cors": "^2.8.5",
"express": "^4.17.3",
"nodemon": "^3.0.1"
"express-list-endpoints": "^7.1.1",
"mongoose": "^8.15.1",
"nodemon": "^3.1.10"
}
}
Loading