Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Happy thoughts API #498

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
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
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
# Project Happy Thoughts API

Replace this readme with your own information about your project.

Start by briefly describing the assignment in a sentence or two. Keep it short and to the point.
We had to create our own Api for our previous project Happy thoughts, where we sent thoughts and like it in a local host

## The problem

Describe how you approached to problem, and what tools and techniques you used to solve it. How did you plan? What technologies did you use? If you had more time, what would be next?

I identified the key API endpoints and the required data model such a "thought" with a message, hearts, and createdAt fields. the new tools we used was MongoDB, for storing thoughts in a database, Mongoose, for defining and interacting with the database schema. And we had to use Render for deploying the backend API.

Initially I had problems figuring out which end points to use, my api was not returning the comments neither displaying the likes, and it turns out that it was something very simple that I didnt noticed since I made my previous frontend projects, and I it was that for some reason I added the URL in 2 different files and I forgot to change both, the other problem was that I couldnt upploaded to Render, I had to make the cluster using Atlas, and I missed the live sesion where they were talking about it, so reviewing the material and that sesion I solved it very fast!

## 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.

https://github.com/Technigo/project-happy-thoughts-api/pull/498
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"@babel/preset-env": "^7.16.11",
"cors": "^2.8.5",
"express": "^4.17.3",
"mongoose": "^8.0.0",
"mongoose": "^8.9.0",
"nodemon": "^3.0.1"
}
}
}
66 changes: 60 additions & 6 deletions server.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,80 @@
import cors from "cors";
import express from "express";
import mongoose from "mongoose";
import { Thought } from "./thought"; // Import the Thought model

// Connect to MongoDB
const mongoUrl = process.env.MONGO_URL || "mongodb://localhost/project-mongo";
mongoose.connect(mongoUrl);
mongoose.connect(mongoUrl, { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.Promise = Promise;

// Defines the port the app will run on. Defaults to 8080, but can be overridden
// when starting the server. Example command to overwrite PORT env variable value:
// PORT=9000 npm start
// Define the server's port
const port = process.env.PORT || 8080;
const app = express();

// Add middlewares to enable cors and json body parsing
// Middleware to enable CORS and parse JSON bodies
app.use(cors());
app.use(express.json());

// Start defining your routes here
// Root route for testing
app.get("/", (req, res) => {
res.send("Hello Technigo!");
});

// GET /thoughts - Retrieve 20 most recent thoughts
app.get("/thoughts", async (req, res) => {
try {
const thoughts = await Thought.find().sort({ createdAt: -1 }).limit(20);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

createdAt: "desc"

would be another way to sort the thoughts.

res.status(200).json(thoughts);
} catch (error) {
res.status(500).json({ error: "Could not retrieve thoughts" });
}
});

// POST /thoughts - Create a new thought
app.post("/thoughts", async (req, res) => {
const { message } = req.body;

// Validate the message length
if (!message || message.length < 5 || message.length > 140) {
return res.status(400).json({ error: "Message must be between 5 and 140 characters" });
Comment on lines +38 to +40

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}

try {
const newThought = new Thought({ message }); // Save only the message
const savedThought = await newThought.save();
res.status(201).json(savedThought);
} catch (error) {
res.status(500).json({ error: "Could not save thought" });
}
});

// POST /thoughts/:thoughtId/like - Increment the hearts count
app.post("/thoughts/:thoughtId/like", async (req, res) => {
const { thoughtId } = req.params;

try {
const updatedThought = await Thought.findByIdAndUpdate(
thoughtId,
{ $inc: { hearts: 1 } }, // Increment hearts count
{ new: true } // Return updated document
);
Comment on lines +56 to +61

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


if (!updatedThought) {
return res.status(404).json({ error: "Thought not found" });
}

res.status(200).json(updatedThought);
} catch (error) {
res.status(500).json({ error: "Could not update hearts" });
}
});

// Catch-all route for undefined endpoints (optional)
app.use((req, res) => {
res.status(404).json({ error: "Endpoint not found" });
});

// Start the server
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
Expand Down
22 changes: 22 additions & 0 deletions thought.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import mongoose from "mongoose";

// Define the Thought schema
const ThoughtSchema = new mongoose.Schema({
message: {
type: String,
required: true,
minlength: 5,
maxlength: 140,
},
hearts: {
type: Number,
default: 0,
},
createdAt: {
type: Date,
default: () => new Date(),
},
});

// Export the Thought model
export const Thought = mongoose.model("Thought", ThoughtSchema);