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
10,991 changes: 0 additions & 10,991 deletions data/avocado-sales.json

This file was deleted.

5,402 changes: 0 additions & 5,402 deletions data/books.json

This file was deleted.

12,512 changes: 0 additions & 12,512 deletions data/golden-globes.json

This file was deleted.

19,252 changes: 0 additions & 19,252 deletions data/netflix-titles.json

This file was deleted.

802 changes: 0 additions & 802 deletions data/top-music.json

This file was deleted.

19 changes: 19 additions & 0 deletions models/Netflix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import mongoose from "mongoose";

const NetflixSchema = new mongoose.Schema({
show_id: { type: Number, unique: true, required: true },
title: { type: String, required: true },
director: { type: String, default: "Unknown" },
cast: [{ type: String, default: [] }],
country: { type: String, default: "Unknown" },
date_added: { type: Date, default: null },
release_year: { type: Number, required: true },
rating: { type: String, default: "Unrated" },
duration: { type: String, default: "Unknown" },
listed_in: [{ type: String, default: [] }],
description: { type: String, required: true },
type: { type: String, enum: ["Movie", "TV Show"], required: true },
});

const Netflix = mongoose.model("Movies", NetflixSchema);
export default Netflix;
11 changes: 7 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@
"@babel/node": "^7.16.8",
"@babel/preset-env": "^7.16.11",
"cors": "^2.8.5",
"express": "^4.17.3",
"mongoose": "^8.0.0",
"nodemon": "^3.0.1"
"dotenv": "^16.4.7",
"express": "^4.21.2",
"mongoose": "^8.9.5"
},
"devDependencies": {
"nodemon": "^3.1.9"
}
}
}
57 changes: 57 additions & 0 deletions routes/netflix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import express from "express";
import mongoose from "mongoose";
import Netflix from "../models/Netflix.js";

const router = express.Router();

// Paginated route to get Netflix titles
router.get("/", async (req, res) => {
try {
// Get page and limit from query parameters with default values
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 10;
const skip = (page - 1) * limit;

// Fetch paginated titles and count total items
const titles = await Netflix.find().skip(skip).limit(limit);
const totalItems = await Netflix.countDocuments();

// Send paginated response
res.status(200).json({
data: titles,
currentPage: page,
totalPages: Math.ceil(totalItems / limit),
totalItems,
});
} catch (error) {
res.status(500).json({ error: "Failed to fetch titles", details: error.message });
}
});

// Existing route to get a title by `show_id` or `_id`
router.get("/:id", async (req, res) => {
const { id } = req.params;

let query = {};

if (!isNaN(id)) {
query = { show_id: parseInt(id) };
} else if (mongoose.Types.ObjectId.isValid(id)) {
query = { _id: id };
} else {
return res.status(400).json({ error: "Invalid ID format. Provide a numeric show_id or a valid MongoDB ObjectId." });
}

try {
const title = await Netflix.findOne(query);
if (!title) {
return res.status(404).json({ error: "Title not found" });
}

res.json(title);
} catch (error) {
res.status(500).json({ error: "Failed to fetch title", details: error.message });
}
});

export default router;
64 changes: 45 additions & 19 deletions server.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,58 @@
import express from "express";
import cors from "cors";
import mongoose from "mongoose";
import dotenv from "dotenv";
import Netflix from "./models/Netflix.js"; // Ensure correct file path
import netflixRoutes from "./routes/netflix.js"; // Ensure correct file path

dotenv.config();

// Connect to MongoDB
const connectToDB = async () => {
try {
const mongoUri = process.env.MONGO_URI;
await mongoose.connect(mongoUri, { autoIndex: true });
console.log('Connected to MongoDB Atlas');
} catch (error) {
console.error('Error connecting to MongoDB:', error);
}
};

// If you're using one of our datasets, uncomment the appropriate import below
// to get started!
// import avocadoSalesData from "./data/avocado-sales.json";
// import booksData from "./data/books.json";
// import goldenGlobesData from "./data/golden-globes.json";
// import netflixData from "./data/netflix-titles.json";
// import topMusicData from "./data/top-music.json";

const mongoUrl = process.env.MONGO_URL || "mongodb://localhost/project-mongo";
mongoose.connect(mongoUrl);
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
const port = process.env.PORT || 8080;
const app = express();
const port = process.env.PORT || 3000;

connectToDB();

// Add middlewares to enable cors and json body parsing
app.use(cors());
app.use(express.json());

// Start defining your routes here
// Seed database if RESET_DB is true
if (process.env.RESET_DB) {
const seedDatabase = async () => {
try {
await Netflix.deleteMany({});
// Add your netflixData import and seeding logic here if needed
console.log("Database seeded successfully!");
} catch (error) {
console.error("Error seeding database:", error);
}
};
seedDatabase();
}

// Use Netflix routes
app.use("/titles", netflixRoutes);

// Documentation endpoint
app.get("/", (req, res) => {
res.send("Hello Technigo!");
res.send(`
<h1>Netflix Titles API</h1>
<p>Welcome to the Netflix Titles API. Here are the available endpoints:</p>
<ul>
<li><a href="/titles">/titles</a> - Get all Netflix titles with pagination</li>
<li><a href="/titles/:id">/titles/:id</a> - Get a single Netflix title by ID</li>
</ul>
`);
});

// Start the server
Expand Down