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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
node_modules

package-lock.json
package-lock.json

.env
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,22 @@ npm init
npm i express
npm i nodemon --save-dev

npm run dev
npm run dev

npm i mongoose

mongodb+srv://advaitsreekumar:<db_password>@cluster0.sqitt49.mongodb.net/?appName=Cluster0



mongodb+srv://advaitsreekumar:<advish_01>@cluster0.sqitt49.mongodb.net/?appName=Cluster0

npm i dotenv


## MVC architecture
>> M: Model (structure of our MongoDb)
>> V: View (Frontend)
>> C: Controller (Brain/Logic of a route)

## DTO(Data Transfer Object)
144 changes: 144 additions & 0 deletions controllers/book-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
const {BookModel, UserModel} = require("../models")
const IssuedBook = require("../dto/book-dto");

// const getAllBooks = ()=>{

// }

// const getSingleBookById = ()=>{

// }




// module.exports= {
// getAllBooks,
// getSingleBookById
// }



exports.getAllBooks = async(req,res)=>{
const books= await BookModel.find()

if(books.length===0){
return res.status.json({
success:false,
message: "No books in the system"
})
}
res.status(200).json({
success:true,
data:books
})
}

exports.getSingleBookById = async(req,res)=>{
const {id} =req.params;
const book = await BookModel.findById(id);

if(!book){
return res.status(404).json({
success:false,
message:"Book not found"
})
}

res.status(200).json({
success:true,
data:book
})
}


exports.getAllIssuedBooks = async(req,res)=>{
const users = await BookModel.find({
issuedBook:{$exists:true}
}).populate("issuedBook")

const issuedBook= users.map((each)=>{
return new issuedBook(each);
});

if(issuedBook.length===0){
return res.status(404).json({
success:false,
message:"No issued books found"
})
}
res.status(200).json({
success:true,
data:issuedBook
})
}

exports.addNewBook = async(req,res)=>{
const {data}= req.body;

if(!data || Object.keys(data).length===0){
return res.status(404).json({
success:false,
message:"Data not recieved"
})
}

await BookModel.create(data);

const allBooks= await BookModel.find();
res.status(201).json({
success:true,
message:"Book added",
data:allBooks
})
}

exports.updateOneBook= async(req,res)=>{
const {id}= req.params;
const {data}= req.body;

if(!data || Object.keys(data).length===0){
return res.status(404).json({
success:false,
message:"Data not recieved"
})
}

const updatedBook = await BookModel.findOneAndUpdate(
{_id:id},
data,
{new:true}
);

if(!updatedBook){
return res.status(404).json({
success:false,
message: `Book not found for id: ${id}`
})
}

res.status(200).json({
success: true,
message : "Book updated successfully",
data: updatedBook
})
}


exports.deleteBookById = async(req,res)=>{
const {id}= req.params;

const book= await BookModel.findById(id);
if(!book){
return res.status(404).json({
success: false,
message: " Book not found at id"
})
}

await BookModel.findByIdAndDelete(id);
res.status(200).json({
success: true,
message : "Book deleted successfully"
})
}
146 changes: 146 additions & 0 deletions controllers/user-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
const {BookModel, UserModel} = require("../models")
const { find } = require("../models/user-model")


exports.getAllUsers = async(req,res)=>{
const books = await UserModel.find();

if(books.length===0){
res.status(400).json({
success: true,
message:"No users in the database"
})
}
}

exports.getUserById = async(req,res)=>{
const {id}= req.params;

const user = await UserModel.findById(id);
if(user.length===0){
return res.status(400).json({
success: false,
message:"No such user"
})
}

res.status(200).json({
success: true,
message:" User added succesfully"
})
}

exports.addNewUser = async(req,res)=>{
const {data} = req.body;

if(!data || Object.keys(data).length===0){
res.status(404).json({
success:true,
message:"Please give all the required data"
})
}

await UserModel.create(data);
res.status(200).json({
success: true,
message: " User added successfully",
data:data
})
}

exports.updateUserById= async(req,res)=>{
const {id}= req.params;
const {data}= req.body;

if(!data || Object.keys(data).length===0){
res.status(404).json({
success:true,
message:"Please give all the required data for updating"
})
}

const updatedUser= await UserModel.findByIdAndUpdate(id,data,{new:true})

if(!updatedUser){
return res.status(400).json({
success:false,
message:"Please provide details"
})
}

res.status(200).json({
success:true,
message:"User updated",
data: updatedUser
})
}

exports.deleteUserById = async(req,res)=>{
const {id}= req.params;

const user= UserModel.findById(id);

if(!user){
return res.status(404).json({
success:false,
message:"No such user"
})
}
res.status(200).json({
success: true,
message:"User deleted"
})
}

exports.subscriptionDetailsById = async(req,res)=>{
const {id}= req.params;

const user= UserModel.findById(id);

if(!user){
return res.status(404).json({
success:false,
message:"No such user"
})
}
const getDateInDays=(data= '')=>{
let date;
if(data){
date = new Date(data);
}else{
date= new Date();
}
let days= Math.floor(date/(1000*60*60*24));
return days;
}

const subscriptionType= (date)=>{
if(user.subscriptionType==="Basic"){
date= date+90;
}else if(user.subscriptionType==="Standard"){
date=date+180
}else if(user.subscriptionType==="Premium"){
date+=365
}
return date;
}

let returnDate= getDateInDays(user.returnDate);
let currentDate= getDateInDays();
let subscriptionDate= getDateInDays(user.subscriptionDate);
let subscriptionExpiration= subscriptionType(subscriptionDate)

const data={
...user,
subscriptionExpired: subscriptionExpiration < currentDate,
subscriptionDaysLeft: subscriptionExpiration-currentDate,
daysLeftForExpiration: returnDate - currentDate ? "Book is overdue" : returnDate,
fine: returnDate< currentDate ? subscriptionExpiration <= currentDate ?200 :100: 0
}

res.status(200).json({
success:true,
data:data
});

}
20 changes: 20 additions & 0 deletions dataBaseConnection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const mongoose = require("mongoose");

function DbConnection() {
const DB_URL = process.env.MONGO_URI;

// FIX: Remove the options object entirely.
// Modern Mongoose handles newUrlParser and unifiedTopology by default.
mongoose.connect(DB_URL);

const db = mongoose.connection;

// Optional: Fixed typo "Erro" to "Error"
db.on("error", console.error.bind(console, "Connection Error"));

db.once("open", () => {
console.log('DB connected');
});
}

module.exports = DbConnection;
17 changes: 17 additions & 0 deletions dto/book-dto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class issuedBook{
_id;
name;
price;
author;

constructor(user){
this._id = user.issuedBook._id;
this.name = user.issuedBook.name;
this.price = user.issuedBook.price;
this.author = user.issuedBook.author;
this.issuedBy = user.name;
this.issuedDate = user.issuedDate;
this.returnDate = user.returnDate;

}
}
12 changes: 11 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
const express=require("express");
const {users}=require("./data/users.json")
// const {users}=require("./data/users.json")
const dotenv= require("dotenv")




//import database connection
const DbConnection = require('./dataBaseConnection.js')

const userRoutes=require('./routes/users.js')
const booksRoutes=require('./routes/books.js')


dotenv.config();

const app=express();

DbConnection();
const PORT=8081;
app.use(express.json());

Expand Down
Loading