diff --git a/Database/DbConnection.js b/Database/DbConnection.js new file mode 100644 index 0000000000000000000000000000000000000000..7083e4e614a6b32245a86a55232496553c0ef9d3 --- /dev/null +++ b/Database/DbConnection.js @@ -0,0 +1,18 @@ +const mongoose = require("mongoose") +require('dotenv').config(); + +const musfiCollection = 'mongodb+srv://abu:Abubasith86@musficollection.rlzbs.mongodb.net/?retryWrites=true&w=majority&appName=musficollection' + +const hayatCollections = 'mongodb+srv://basith:basith@cluster0.fhejr.mongodb.net/RegisterLogin?retryWrites=true&w=majority' + +function dbConnection() { + mongoose.connect(musfiCollection, { + connectTimeoutMS: 30000, // Set a custom timeout (default is 30,000 ms) + }) + .then(() => console.log('MongoDB connected successfully')) + .catch(error => console.error('MongoDB connection error:', error)); + +mongoose.Promise = global.Promise; +} + +module.exports = {dbConnection} \ No newline at end of file diff --git a/Database/models/BabyItems.js b/Database/models/BabyItems.js new file mode 100644 index 0000000000000000000000000000000000000000..5683685d6e09efe176c1fa84270475da69c53b44 --- /dev/null +++ b/Database/models/BabyItems.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const babyItems = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('BabyItems', babyItems); \ No newline at end of file diff --git a/Database/models/DriedNoodles.js b/Database/models/DriedNoodles.js new file mode 100644 index 0000000000000000000000000000000000000000..c3cac7f8775267437be1c94fdd3e12be7702cd83 --- /dev/null +++ b/Database/models/DriedNoodles.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const driedNoodles = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('DriedNoodles', driedNoodles); \ No newline at end of file diff --git a/Database/models/address.js b/Database/models/address.js new file mode 100644 index 0000000000000000000000000000000000000000..1c96644f952d54f498f378b0592b783090870b48 --- /dev/null +++ b/Database/models/address.js @@ -0,0 +1,42 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + +addressSchema = new Schema({ + _id: mongoose.Schema.Types.ObjectId, + user_id: { + type: String + }, + address: [ + { + name: { + type: String + }, + userId: { + type: String + }, + mobileNumber: { + type: String + }, + pinCode: { + type: String + }, + address: { + type: String + }, + area: { + type: String + }, + landMark: { + type: String + }, + alterMobileNumber: { + type: String + } + + } + ] +}, + { timestamps: true } +); + +module.exports = mongoose.model('Address', addressSchema); \ No newline at end of file diff --git a/Database/models/banner.js b/Database/models/banner.js new file mode 100644 index 0000000000000000000000000000000000000000..9dea859d2911038d68290cd023becf1487c02c89 --- /dev/null +++ b/Database/models/banner.js @@ -0,0 +1,37 @@ +var mongoose = require('mongoose'); + +const bannerScheme = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + percentage: { + type: String, + }, + image: { + type: String + }, + products: [ + { + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } + }, + ], +}); + +module.exports = mongoose.model('Banner', bannerScheme); \ No newline at end of file diff --git a/Database/models/category.js b/Database/models/category.js new file mode 100644 index 0000000000000000000000000000000000000000..9456b13a679c70d293263a17bd61ecfffec3aca4 --- /dev/null +++ b/Database/models/category.js @@ -0,0 +1,12 @@ + +const { Schema, model } = require("mongoose"); + +const categorySchema = Schema({ + id: Schema.Types.ObjectId, + name: { type: String, required: true }, + description: { type: String }, + image: { type: String }, + link: { type: String }, +}); + +module.exports = model("Category", categorySchema); \ No newline at end of file diff --git a/Database/models/comments.js b/Database/models/comments.js new file mode 100644 index 0000000000000000000000000000000000000000..99a0e3e5533014f6dd41847dd557e341bfc37557 --- /dev/null +++ b/Database/models/comments.js @@ -0,0 +1,70 @@ +const mongoose = require('mongoose'); + +const commentSchema = new mongoose.Schema( + { + user: { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + }, + createdAt: { + type: Date, + default: Date.now, + }, + comment: { + type: String, + required: [true, 'Comment is required'], + }, + likes: [ + { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + }, + ], + post: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Post', + }, + // reply: [ + // { + // user: { + // type: mongoose.Schema.Types.ObjectId, + // ref: 'User', + // }, + // comment: { + // type: String, + // }, + // like: [ + // { + // type: mongoose.Schema.Types.ObjectId, + // ref: 'Profile', + // }, + // ], + // }, + // ], + }, + { + toJSON: { virtuals: true }, + toObject: { virtuals: true }, + } +); + +// commentSchema.virtual('replies', { +// ref: 'Reply', +// localField: '_id', +// foreignField: 'comment' + +// }) + +commentSchema.pre(/^find/, function (next) { + this.find() + .populate('user') + .populate({ + path: 'likes', + select: 'username user name photo _id', + }); + + next(); +}); + +const Comment = mongoose.model('Comment', commentSchema); +module.exports = Comment; \ No newline at end of file diff --git a/Database/models/dairy.js b/Database/models/dairy.js new file mode 100644 index 0000000000000000000000000000000000000000..6a870a055d998fd246412115e5355078e2aace98 --- /dev/null +++ b/Database/models/dairy.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const diaryScheme = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('Diary', diaryScheme); \ No newline at end of file diff --git a/Database/models/drinks.js b/Database/models/drinks.js new file mode 100644 index 0000000000000000000000000000000000000000..2f09a7e23640d5c5301a65b1c4bda5343e512767 --- /dev/null +++ b/Database/models/drinks.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const drinksScheme = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('Drinks', drinksScheme); \ No newline at end of file diff --git a/Database/models/fruits.js b/Database/models/fruits.js new file mode 100644 index 0000000000000000000000000000000000000000..327ff6e486726d5535f32fcefb5607d6678b5df3 --- /dev/null +++ b/Database/models/fruits.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const fruitsScheme = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('Fruits', fruitsScheme); \ No newline at end of file diff --git a/Database/models/gocery.js b/Database/models/gocery.js new file mode 100644 index 0000000000000000000000000000000000000000..3ec2db13a8431dc844746d0fa4bc72033f8180c2 --- /dev/null +++ b/Database/models/gocery.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const groceryScheme = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('Grocery', groceryScheme); \ No newline at end of file diff --git a/Database/models/healthCare.js b/Database/models/healthCare.js new file mode 100644 index 0000000000000000000000000000000000000000..4b703fa01b6dc8a3a98d35725ebfa68259991df7 --- /dev/null +++ b/Database/models/healthCare.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const healthCare = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('HealthCare', healthCare); \ No newline at end of file diff --git a/Database/models/home.js b/Database/models/home.js new file mode 100644 index 0000000000000000000000000000000000000000..89f7871716ef87b3d883cb3d239a592e913469b6 --- /dev/null +++ b/Database/models/home.js @@ -0,0 +1,14 @@ + +const { Schema, model } = require("mongoose"); +import bannerSchema from '../models/banner' +import productSchema from '../models/product' +import categorySchema from '../models/category' + +const homeSchema = new Schema({ + banners: [bannerSchema], + categories: [categorySchema], + recentPurchase: [], + newProducts: [productSchema] +}); + +module.exports = model('Home', homeSchema); \ No newline at end of file diff --git a/Database/models/newPost.js b/Database/models/newPost.js new file mode 100644 index 0000000000000000000000000000000000000000..0dc58380bd9d2c19020fcfd423cd9714ef0b43d0 --- /dev/null +++ b/Database/models/newPost.js @@ -0,0 +1,66 @@ +const mongoose = require('mongoose'); +const Profile = require('./user'); + +const postSchema = new mongoose.Schema( + { + user: { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + }, + createdAt: { + type: Date, + default: Date.now, + }, + profile: { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + }, + caption: { + type: String, + trim: true, + }, + location: { + type: String, + }, + likes: [ + { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + }, + ], + image: String, + // comment: { + // type: mongoose.Schema.Types.ObjectId, + // ref: 'Comment', + // }, + }, + { + toJSON: { virtuals: true }, + toObject: { virtuals: true }, + } +); + +postSchema.set('toObject', { virtuals: true }); +postSchema.set('toJSON', { virtuals: true }); + +postSchema.virtual('commentsPost', { + ref: 'Comment', + localField: '_id', + foreignField: 'post', +}); + +postSchema.methods.getProfileId = async function (id) { + const { _id } = await Profile.findOne({ unique_id: id }); + return _id; +}; + +// //Todo +// postSchema.pre(/^find/, function (next) { +// this.find().populate('commentsPost'); + +// next(); +// }); + +const Post = mongoose.model('PostTest', postSchema); + +module.exports = Post; diff --git a/Database/models/order.js b/Database/models/order.js new file mode 100644 index 0000000000000000000000000000000000000000..ca60fa875f4260b6ad50000833668dc98f18baff --- /dev/null +++ b/Database/models/order.js @@ -0,0 +1,33 @@ +const mongoose = require('mongoose'); + +const orderSchema = new mongoose.Schema( + { + unique_id: { type: Number, required: true }, + numOfItems: { type: Number, required: true }, + user_id: { type: Number, required: true }, + user_name: { type: String, required: true }, + products: [ + { + productId: { + type: String, + }, + productName: { + type: String, + }, + productImage: { + type: String, + // required: true + }, + quantity: { + type: String, + }, + }, + ], + amount: { type: Number, required: true }, + address: { type: Object, required: true }, + status: { type: String, default: "Packing" }, + }, + { timestamps: true } +); + +module.exports = mongoose.model('Order', orderSchema); \ No newline at end of file diff --git a/Database/models/personalCare.js b/Database/models/personalCare.js new file mode 100644 index 0000000000000000000000000000000000000000..7f7dcc17fd5f109aceae0d6b7f9778bfea1238ef --- /dev/null +++ b/Database/models/personalCare.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const personalCareScheme = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('PersonalCare', personalCareScheme); \ No newline at end of file diff --git a/Database/models/postNews.js b/Database/models/postNews.js new file mode 100644 index 0000000000000000000000000000000000000000..2bd9237af49c7ef68fc160cf69097b2d183a4acd --- /dev/null +++ b/Database/models/postNews.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose'); + +const postSchema = new mongoose.Schema({ + postId: { + type: mongoose.Schema.Types.ObjectId, ref: 'User' + }, + postedBy: String, + caption: String, + imageUrl: String, + liked: String, +}); + +module.exports = mongoose.model('Post', postSchema); \ No newline at end of file diff --git a/Database/models/product.js b/Database/models/product.js new file mode 100644 index 0000000000000000000000000000000000000000..45810a57ab6126223ff15bfde8b4665765760139 --- /dev/null +++ b/Database/models/product.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const productSchema = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('Product', productSchema); \ No newline at end of file diff --git a/Database/models/special_offers.js b/Database/models/special_offers.js new file mode 100644 index 0000000000000000000000000000000000000000..b2b24182d1b181737e0457dc72986b39d2f97c09 --- /dev/null +++ b/Database/models/special_offers.js @@ -0,0 +1,9 @@ +var mongoose = require('mongoose'); + +const specialOffer = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + offerName: { type: String, require: true }, + offerBannerImage: { type: String, require: true } +}) + +module.exports = mongoose.model('Offers', specialOffer); \ No newline at end of file diff --git a/Database/models/user.js b/Database/models/user.js new file mode 100644 index 0000000000000000000000000000000000000000..d973f65c45cb9894bd4b4f2c8cb5177ab6e9269d --- /dev/null +++ b/Database/models/user.js @@ -0,0 +1,118 @@ +const mongoose = require('mongoose'); +const { Schema } = mongoose; + +const userSchema = new Schema({ + unique_id: { + type: Number, + required: true, + unique: true + }, + email: { + type: String, + unique: true, + sparse: true, // Indexing only if present + validate: { + validator: function (value) { + // Validate only if the email field is updated + if (this.isModified('email') && value) { + return !this.mobileNumber; + } + return true; + }, + message: 'Mobile number must be empty if email is provided.' + } + }, + + username: { + type: String, + required: true + }, + dateOfBirth: { + type: String + }, + mobileNumber: { + type: String, + unique: true, + sparse: true, // Indexing only if present + validate: { + validator: function (value) { + // Validate only if the mobileNumber field is updated + if (this.isModified('mobileNumber') && value) { + return !this.email; + } + return true; + }, + message: 'Email must be empty if mobile number is provided.' + } + }, + password: { + type: String, + required: true + }, + pushToken: { + type: String + }, + token: { + type: String + }, + role: { + type: String, + enum: ['user', 'admin', 'customer'], + default: 'user' + }, + googleId: { + type: String + }, + profilePic: { + type: String + }, + address: [ + { + name: { + type: String + }, + userId: { + type: String + }, + mobileNumber: { + type: String + }, + pinCode: { + type: String + }, + address: { + type: String + }, + area: { + type: String + }, + landMark: { + type: String + }, + alterMobileNumber: { + type: String + } + } + ] +}, { + timestamps: true // This adds `createdAt` and `updatedAt` fields +}); + +// Pre-update hook to ensure validation happens only when email or mobileNumber are updated +// userSchema.pre('findOneAndUpdate', function (next) { +// const update = this.getUpdate(); +// const user = this._conditions; + +// // Check if email and mobileNumber are both in the update query +// if (update.email && update.mobileNumber) { +// const error = new Error('Email and mobile number cannot both be provided.'); +// return next(error); // Return error if both fields are set +// } + +// // Proceed with the update +// next(); +// }); + +const User = mongoose.model('User', userSchema); + +module.exports = User; diff --git a/Database/models/vegitables.js b/Database/models/vegitables.js new file mode 100644 index 0000000000000000000000000000000000000000..a46b20a79b60c595d9b4eba3c306b6e9fa5d085a --- /dev/null +++ b/Database/models/vegitables.js @@ -0,0 +1,23 @@ +var mongoose = require('mongoose'); + +const vegetablesSchema = mongoose.Schema({ + _id: mongoose.Schema.Types.ObjectId, + name: { + type: String, + }, + price: { + type: Number, + }, + description: { + type: String, + }, + image: { + type: String, + }, + isLiked: { + type: Boolean, + default: false, + } +}); + +module.exports = mongoose.model('Vegetables', vegetablesSchema); \ No newline at end of file diff --git a/Database/mufiModels/featureProduct.js b/Database/mufiModels/featureProduct.js new file mode 100644 index 0000000000000000000000000000000000000000..a21723a007ed204b485fbb36add83a3ee8311250 --- /dev/null +++ b/Database/mufiModels/featureProduct.js @@ -0,0 +1,61 @@ +const { Schema, model } = require("mongoose"); +const mongoose = require("mongoose"); + +const featureProductsScema = new Schema( + { + name: { + type: String, + required: true, + unique: true, + trim: true, + minLength: [3, "Too Short product Name"], + }, + images: { + type: [String], + }, + description: { + type: String, + maxlength: [100, "Description should be less than or equal to 100"], + minlength: [10, "Description should be more than or equal to 10"], + required: true, + trim: true, + }, + price: { + type: Number, + default: 0, + min: 0, + required: true, + }, + priceAfterDiscount: { + type: Number, + default: 0, + min: 0, + }, + quantity: { + type: Number, + default: 0, + min: 0, + }, + sold: { + type: Number, + default: 0, + min: 0, + }, + category: { + type: Schema.ObjectId, + ref: "Category", + }, + ratingAvg: { + type: Number, + min: 1, + max: 5, + }, + ratingCount: { + type: Number, + min: 0, + }, + }, + { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } } +) + +module.exports = mongoose.model('featureProducts', featureProductsScema); \ No newline at end of file diff --git a/Database/mufiModels/hijabs.js b/Database/mufiModels/hijabs.js new file mode 100644 index 0000000000000000000000000000000000000000..80dc4a29672c761763ea6d48e5a42b33bb343c90 --- /dev/null +++ b/Database/mufiModels/hijabs.js @@ -0,0 +1,62 @@ +const { Schema, model } = require("mongoose"); +const mongoose = require("mongoose"); + +const hijabsScema = new Schema( + { + name: { + type: String, + required: true, + unique: true, + trim: true, + minLength: [3, "Too Short product Name"], + }, + images: { + type: [String], + }, + description: { + type: String, + maxlength: [100, "Description should be less than or equal to 100"], + minlength: [10, "Description should be more than or equal to 10"], + required: true, + trim: true, + }, + price: { + type: Number, + default: 0, + min: 0, + required: true, + }, + priceAfterDiscount: { + type: Number, + default: 0, + min: 0, + }, + quantity: { + type: Number, + default: 0, + min: 0, + }, + sold: { + type: Number, + default: 0, + min: 0, + }, + category: { + type: Schema.ObjectId, + ref: "Category", + required: true, + }, + ratingAvg: { + type: Number, + min: 1, + max: 5, + }, + ratingCount: { + type: Number, + min: 0, + }, + }, + { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } } +) + +module.exports = mongoose.model('hijabs', hijabsScema); \ No newline at end of file diff --git a/Database/mufiModels/scarfs.js b/Database/mufiModels/scarfs.js new file mode 100644 index 0000000000000000000000000000000000000000..5c63277e8f44277753d0aa1ff66a55703b4cb297 --- /dev/null +++ b/Database/mufiModels/scarfs.js @@ -0,0 +1,62 @@ +const { Schema, model } = require("mongoose"); +const mongoose = require("mongoose"); + +const scarfsScema = new Schema( + { + name: { + type: String, + required: true, + unique: true, + trim: true, + minLength: [3, "Too Short product Name"], + }, + images: { + type: [String], + }, + description: { + type: String, + maxlength: [100, "Description should be less than or equal to 100"], + minlength: [10, "Description should be more than or equal to 10"], + required: true, + trim: true, + }, + price: { + type: Number, + default: 0, + min: 0, + required: true, + }, + priceAfterDiscount: { + type: Number, + default: 0, + min: 0, + }, + quantity: { + type: Number, + default: 0, + min: 0, + }, + sold: { + type: Number, + default: 0, + min: 0, + }, + category: { + type: Schema.ObjectId, + ref: "Category", + required: true, + }, + ratingAvg: { + type: Number, + min: 1, + max: 5, + }, + ratingCount: { + type: Number, + min: 0, + }, + }, + { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } } +) + +module.exports = mongoose.model('scarfs', scarfsScema); \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 0439d385704b54ee85fda044cd9d01c9aff5d7d2..3159bef07e7e92b226b7a87a83229eef2043fd48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,5 +18,5 @@ RUN npm ci --only=production # Copy the rest of your application code COPY . . -EXPOSE 7860 +EXPOSE 4000 CMD ["node", "server.js"] \ No newline at end of file diff --git a/README.md b/README.md index 1c922b825866fbe662653e579594cbbae9cb5ec1..bdf4878a4fd1c9528d74fddfb1dd78769dc16c59 100644 --- a/README.md +++ b/README.md @@ -1,12 +1 @@ ---- -title: Hayat -emoji: 🏃 -colorFrom: pink -colorTo: green -sdk: docker -pinned: false -license: apache-2.0 -short_description: Node JS backend project ---- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# MyApi diff --git a/app.js b/app.js new file mode 100644 index 0000000000000000000000000000000000000000..b99e583c91986018b14a4bc61b844e13e51d17f7 --- /dev/null +++ b/app.js @@ -0,0 +1,117 @@ +var express = require('express'); +var router = express.Router(); +var app = express(); +const http = require('http'); +var bodyParser = require('body-parser'); +const morgan = require('morgan'); + + +//Routes +const login = require("./routes/login"); +const register = require("./routes/register"); +const profile = require("./routes/profile"); +const profileUpdate = require("./routes/profileUpdate"); +const changePassword = require("./routes/changePassword"); +const productRoutes = require("./routes/products"); +const orderRoutes = require("./routes/orders"); +const category = require("./routes/category"); +const vegetables = require("./routes/vegetables"); +const grocery = require("./routes/grocery"); +const drinks = require("./routes/drinks"); +const fruites = require("./routes/fruits"); +const dairy = require("./routes/dairy"); +const forgotPassword = require("./routes/forgotPassword") +const fcm = require("./routes/fcm"); +const banner = require("./routes/banner"); +const address = require("./routes/address") +const firebase = require("./utils/firebase") +const post = require("./routes/post") +const newPost = require("./routes/newPost"); +const comment = require("./routes/cmd"); +const personalCare = require("./routes/personalCare"); +const healthCare = require("./routes/healthCare"); +const driedNoodles = require("./routes/driedNoodles"); +const home = require("./routes/home") +const babyItems = require("./routes/babyItems") + +// //Mongoes Db +// mongoose.connect('mongodb+srv://basith:basith@cluster0.fhejr.mongodb.net/RegisterLogin?retryWrites=true&w=majority', { +// useNewUrlParser: true, +// useUnifiedTopology: true +// }, (err) => { +// if (!err) { +// console.log('MongoDB Connection Succeeded.'); +// } else { +// console.log('Error in DB connection : ' + err); +// } +// }); + +// mongoose.Promise = global.Promise; + + +//Setting the requestParse +app.use(morgan("dev")); +app.use('/uploads', express.static('uploads')); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(bodyParser.json()); + + +//IDK why we use this and i think this is Header what required.... +app.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); + res.header( + "Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept, Authorization" + ); + if (req.method === "OPTIONS") { + res.header("Access-Control-Allow-Methods", "PUT, POST, PATCH, DELETE, GET"); + return res.status(200).json({}); + } + next(); +}); + +// Routes which should handle requests +app.use("/login", login); +app.use("/register", register); +app.use("/profile", profile); +app.use("/profileUpdate", profileUpdate); +app.use("/products", productRoutes); +app.use("/category", category); +app.use("/orders", orderRoutes); +app.use("/vegetables", vegetables); +app.use("/grocery", grocery); +app.use("/fruits", fruites); +app.use("/drinks", drinks); +app.use("/dairy", dairy); +app.use("/forgotPassword", forgotPassword); +app.use("/changePassword", changePassword); +app.use("/fcm", fcm); +app.use("/banner", banner); +app.use("/address", address); +app.use("/newPost", newPost); +app.use("/cmd", comment); +app.use("/personalCare", personalCare); +app.use("/healthCare", healthCare); +app.use("/driedNoodles", driedNoodles); +app.use("/home", home) +app.use("/babyItems", babyItems) + + +//Error catch +app.use((req, res, next) => { + const error = new Error("Not found"); + error.status = 404; + next(error); +}); + +//Some other error show +app.use((error, req, res, next) => { + res.status(error.status || 500); + res.json({ + error: { + message: error.message + } + }); +}); + +module.exports = app; \ No newline at end of file diff --git a/bootstrap.js b/bootstrap.js new file mode 100644 index 0000000000000000000000000000000000000000..5b7de2a33ab3ed44bb21bb37f2ff8540935165cd --- /dev/null +++ b/bootstrap.js @@ -0,0 +1,75 @@ +const { AppError } = require("./utils/AppError.js"); +const globalErrorHandling = require("./utils/GlobalErrorHandling.js"); + +// Routes +const login = require("./routes/login"); +const register = require("./routes/register"); +const profile = require("./routes/profile"); +const profileUpdate = require("./routes/profileUpdate"); +const changePassword = require("./routes/changePassword"); +const productRoutes = require("./routes/products"); +const orderRoutes = require("./routes/orders"); +const category = require("./routes/category"); +const vegetables = require("./routes/vegetables"); +const grocery = require("./routes/grocery"); +const drinks = require("./routes/drinks"); +const fruites = require("./routes/fruits"); +const dairy = require("./routes/dairy"); +const forgotPassword = require("./routes/forgotPassword"); +const fcm = require("./routes/fcm"); +const banner = require("./routes/banner"); +const address = require("./routes/address"); +const post = require("./routes/post"); +const newPost = require("./routes/newPost"); +const comment = require("./routes/cmd"); +const personalCare = require("./routes/personalCare"); +const healthCare = require("./routes/healthCare"); +const driedNoodles = require("./routes/driedNoodles"); +const home = require("./routes/home"); +const babyItems = require("./routes/babyItems"); + +const hijabRouter = require("./routes/musfiRouters/hijabs/hijabsRouter.js"); +const featureRoute = require("./routes/musfiRouters/featureProducts/featureProductsRouter.js"); +const scarfsRouter = require("./routes/musfiRouters/scarfs/scarfsRouter.js"); + +function bootstrap(app) { + app.use("/api/v1/login", login); + app.use("/api/v1/register", register); + app.use("/api/v1/profile", profile); + app.use("/api/v1/profileUpdate", profileUpdate); + app.use("/api/v1/changePassword", changePassword); + app.use("/api/v1/productRoutes", productRoutes); + app.use("/api/v1/orderRoutes", orderRoutes); + app.use("/api/v1/category", category); + app.use("/api/v1/vegetables", vegetables); + app.use("/api/v1/grocery", grocery); + app.use("/api/v1/drinks", drinks); + app.use("/api/v1/fruites", fruites); + app.use("/api/v1/dairy", dairy); + app.use("/api/v1/forgotPassword", forgotPassword); + app.use("/api/v1/address", address); + app.use("/api/v1/fcm", fcm); + app.use("/api/v1/banner", banner); + app.use("/api/v1/home", home); + app.use("/api/v1/babyItems", babyItems); + app.use("/api/v1/personalCare", personalCare); + app.use("/api/v1/healthCare", healthCare); + app.use("/api/v1/driedNoodles", driedNoodles); + app.use("/api/v1/post", post); + app.use("/api/v1/newPost", newPost); + app.use("/api/v1/comment", comment); + + app.use("/api/v1/hijabs", hijabRouter); + app.use("/api/v1/featureProducts", featureRoute) + app.use("/api/v1/scarfs", scarfsRouter) + + // Catch-all for undefined routes + app.all("*", (req, res, next) => { + next(new AppError("Endpoint was not found", 404)); + }); + + // // Global error handling middleware + // app.use(globalErrorHandling); +} + +module.exports = { bootstrap }; diff --git a/core/auth.js b/core/auth.js new file mode 100644 index 0000000000000000000000000000000000000000..fc23d5dfa914ae817054bcf51824939b3fb1fb7b --- /dev/null +++ b/core/auth.js @@ -0,0 +1,27 @@ +const { OAuth2Client } = require('google-auth-library'); +require('dotenv').config(); +const googleClientId = process.env.GOOGLE_ID; + +// Initialize the OAuth2 client with your Google Client ID +const client = new OAuth2Client('YOUR_GOOGLE_CLIENT_ID'); + +async function verifyGoogleToken(token) { + try { + // Verify the token + const ticket = await client.verifyIdToken({ + idToken: token, + audience: googleClientId, // Specify the CLIENT_ID of the app that accesses the backend + }); + + // Get the user payload from the ticket + const payload = ticket.getPayload(); + + // Return the payload with user information + return ticket; + } catch (error) { + console.error('Google token verification failed:', error); + throw new Error('Invalid Google token'); + } +} + +module.exports = verifyGoogleToken; diff --git a/package.json b/package.json index 360a66c511f2684398421291ba8b2dc1f6210418..8675d50a0c16aafbc1d05f4246ffba4e94723261 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,42 @@ { - "name": "node-docker-example", - "version": "1.0.0", - "description": "A simple Node.js project to test Docker deployment", - "main": "server.js", - "scripts": { - "start": "node server.js" - }, - "author": "Your Name", - "license": "MIT", - "dependencies": {} + "name": "creating-registration-and-login-form-in-nodejs-and-mongodb", + "version": "1.0.0", + "engines": { + "node": "21.x" + }, + "description": "This is a user login and registration app using Node.js, Express, Mongoose and express-sessions. ", + "main": "server.js", + "dependencies": { + "@pusher/push-notifications-server": "^1.0.1", + "axios": "^1.2.5", + "bcrypt": "^5.0.1", + "connect-mongo": "^3.0.0", + "crypto": "^1.0.1", + "dotenv": "^8.6.0", + "cors": "^2.8.5", + "ejs": "^3.0.1", + "express": "^4.21.2", + "express-handlebars": "^6.0.6", + "express-session": "^1.16.2", + "fcm-node": "^1.3.0", + "fcm-push": "^1.1.3", + "firebase": "^9.23.0", + "firebase-admin": "^11.5.0", + "form-data": "^4.0.0", + "google-auth-library": "^9.14.0", + "jsonwebtoken": "^9.0.0", + "mailgun.js": "^7.0.0", + "mongodb": "^6.8.0", + "mongoose": "^8.9.1", + "morgan": "^1.10.0", + "multer": "^1.4.5-lts.1", + "nodemailer": "^6.7.7", + "nodemon": "^2.0.16", + "salted-md5": "^4.0.5" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon server.js", + "build": "nodemon server.js" } - \ No newline at end of file +} diff --git a/push-notification-key.json b/push-notification-key.json new file mode 100644 index 0000000000000000000000000000000000000000..fe335bda0aa8e9912078fa9a1eb88d45292e65a8 --- /dev/null +++ b/push-notification-key.json @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "flutter-hayat", + "private_key_id": "f558d83ec7eb29dd6b0ea474f6d4001cdcc6f6df", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCxivFISQeNWg5t\ndiNYzA2cuNvhbLL3kMmxMk7EIVdxVXrnM9YIzh2PPa82dyKyhJaCr/9DPPrhxRtW\nnHyTwqXxh6ycjxTHazM2Nj8aScUvK382Tl7QIynzcwirQ48iJSQtXeo7sy3fJLTd\nC8lYfGQV2is4l+bOYIDmcMdLzQ43RAiIjj+Xy8QLAW7GBOsJtuMsask7MVAhOph7\nfn/aQK9rWXKRutyKrstBpwkI4aGKfd3y89gxPuk8Fj4H3PyB3FZUF5eb5E11VD0R\n7mU7s7VWWtMja0pDUO8sFq+AmB6hFi3Ua7wS1M1uBl7eEMNDlVlUyBpsa15JODHD\nosq+guahAgMBAAECggEABPvlR5XzPhLV3llHZz39MNXYqFSclooMO2rx3pwgAAi6\nBUUFgGRG3KdK5KDGCtRhhEQsCodq9I0Ltiv47E31yhi4rgFvQCTggGhX76U8AZW7\nQbtD+pxOGG01hFdGbJs1z4c4JNpkEoRNhnoG+jKtvZZNCc7r1gXMAIwQcC6OtFrq\nwyZAFTiUdDartKAe5eevNf8HCb/vchl34rzxEb669Mujju8LRm/3LF393Kxr9Wum\nV+oEVyp6ofieSr8Do5vvg94TD2/2pEvtPuainfnbe99b3UPw1CgF7+16jKumV3RE\nMxSAX2UXgKPre6Gs5JvKE4d1ubGnBIDk0VhZmrWqVQKBgQDwVu6Bo0HDSM3wy8w2\nJXeW/aSCV03TpPZn5nmpapikZHuCx0U6OnMmoUbAYKMTdKzNeBy6xgYFED5P7jEn\nlDD4hY0+jIySyie6gcnYPy4mAqxQeltPvo538dAxPaxFKR43sFmDYFdo6Zifitut\n2DPFcY5XZsD/+zS3cK7ChuNHZQKBgQC9HIGeX1BENIeef0W/oyYPhfQEejVZNMpU\n8OGo36FELcfd+DmzgD2lNNNUFEoENc5QceJ0d1GMerTLBMp+0AUriB5O+E9na9EM\nWEp3Zx0ZXacaPw7IYGSG44cG4qMSnBj88h+WHZrfLhADXKXBpZb8PXV9tFCfVdpi\nUoMwY2sEjQKBgQCkWN3JumjK8GsbQVFIqYBIuPOYybiHhKOW0wzY4/KzX57yA+/7\n7GI3xUsLXEnHkR5ldsA2nBkbt0rU/62PQg/msfSvFA9AhYp7SCtNe47EIUnR0onE\nUys7LBlQwrqdpItsS2Q6qVO8gxiB6MNl8pUcbBWJANPzd8VJt31ZukGK3QKBgQC5\nBoAHbOgCo4ahW5Lpif2+KGh0TQGPUyg3bSrMaGjHZSdtFOWXq3wk/IdbdzJn5iEC\n8joHi4p9ML1c+UYKRwsX6WkGCMrfvExfkK7jHj8JR2ksM9AJ2s3gcBL3eJzmo1WL\nfnXLERIrFE1UjLwcuB/+kT84C0jqbDxsAKEcodjeLQKBgHTBa43VlAH3X9cbyikW\nm+ZEN7o7AGoyQySVMJ1jTIDn1cq/AqnpH4Bl3Lu8U4PYYaBP2aPdFUpEGX9nXUzK\nwLPTIifwd0UHjkQGKpH68lbc4pW1iNcRpJTp5IG5W0XVOWl6MnPD8BSRdA1zfJi7\nxBlMV2UDVJCZIT2ySY03C89l\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-fr502@flutter-hayat.iam.gserviceaccount.com", + "client_id": "102750862365764776921", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fr502%40flutter-hayat.iam.gserviceaccount.com" + } + \ No newline at end of file diff --git a/routes/address.js b/routes/address.js new file mode 100644 index 0000000000000000000000000000000000000000..988ccb73f7ef5bf9efcf59f65b13243dd93b3bfa --- /dev/null +++ b/routes/address.js @@ -0,0 +1,99 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const Address = require("../Database/models/address"); + +function successResponse(message) { + return { + "status": 200, + "connection": "Connected", + "message": message + } +} + +function failedResponse(message) { + return { + "status": 400, + "connection": "Dissconnected", + "message": message + } +} + +//Post order +router.post("/", async (req, res, next) => { + + console.log(req.body); + + const address = new Address(req.body); + + try { + const address = await address.save(); + + res.status(500).send(successResponse(address)); + } catch (err) { + console.log(err); + res.status(500).send(failedResponse(err)); + } + +}); + +router.get("/:user_id", async (req, res, next) => { + + console.log(req.params.user_id); + + try { + const orders = await Address.find({ user_id: req.params.user_id }); + res.status(200).send(successResponse(orders)); + } catch (err) { + res.status(500).send(failedResponse(err)); + } +}); + +//UPDATE +router.put("/:id", async (req, res) => { + console.log(req.params.id); + console.log(req.body); + + try { + + Address.updateOne({ _id: req.params.id }, + { $set: { status: req.body.status } }, function (err, data) { + + if (err) { + return res.status(500).send(failedResponse(err)) + } else { + return res.status(200).send(successResponse(data)) + } + }) + + } catch (err) { + console.log(err); + res.status(500).send(failedResponse(err)); + } + + +}); + +// //GET ALL +router.get("/", async (req, res) => { + try { + const address = await Address.find(); + res.status(200).json(successResponse(address)); + } catch (err) { + res.status(500).json(failedResponse(err)); + } +}); + +//DELETE +router.delete("/:id", (req, res, next) => { + Order.remove({ _id: req.params.id }) + .exec() + .then(result => { + res.status(200).send(successResponse(result)); + }) + .catch(err => { + res.status(500).send(failedResponse(err)); + }); +}); + +module.exports = router; diff --git a/routes/babyItems.js b/routes/babyItems.js new file mode 100644 index 0000000000000000000000000000000000000000..345a2acd5eae54249626a38af54fabe95bb8bd0a --- /dev/null +++ b/routes/babyItems.js @@ -0,0 +1,142 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const firebase = require("../utils/firebase"); +const BabyItems = require("../Database/models/BabyItems"); +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/webp') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "BabyItems/" + req.file.filename) + await firebase.generateSignedUrl("BabyItems/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const babyItems = BabyItems({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + babyItems + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + BabyItems.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('fruitImage'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + console.log(updateOps); + BabyItems.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).json({ + message: 'Product updated', + request: { + type: 'GET', + url: 'http://localhost:4000/products/' + id + } + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + BabyItems.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).json({ + message: 'Fruit item deleted', + request: { + type: 'POST', + url: 'http://localhost:3000/products', + body: { name: 'String', price: 'Number' } + } + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + + + + +module.exports = router; diff --git a/routes/banner.js b/routes/banner.js new file mode 100644 index 0000000000000000000000000000000000000000..9544b79cd402c617d100309f48e3ca7859c3d9db --- /dev/null +++ b/routes/banner.js @@ -0,0 +1,148 @@ +const express = require("express"); +const router = express.Router(); +var Banner = require('../Database/models/banner'); +const mongoose = require("mongoose"); +const multer = require('multer'); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +router.post("/", upload.any(), async (req, res) => { + console.log(req.body); // Log non-file data + const uploadedFiles = req.files; // Uploaded files + let bannerImage = "" + + let bannerImageName = uploadedFiles.find( + (f) => f.fieldname.includes('banner') + ); + + if (bannerImageName != "" && bannerImageName != undefined) { + + let bannerImagePath = uploadedFiles.find( + (f) => f.path.includes('banner') + ); + await firebase.uploadFile(bannerImagePath, "bannerImage/" + bannerImageName); + + // Generating signed URL for the uploaded image + await firebase.generateSignedUrl("bannerImage/" + bannerImageName) + .then((url) => { + imageUrl = url; + }) + .catch((err) => { + console.error(`Error generating signed URL for ${fileName.filename}:`, err); + return res.status(500).json({ error: 'Error generating image URL.' }); + }); + } + + try { + const { name, percentage, products } = req.body; // Non-file data + + const bannerProducts = []; + let imageUrl = ''; // Declare imageUrl variable + + for (let i = 0; i < products.length; i++) { + const product = products[i]; // Directly use product if it's already an object + const fileName = uploadedFiles.find( + (f) => f.fieldname === `products[${i}][image]` + ); + + // If no file is found for the product, skip + if (!fileName) { + console.log(`No image found for product ${i}`); + continue; + } + + const filePath = fileName.path; + + // Upload file and generate the signed URL + await firebase.uploadFile(filePath, "bannerProducts/" + fileName.filename); + + // Generating signed URL for the uploaded image + await firebase.generateSignedUrl("bannerProducts/" + fileName.filename) + .then((url) => { + imageUrl = url; + }) + .catch((err) => { + console.error(`Error generating signed URL for ${fileName.filename}:`, err); + return res.status(500).json({ error: 'Error generating image URL.' }); + }); + + bannerProducts.push({ + _id: new mongoose.Types.ObjectId(), + name: product.name, + image: imageUrl, + price: product.price, + }); + } + + const banner = new Banner({ + _id: new mongoose.Types.ObjectId(), + name, + percentage, + bannerImage, + products: bannerProducts, + }); + + const savedBanner = await banner.save(); + res.status(201).json({ message: 'Banner created successfully', savedBanner }); + } catch (error) { + console.error('Error in creating banner:', error); + res.status(500).json({ error: error.message }); + } +}); + +router.get("/", function (req, res) { + Banner.find() + .exec() + .then((data) => { + console.log(data) + try { + const response = { + count: data.length, + products: data + }; + res.status(200).json(response); + } catch (e) { + res.status(400).json({ + error: e + }); + } + + }) + .catch((error) => { + res.status(400).json({ + error: error + }); + }) +}); + +module.exports = router; + + diff --git a/routes/category.js b/routes/category.js new file mode 100644 index 0000000000000000000000000000000000000000..ca45f2ee0e67c0c11b34244cd6408d41c9ab839c --- /dev/null +++ b/routes/category.js @@ -0,0 +1,128 @@ +const Category = require("../Database/models/category"); +const express = require("express"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const router = express.Router(); +const firebase = require("../utils/firebase"); +const { filePath } = require("../utils/upladImageUtils"); +const multer = require('multer'); +var imageUrl = "" + + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +router.get("/", async (req, res) => { + const categoryList = await Category.find(); + + if (!categoryList) { + res.status(500).json({ success: false }); + } + res.status(200).send( + categoryList); +}); + + +//GetCategory +router.get("/:id", async (req, res) => { + const category = await Category.findById(req.params.id); + + if (!category) { + res + .status(500) + .json({ message: "the category with the given ID not found" }); + } + res.status(200).send(category); +}); + + +//Add +router.post("/", upload.single('file'), async (req, res) => { + + await firebase.uploadFile(req.file.path, "hijab/" + req.file.filename) + await firebase.generateSignedUrl("hijab/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body); + let category = new Category({ + name: req.body.name, + description: req.body.description, + image: imageUrl, + link: req.body.link, + }); + category.save() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)) + }).catch(error => { + res.status(400).send(responseAddProduct(false,)); + }) +}); + + +//Upadte +router.put("/:id", async (req, res) => { + const category = await Category.findByIdAndUpdate( + req.params.id, + { + name: req.body.name, + icon: req.body.icon, + color: req.body.color, + }, + { new: true } + ); + + if (!category) return res.status(400).send("the category cannot be created"); + + res.send(category); +}); + + +//delete +router.delete("/:id", (req, res) => { + Category.findByIdAndRemove(req.params.id) + .then((category) => { + if (category) { + return res + .status(200) + .json({ success: true, message: "the category deleted" }); + } else { + return res + .status(404) + .json({ success: false, message: "categry not found" }); + } + }) + .catch((err) => { + return res.status(400).json({ success: false, error: err }); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/changePassword.js b/routes/changePassword.js new file mode 100644 index 0000000000000000000000000000000000000000..a1c566ae3b82996c689f117b72d997999210b63e --- /dev/null +++ b/routes/changePassword.js @@ -0,0 +1,48 @@ +var express = require('express'); +var router = express.Router(); +var app = express(); +var User = require('../Database/models/user'); +const bcrypt = require("bcrypt"); +const { successResponse, failedResponse } = require('../utils/responseModel'); + +router.post('/', async function (req, res, next) { + + var newPassword = req.body.newPassword; + var cnfrmNewPassword = req.body.cnfrmNewPassword; + + // generate salt to hash password + const salt = await bcrypt.genSalt(10); + // now we set user password to hashed password + const password = await bcrypt.hash(newPassword, salt); + + const updateOps = { + password: password, + passwordConf: cnfrmNewPassword + }; + console.log(updateOps); + try { + const { email } = req.body; + // Find the user by email + const user = await User.findOne({ email: email }).exec(); + + if (user) { + // Update the user's password + await User.updateOne({ email: user.email }, { $set: updateOps }).exec(); + res.status(200).send(successResponse("Password changed successfully!")); + } else { + res.status(201).send(failedResponse("Email not registered!", 400)); + } + } catch (err) { + console.error(err); + res.status(500).send(failedResponse(err.message, 500)); + } + + // } + // else { + // res.send(failedResponse("Password not matched")); + // } + +}); + + +module.exports = router; \ No newline at end of file diff --git a/routes/cmd.js b/routes/cmd.js new file mode 100644 index 0000000000000000000000000000000000000000..656ef3f2725f0fb08bb25fd3dc2f66742e950092 --- /dev/null +++ b/routes/cmd.js @@ -0,0 +1,173 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const User = require('../Database/models/user'); +const Post = require('../Database/models/newPost'); +const Comment = require('../Database/models/comments'); +const response = require('../utils/responseModel'); + + + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/fruits'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 10 + }, + fileFilter: fileFilter +}); + +router.post('/create', upload.single('file'), async (req, res, next) => { + console.log(req.body); + const userData = await User.findOne({ unique_id: req.body.userId }).exec(); + if (!userData) { + res.send(response.failedResponse('Data not found!')) + } else { + console.log(" Data => " + userData) + + Post.findOne({ _id: req.body.postId }, function (err, postData) { + if (!postData) { + res.status(500).json({ error: 'Post not found!' }); + } else { + var comment = Comment({ + user: userData, + post: postData, + userId: req.body.userId, + comment: req.body.comment, + likes: userData + }) + + comment.save() + .then((post) => { + res.status(200).json(post); + }) + .catch((error) => { + res.status(500).json({ error: 'An error occurred while creating the post.' }); + }); + + } + + }); + } +}); + +router.get('/:id', async (req, res, next) => { + const postData = await Post.findOne({ _id: req.params.id }).exec(); + if (!postData) { + res.status(500).json({ error: 'Post not found!' }); + } else { + const comments = await Comment.find({ post: postData }) + .sort({ createdAt: 'descending' }); + if (!comments) { + res.status(500).json({ error: 'Comments not found!' }); + } else { + res.status(200).json({ + status: 'success', + count: comments.length, + comments, + }); + } + } +}); + +router.get('/byId', async (req, res, next) => { + const post = await Post.findById(req.params.id).populate({ + path: 'profile', + select: '-bio -website -user -_v', + }); + + if (!post) { + return next(new AppError('Post not found', 400)); + } + + res.status(200).json({ + status: 'success', + post, + }); +}); + +router.delete('/', async (req, res, next) => { + //const post = await Post.deleteOne({ _id: req.params.id }); + const post = await Post.findById(req.params.id); + if (!post) { + return next(new AppError('Post not found', 400)); + } + // console.log(post, post.user.toString() === req.user.id) + if (post.user.toString() !== req.user.id) { + return next( + new AppError('You are not authorized to delete this post', 401) + ); + } + + post.commentsPost.length && + (await Comment.findByIdAndDelete(post.commentsPost[0]._id)); + + await post.remove(); + + res.status(200).json({ + message: 'deleted', + }); +}); + +router.post('/like', async (req, res, next) => { + const post = await Post.findById(req.params.id).populate('profile'); + + if (!post) { + return next(new AppError('Post not found', 400)); + } + const id = await post.getProfileId(req.user.id); + + if (post.likes.includes(id)) { + const index = post.likes.indexOf(id); + post.likes.splice(index, 1); + await post.save((err) => { + console.log(err); + }); + await Notification.deleteMany({ + to: post.profile._id, + user: id, + type: 'Like', + }); + } else { + post.likes.push(id); + await post.save(); + } + + res.status(200).json({ + status: 'success', + post, + }); +}); + +router.delete('/:id', async (req, res) => { + Comment.remove({ _id: req.params.id }) + .exec() + .then(result => { + res.status(200).send(response.successResponse(result)); + }) + .catch(error => { + res.send(500).send(response.failedResponse(error)) + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/comment.js b/routes/comment.js new file mode 100644 index 0000000000000000000000000000000000000000..0307ced71ab2341d6f54b15825693b4d66aff9d0 --- /dev/null +++ b/routes/comment.js @@ -0,0 +1,57 @@ +const express = require("express"); +const router = express.Router(); +const User = require('../models/user'); +const Post = require('../models/postNews'); +const Comment = require('../models/comments'); +const response = require('../utils/responseModel'); + + +router.post('/', async (req, res) => { + console.log(req.body) + User.findOne({ unique_id: req.body.userId }, function (err, data) { + if (!data) { + res.send(failedResponse('Data not found!')) + } else { + console.log(" Data => " + data) + Post.findOne({ postId: req.body.postId }, function (err, postData) { + if (!postData) { + res.send(failedResponse('Data not found!: ' + err)) + } else { + var comment = Comment({ + user: data, + post: postData, + userId: req.body.userId, + text: req.body.comment + }) + + comment.save() + .then((post) => { + res.status(200).json(post); + }) + .catch((error) => { + res.status(500).json({ error: 'An error occurred while creating the post.' }); + }); + + } + + }) + } + }); + +}); + + +router.delete('/:id', async (req, res) => { + + Comment.remove({ _id: req.params.id }) + .exec() + .then(result => { + res.status(200).send(response.successResponse(result)); + }) + .catch(error => { + res.send(500).send(response.failedResponse(error)) + }); + +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/confirmOrder.js b/routes/confirmOrder.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/routes/dairy.js b/routes/dairy.js new file mode 100644 index 0000000000000000000000000000000000000000..51244de87a853e50104db0b147d7a6191d3be77e --- /dev/null +++ b/routes/dairy.js @@ -0,0 +1,125 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const Dairy = require("../Database/models/dairy"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/dairy'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "Dairy/" + req.file.filename) + await firebase.generateSignedUrl("Dairy/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + const dairy = Dairy({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + dairy + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + Dairy.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('dairyImage'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + console.log(updateOps); + Dairy.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + Dairy.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + res.status(500).send(responseFetchProduct(false, err)); + console.log(err); + }); +}); + + + + +module.exports = router; diff --git a/routes/driedNoodles.js b/routes/driedNoodles.js new file mode 100644 index 0000000000000000000000000000000000000000..c56cebc8beb017b7a2cb41034a292e0d72196b8a --- /dev/null +++ b/routes/driedNoodles.js @@ -0,0 +1,128 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const DriedNoodles = require("../Database/models/DriedNoodles") +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); + +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/webp') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "DriedNoodles/" + req.file.filename) + await firebase.generateSignedUrl("DriedNoodles/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const fruites = DriedNoodles({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + fruites + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + DriedNoodles.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('fruitImage'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + console.log(updateOps); + DriedNoodles.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send( + responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + DriedNoodles.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send( + responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + + + +module.exports = router; diff --git a/routes/drinks.js b/routes/drinks.js new file mode 100644 index 0000000000000000000000000000000000000000..dd549a6c96448aeb7fd4d5819c851b022feef8e1 --- /dev/null +++ b/routes/drinks.js @@ -0,0 +1,125 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const Drinks = require("../Database/models/drinks"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/drinks'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res) => { + + await firebase.uploadFile(req.file.path, "Drinks/" + req.file.filename) + await firebase.generateSignedUrl("Drinks/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const drinks = Drinks({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + drinks + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + +//Get products +router.get("/", (req, res, next) => { + Drinks.find() + .exec() + .then(result => { + res.status(200).send( + responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('drinksImage'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + console.log(updateOps); + Drinks.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send( + responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + Vegetables.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send( + responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + +module.exports = router; diff --git a/routes/fcm.js b/routes/fcm.js new file mode 100644 index 0000000000000000000000000000000000000000..c240f7d700c0b57742d2ce8b94571a78247c733c --- /dev/null +++ b/routes/fcm.js @@ -0,0 +1,75 @@ +var express = require('express'); +var router = express.Router(); +var FCM = require('fcm-node'); +var serverKey = 'AAAAKXRRooI:APA91bH9pMJziYPRNRI2XyMaSIG_e5a-eJzxMSkaozaCrmCencitDrTul4XyrVAV87K6d-56zGJC49y7Cz6mTRpcxca16QzmF1TF8EW7OmxHPvcQdseHWoD3TIAe62u2gfY0pVXlhJ8Y' +var fcm = new FCM(serverKey); +var User = require('../Database/models/user'); +const { successResponse, failedResponse } = require('../utils/responseModel'); +// const admin = require('firebase-admin'); +const admin = require("../utils/firebase") + +// Initialize the Firebase Admin SDK (replace with your credentials) +// admin.initializeApp({ +// credential: admin.credential.cert(require('../push-notification-key.json')) +// }); + +router.post('/pushToken', async function (req, res) { + var unique_idValue = req.body.unique_id; + var pushTokenValue = req.body.pushToken; + try { + const data = await User.findOne({ unique_id: unique_idValue }); + if (data) { + User.updateOne({ + unique_id + : data.unique_id + }, { + $set: { + pushToken: pushTokenValue + } + }).exec() + .then(result => { + res.status(200).send(successResponse("Push token updated.")); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); + } else { + res.status(201).send(failedResponse("User not found!")); + } + } catch (e) { + res.status(500).send(failedResponse(e)); + } +}); + + + +router.post('/push', async (req, res) => { + try { + const deviceToken = req.body.deviceToken; + const title = req.body.title; + const bodyText = req.body.bodyText; + + const message = { + token: deviceToken, + notification: { + title: title, + body: bodyText, + }, + android: { + priority: "high", + }, + }; + + // Send message via Firebase Admin SDK + const response = await admin.messaging().send(message); + res.status(200).send(response); + } catch (err) { + res.status(400).send("Something has gone wrong! => " + err.message); + console.error("Error sending message:", err); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/forgotPassword.js b/routes/forgotPassword.js new file mode 100644 index 0000000000000000000000000000000000000000..ad3d27ab9083f4a32ce52634c574c217da54a19a --- /dev/null +++ b/routes/forgotPassword.js @@ -0,0 +1,214 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const exphbs = require('express-handlebars'); +var nodemailer = require('nodemailer'); +var User = require('../Database/models/user'); +const { successResponse, failedResponse } = require("../utils/responseModel"); + +var otp = Math.random(); +otp = otp * 10000; +otp = parseInt(otp); + + +var transporter = nodemailer.createTransport({ + + service: 'gmail', + + auth: { + user: 'abubasith456@gmail.com', // here use your real email + pass: 'vmllbwfiehtqaeep' // put your password correctly (not in this question please) + } +}); + +router.post('/', async (req, res, next) => { + try { + var email = req.body.email; + console.log(email); + + var newOtpValue = Math.floor(1000 + Math.random() * 9000); + + const data = await User.findOne({ email: email }); + + if (data) { + console.log(data); + //find the user using unique id for update token. + User.updateOne({ + unique_id + : data.unique_id + }, { + $set: { + token: newOtpValue + } + }).exec() + .then(result => { + //Generate Main formate how you send. + var mailOptions = { + priority: "high", + from: 'hayatstore200@gmail.com', + to: email, + subject: `OTP for frogot password`, + html: `
+
+
+ Hayat Store +
+

Hi ${data.username},

+

Thank you for choosing the Hayat. Use the following OTP to complete your forgot password procedures. OTP is valid for 2 minutes

+

${newOtpValue}

+

Regards,
Hayat Store

+
+
+

Hayat Store Inc

+

Tamil Nadu,

+

Nagapattinum dt,

+

Enangudi.

+
+
+
` // html body + }; + console.log(mailOptions); + transporter.sendMail(mailOptions, (error, info) => { + if (error) { + res.status(201).send(failedResponse(error)); + console.log('Error found' + error); + } else { + //Success message + res.status(200).send(successResponse("OTP sent to your email!")); + console.log(''); + } + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); + + + + } else { + res.send(failedResponse("Invalid user!")) + } + + } catch (error) { + res.status(500).send(failedResponse(error)); + } + +}); + + +//Verify the otp +router.post('/verify', async (req, res, next) => { + try { + var email = req.body.email; + console.log(req.body.otp) + + const data = await User.findOne({ email: email }); + if (data) { + if (data.token == req.body.otp) { + + User.updateOne({ + unique_id + : data.unique_id + }, { + $set: { + token: "" + } + }).exec() + .then(result => { + res.send(successResponse("Verified successfully!")) + }); + otp = 0; + + } + else { + res.send(failedResponse("Invalid OTP!")); + } + } else { + res.send(failedResponse("Data not found!")); + } + + } catch (err) { + res.send(failedResponse(err)); + } +}); + + +//Resend the otp +router.post('/resend', async function (req, res) { + try { + var email = req.body.email; + console.log(email); + var newOtpValue = Math.floor(1000 + Math.random() * 9000); + + const data = await User.findOne({ email: email }); + + if (data) { + console.log(data); + //find the user using unique id for update token. + User.updateOne({ + unique_id + : data.unique_id + }, { + $set: { + token: newOtpValue + } + }).exec() + .then(result => { + //Generate Main formate how you send. + var mailOptions = { + priority: "high", + from: 'hayatstore@gmail.com', + to: 'abubasith143@gmail.com ', + subject: `OTP for frogot password`, + html: `
+
+
+ Hayat Store +
+

Hi ${data.username},

+

Thank you for choosing the Hayat. Use the following OTP to complete your forgot password procedures. OTP is valid for 1 minutes

+

${newOtpValue}

+

Regards,
Hayat Store

+
+
+

Hayat Store Inc

+

Tamil Nadu,

+

Nagapattinum dt,

+

Enangudi.

+
+
+
` // html body + }; + console.log(mailOptions); + transporter.sendMail(mailOptions, (error, info) => { + if (error) { + res.status(400).send(failedResponse(error)); + console.log('Error found' + error); + } else { + //Success message + res.send(successResponse("OTP sent to your email!")); + console.log('OTP sent to your email!'); + } + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); + } else { + res.status(400).send(failedResponse("Invalid user!")) + } + + } catch (error) { + res.status(400).send(failedResponse(err)); + } + +}); + + +module.exports = router; \ No newline at end of file diff --git a/routes/fruits.js b/routes/fruits.js new file mode 100644 index 0000000000000000000000000000000000000000..b176d1ffefe42f6113cbe99931d85694d238be7a --- /dev/null +++ b/routes/fruits.js @@ -0,0 +1,123 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const Fruites = require("../Database/models/fruits"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/fruits'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "Fruites/" + req.file.filename) + await firebase.generateSignedUrl("Fruites/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const fruites = Fruites({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + fruites + .save() + .then(result => { + console.log(result); + res.status(200).send(responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + Fruites.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('file'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + console.log(updateOps); + Fruites.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + Fruites.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + + + +module.exports = router; diff --git a/routes/grocery.js b/routes/grocery.js new file mode 100644 index 0000000000000000000000000000000000000000..8ff6517b67aac1b82ad50fab55c977a14c5fdac4 --- /dev/null +++ b/routes/grocery.js @@ -0,0 +1,127 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const Grocery = require("../Database/models/gocery"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/grocery'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 10 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + + await firebase.uploadFile(req.file.path, "Grocery/" + req.file.filename) + await firebase.generateSignedUrl("Grocery/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const grocery = Grocery({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + grocery + .save() + .then(result => { + console.log(result); + res.status(200).send(responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + Grocery.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('file'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + + + const updateOps = {}; + + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + Grocery.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + Grocery.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + + + +module.exports = router; diff --git a/routes/healthCare.js b/routes/healthCare.js new file mode 100644 index 0000000000000000000000000000000000000000..65ae2607f37aff5d2a9296f551fcacd6a3a719e6 --- /dev/null +++ b/routes/healthCare.js @@ -0,0 +1,126 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const HealthCare = require("../Database/models/healthCare"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); + +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/healthCare'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "HealthCare/" + req.file.filename) + await firebase.generateSignedUrl("HealthCare/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const fruites = HealthCare({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + fruites + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + HealthCare.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('file'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + console.log(updateOps); + HealthCare.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + HealthCare.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + + + +module.exports = router; diff --git a/routes/home.js b/routes/home.js new file mode 100644 index 0000000000000000000000000000000000000000..0a7fe648c123edded00f2827a9ffee4abcf45421 --- /dev/null +++ b/routes/home.js @@ -0,0 +1,80 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const DriedNoodles = require("../Database/models/DriedNoodles") +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const Banner = require("../Database/models/banner") +const Category = require("../Database/models/category") +const Order = require("../Database/models/order"); +const Products = require("../Database/models/product"); +const User = require("../Database/models/user"); +const featureProduct = require("../Database/mufiModels/featureProduct"); + +router.get("/", async (req, res, next) => { + try { + const userId = req.query.id; + console.log("UserId -> ", userId); + const bannersList = await Banner.find(); + const categoryList = await Category.find(); + let userData = {} + let ordersList = {} + try { + ordersList = await Order.find({ unique_id: userId }); + const tempData = await User.findOne({ unique_id: userId }); + userData = tempData.toObject(); + delete userData.passwordConf; + delete userData.password; + delete userData.pushToken; + console.log(userData); + } catch (err) { + console.log(err) + } + + const featureProductList = await featureProduct.find() + const productsList = await Products.find(); + + const response = { + user: userData, + banner: bannersList, + categories: categoryList, + // recentPurchase: ordersList, + products: featureProductList ?? productsList + } + + res.status(200).send(responseFetchProduct(true, response)) + + } catch (e) { + res.status(500).send(responseFetchProduct(false, e)) + } +}); + + +// router.get("/:id", async (req, res) => { +// try { +// const bannersList = await Banner.find(); +// const categoryList = await Category.find(); +// const ordersList = {} +// try { +// ordersList = await Order.find({ unique_id: req.params.id }); +// } catch (err) { +// console.log(err) +// } +// const productsList = await Products.find(); + +// const response = { +// banner: bannersList, +// categories: categoryList, +// recentPurchase: ordersList, +// products: productsList +// } + +// res.status(200).send(responseFetchProduct(true, response)) + +// } catch (e) { +// res.status(500).send(responseFetchProduct(false, e)) +// } + +// }); + +module.exports = router; \ No newline at end of file diff --git a/routes/login.js b/routes/login.js new file mode 100644 index 0000000000000000000000000000000000000000..8d775f0a07322ac90f21ad2e9da75f2fdf01bb90 --- /dev/null +++ b/routes/login.js @@ -0,0 +1,93 @@ +var express = require('express'); +var router = express.Router(); +var User = require('../Database/models/user'); +const bcrypt = require("bcrypt"); +const { profileResponse, failedResponse, successResponse } = require('../utils/responseModel'); +const verifyGoogleToken = require('../core/auth'); + +// Middleware to parse JSON bodies +router.use(express.json()); + +// Utility function to generate unique_id +async function generateUniqueId() { + const lastUser = await User.findOne({}).sort({ _id: -1 }).limit(1); + return lastUser ? lastUser.unique_id + 1 : 1; +} + +// Login user +router.post('/', async function (req, res, next) { + const { email, mobileNumber, password, googleToken } = req.body; + + // Validate input + if (!email && !mobileNumber && !googleToken) { + return res.status(400).send(failedResponse('Please provide email, mobile number, or Google token.')); + } + + try { + let user; + // If Google token is provided, handle Google login + if (googleToken) { + // Verify Google token and get user information + const googleUserDetails = await verifyGoogleToken(googleToken); + const googleUser = googleUserDetails.getPayload(); + console.log("Google user = ", googleUser.name); + console.log("Google user = ", googleUser.email); + // Find user by Google ID + await User.findOne({ email: googleUser.email }).exec().then(async (existUser) => { + if (existUser) { + user = existUser; + } else { + console.log(" User not found!"); + // If user is not found, create a new user + const generatedUniqueId = await generateUniqueId(); + const googleUserId = googleUserDetails.getUserId(); + const password = googleUser.email + "/" + googleUserId; + const hashedPassword = await bcrypt.hash(password, 10); + + const newUser = new User({ + unique_id: generatedUniqueId, // Implement this function to generate a unique ID + email: googleUser.email, + username: googleUser.name, + profilePic: googleUser.picture, + googleId: googleUserId, + password: hashedPassword + // Add other fields if needed + }); + console.log(newUser); + await newUser.save(); // Save the new user to the database + user = newUser; + } + }); // Use .exec() to ensure a promise is returned + } else { + // Handle email or mobile number login + if (email) { + user = await User.findOne({ email }); + } else if (mobileNumber) { + user = await User.findOne({ mobileNumber }); + } + + if (!user) { + return res.status(201).send(failedResponse('User not found.')); + } + + // Validate password if email or mobile number is used + if (password) { + const validPassword = await bcrypt.compare(password, user.password); + if (!validPassword) { + return res.status(400).send(failedResponse('Wrong password.')); + } + } + } + + // // Success + // req.userId = user.unique_id; // Set user ID in session or handle as needed + // console.log(user); + res.status(200).send(profileResponse("Login successful", 200, user)); + } catch (err) { + // Handle errors + console.error(err); + res.status(500).send(failedResponse('Internal server error.')); + } +}); + +module.exports = router; diff --git a/routes/logout.js b/routes/logout.js new file mode 100644 index 0000000000000000000000000000000000000000..a067822260512f569b20844ee92e6217ff087de0 --- /dev/null +++ b/routes/logout.js @@ -0,0 +1,36 @@ +var express = require('express'); +var router = express.Router(); +var app = express(); +var User = require('../models/user'); +const bcrypt = require("bcrypt"); +const jwt = require("jsonwebtoken"); + + +router.post('/logout', function (req, res, next) { + + var session = { + "cookie": { + path: '/', _expires: null, + originalMaxAge: null, + httpOnly: true + }, + userId: req.body.user_id + } + console.log(session) + + if (session) { + // delete session object + req.session.destroy(function (err) { + if (err) { + return res.send(failedResponse("Logout failed!")) + + } else { + return res.send(successResponse('Logout success')); + + } + }); + req.session.destroy; + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/musfiRouters/featureProducts/featureProductsController.js b/routes/musfiRouters/featureProducts/featureProductsController.js new file mode 100644 index 0000000000000000000000000000000000000000..ad6d8c29f7437f3ee8e691901880806760d0d36f --- /dev/null +++ b/routes/musfiRouters/featureProducts/featureProductsController.js @@ -0,0 +1,112 @@ +const featureProducts = require("../../../Database/mufiModels/featureProduct"); +const { AppError } = require("../../../utils/AppError"); +const catchAsyncError = require("../../../utils/catchAsyncError"); +const firebase = require("../../../utils/firebase"); +const { responseFetchProduct } = require("../../../utils/responseModel"); + + +const addFeatureProducts = catchAsyncError(async (req, res, next) => { + try { + + let imageUrls = []; + for (let file of req.files) { + const imageName = file.filename; + const imagePath = file.path + let imageUrl = ''; + await firebase.uploadFile(imagePath, "featureProducts/" + imageName); + await firebase.generateSignedUrl("featureProducts/" + imageName) + .then(url => { + imageUrl = url; + }) + .catch(e => { + console.log(e); + }); + + imageUrls.push(imageUrl); // Collect the signed URLs of the images + } + + const addProduct = new featureProducts({ + ...req.body, // Get non-file data from req.body + images: imageUrls, // Save the image URLs + }); + await addProduct.save(); + + res.status(201).json({ message: "success", addProduct }); + } catch (e) { + res.status(500).json({ message: e }); + + } +}); + +const updateFeatureProducts = catchAsyncError(async (req, res, next) => { + try { + const { id } = req.params; // Get the hijab ID from the route params + + // Find the hijab by ID in the database + const featureProducts = await featureProducts.findById(id); + if (!featureProducts) { + return res.status(404).json({ message: "Hijab not found." }); + } + + // Process file uploads (if any) + let imageUrls = featureProducts.image; // Keep old images if no new ones are uploaded + if (req.files && req.files.length) { + imageUrls = []; // Clear existing images if new ones are uploaded + for (let file of req.files) { + let imageUrl = ''; + await firebase.uploadFile(file.path, "featureProducts/" + file.filename); + await firebase.generateSignedUrl("featureProducts/" + file.filename) + .then(url => { + imageUrl = url; + }) + .catch(e => { + console.log(e); + }); + imageUrls.push(imageUrl); // Save new image URLs + } + } + + // Update the hijab product with the new data + featureProducts.name = req.body.name || featureProducts.name; // Keep old name if no new name + featureProducts.percentage = req.body.percentage || featureProducts.percentage; // Keep old percentage if no new percentage + featureProducts.images = imageUrls; // Update images + + // Save the updated product + await featureProducts.save(); + + res.status(200).json({ message: "Hijab updated successfully", featureProducts: featureProducts }); + } catch (e) { + res.status(500).json({ message: "Failed", error: e.message }); + } +}); + +const getFeatureProducts = catchAsyncError(async (req, res, next) => { + featureProducts.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +const deleteFeatureProducts = catchAsyncError(async (req, res, next) => { + const { id } = req.params; + featureProducts.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).json({ + message: 'Product deleted!', + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + +module.exports = { addFeatureProducts, updateFeatureProducts, getFeatureProducts, deleteFeatureProducts }; \ No newline at end of file diff --git a/routes/musfiRouters/featureProducts/featureProductsRouter.js b/routes/musfiRouters/featureProducts/featureProductsRouter.js new file mode 100644 index 0000000000000000000000000000000000000000..c1bfbe0dfb02aad14ea0be2e8ad11c040689f0c8 --- /dev/null +++ b/routes/musfiRouters/featureProducts/featureProductsRouter.js @@ -0,0 +1,23 @@ +const express = require("express"); +const hijabsController = require("./featureProductsController"); +const upload = require("../../../utils/multerConfig"); +const featureRoute = express.Router(); + +featureRoute + .post("/", + upload.any(), + hijabsController.addFeatureProducts + ) + .put("/:id", + upload.any(), + hijabsController.updateFeatureProducts + ) + .get("/", + hijabsController.getFeatureProducts + ) + .delete("/:id", + hijabsController.deleteFeatureProducts + ) + +module.exports = featureRoute; + diff --git a/routes/musfiRouters/hijabs/hijabsController.js b/routes/musfiRouters/hijabs/hijabsController.js new file mode 100644 index 0000000000000000000000000000000000000000..be024ea9ee7088e0576c1ab3dbc739ae93ee4bc7 --- /dev/null +++ b/routes/musfiRouters/hijabs/hijabsController.js @@ -0,0 +1,112 @@ +const hijabs = require("../../../Database/mufiModels/hijabs"); +const { AppError } = require("../../../utils/AppError"); +const catchAsyncError = require("../../../utils/catchAsyncError"); +const firebase = require("../../../utils/firebase"); +const { responseFetchProduct } = require("../../../utils/responseModel"); + + +const addHijab = catchAsyncError(async (req, res, next) => { + try { + + let imageUrls = []; + for (let file of req.files) { + const imageName = file.filename; + const imagePath = file.path + let imageUrl = ''; + await firebase.uploadFile(imagePath, "hijabs/" + imageName); + await firebase.generateSignedUrl("hijabs/" + imageName) + .then(url => { + imageUrl = url; + }) + .catch(e => { + console.log(e); + }); + + imageUrls.push(imageUrl); // Collect the signed URLs of the images + } + + const addProduct = new hijabs({ + ...req.body, // Get non-file data from req.body + images: imageUrls, // Save the image URLs + }); + await addProduct.save(); + + res.status(201).json({ message: "success", addProduct }); + } catch (e) { + res.status(500).json({ message: e.message }); + + } +}); + +const updateHijab = catchAsyncError(async (req, res, next) => { + try { + const { id } = req.params; // Get the hijab ID from the route params + + // Find the hijab by ID in the database + const hijab = await hijabs.findById(id); + if (!hijab) { + return res.status(404).json({ message: "Hijab not found." }); + } + + // Process file uploads (if any) + let imageUrls = hijab.image; // Keep old images if no new ones are uploaded + if (req.files && req.files.length) { + imageUrls = []; // Clear existing images if new ones are uploaded + for (let file of req.files) { + let imageUrl = ''; + await firebase.uploadFile(file.path, "hijabs/" + file.filename); + await firebase.generateSignedUrl("hijabs/" + file.filename) + .then(url => { + imageUrl = url; + }) + .catch(e => { + console.log(e); + }); + imageUrls.push(imageUrl); // Save new image URLs + } + } + + // Update the hijab product with the new data + hijab.name = req.body.name || hijab.name; // Keep old name if no new name + hijab.percentage = req.body.percentage || hijab.percentage; // Keep old percentage if no new percentage + hijab.images = imageUrls; // Update images + + // Save the updated product + await hijab.save(); + + res.status(200).json({ message: "Hijab updated successfully", hijab }); + } catch (e) { + res.status(500).json({ message: "Failed", error: e.message }); + } +}); + +const getHijabs = catchAsyncError(async (req, res, next) => { + hijabs.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +const deleteHijabs = catchAsyncError(async (req, res, next) => { + const { id } = req.params; + hijabs.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).json({ + message: 'Product deleted!', + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + +module.exports = { addHijab, updateHijab, getHijabs, deleteHijabs }; \ No newline at end of file diff --git a/routes/musfiRouters/hijabs/hijabsRouter.js b/routes/musfiRouters/hijabs/hijabsRouter.js new file mode 100644 index 0000000000000000000000000000000000000000..20a8394a4ba6b87280245f94274f2b82e4fd3e19 --- /dev/null +++ b/routes/musfiRouters/hijabs/hijabsRouter.js @@ -0,0 +1,23 @@ +const express = require("express"); +const hijabsController = require("./hijabsController"); +const upload = require("../../../utils/multerConfig"); +const hijabRouter = express.Router(); + +hijabRouter + .post("/", + upload.any(), + hijabsController.addHijab + ) + .put("/:id", + upload.any(), + hijabsController.updateHijab + ) + .get("/", + hijabsController.getHijabs + ) + .get("/:id", + hijabsController.deleteHijabs + ) + +module.exports = hijabRouter; + diff --git a/routes/musfiRouters/scarfs/scarfsController.js b/routes/musfiRouters/scarfs/scarfsController.js new file mode 100644 index 0000000000000000000000000000000000000000..6d9b11f7985ea6c8e987f59178b760efbfcde67c --- /dev/null +++ b/routes/musfiRouters/scarfs/scarfsController.js @@ -0,0 +1,112 @@ +const scarfs = require("../../../Database/mufiModels/scarfs"); +const { AppError } = require("../../../utils/AppError"); +const catchAsyncError = require("../../../utils/catchAsyncError"); +const firebase = require("../../../utils/firebase"); +const { responseFetchProduct } = require("../../../utils/responseModel"); + + +const addScarf = catchAsyncError(async (req, res, next) => { + try { + + let imageUrls = []; + for (let file of req.files) { + const imageName = file.filename; + const imagePath = file.path + let imageUrl = ''; + await firebase.uploadFile(imagePath, "scarfs/" + imageName); + await firebase.generateSignedUrl("scarfs/" + imageName) + .then(url => { + imageUrl = url; + }) + .catch(e => { + console.log(e); + }); + + imageUrls.push(imageUrl); // Collect the signed URLs of the images + } + + const addProduct = new scarfs({ + ...req.body, // Get non-file data from req.body + images: imageUrls, // Save the image URLs + }); + await addProduct.save(); + + res.status(201).json({ message: "success", addProduct }); + } catch (e) { + res.status(500).json({ message: e.message }); + + } +}); + +const updateScarf = catchAsyncError(async (req, res, next) => { + try { + const { id } = req.params; // Get the hijab ID from the route params + + // Find the hijab by ID in the database + const scarf = await scarfs.findById(id); + if (!scarf) { + return res.status(404).json({ message: "Hijab not found." }); + } + + // Process file uploads (if any) + let imageUrls = scarf.image; // Keep old images if no new ones are uploaded + if (req.files && req.files.length) { + imageUrls = []; // Clear existing images if new ones are uploaded + for (let file of req.files) { + let imageUrl = ''; + await firebase.uploadFile(file.path, "scarfs/" + file.filename); + await firebase.generateSignedUrl("scarfs/" + file.filename) + .then(url => { + imageUrl = url; + }) + .catch(e => { + console.log(e); + }); + imageUrls.push(imageUrl); // Save new image URLs + } + } + + // Update the hijab product with the new data + scarf.name = req.body.name || scarf.name; // Keep old name if no new name + scarf.percentage = req.body.percentage || scarf.percentage; // Keep old percentage if no new percentage + scarf.images = imageUrls; // Update images + + // Save the updated product + await scarf.save(); + + res.status(200).json({ message: "Scarf updated successfully", scarfs: scarf }); + } catch (e) { + res.status(500).json({ message: "Failed", error: e.message }); + } +}); + +const getScarf = catchAsyncError(async (req, res, next) => { + scarfs.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +const deleteScarf = catchAsyncError(async (req, res, next) => { + const { id } = req.params; + scarfs.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).json({ + message: 'Product deleted!', + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + +module.exports = { addScarf , updateScarf , getScarf , deleteScarf }; \ No newline at end of file diff --git a/routes/musfiRouters/scarfs/scarfsRouter.js b/routes/musfiRouters/scarfs/scarfsRouter.js new file mode 100644 index 0000000000000000000000000000000000000000..20cf4b2fc3342198f9bb391a1a0b3d8c8042c0f7 --- /dev/null +++ b/routes/musfiRouters/scarfs/scarfsRouter.js @@ -0,0 +1,23 @@ +const express = require("express"); +const scarfsController = require("./scarfsController"); +const upload = require("../../../utils/multerConfig"); +const scarfsRouter = express.Router(); + +scarfsRouter + .post("/", + upload.any(), + scarfsController.addScarf + ) + .put("/:id", + upload.any(), + scarfsController.updateScarf + ) + .get("/", + scarfsController.getScarf + ) + .get("/:id", + scarfsController.deleteScarf + ) + +module.exports = scarfsRouter; + diff --git a/routes/newPost.js b/routes/newPost.js new file mode 100644 index 0000000000000000000000000000000000000000..9fccdc93e710bf001673092a47d887be4548e8b8 --- /dev/null +++ b/routes/newPost.js @@ -0,0 +1,159 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const User = require('../Database/models/user'); +const Post = require('../Database/models/newPost'); +const firebase = require("../utils/firebase"); +const { successResponse, failedResponse } = require("../utils/responseModel"); +var imageUrl = "" + + + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/fruits'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 10 + }, + fileFilter: fileFilter +}); + +router.post('/create', upload.single('file'), async (req, res, next) => { + console.log(req.body); + var image = []; + await firebase.uploadFile(req.file.path, req.file.filename) + await firebase.generateSignedUrl(req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + try { + const data = await User.findOne({ unique_id: req.body.userId }); + if (!data) { + res.send(failedResponse('Data not found!')) + } else { + console.log(" Data => " + data) + const newPost = await Post.create({ + user: data, + image: imageUrl, + caption: req.caption, + location: req.location, + likes: data, + profile: data, + }).then(result => { + res.status(200).send(successResponse(newPost)); + }).catch(error => { + res.status(500).send(failedResponse(error)); + }); + } + } catch (e) { + + } + +}); + +router.get('/', async (req, res, next) => { + const posts = await Post.find({}) + .sort({ createdAt: 'descending' }) + .populate('user'); + // const populatedPost = await posts.populate('profile').execPopulate(); + res.status(200).json({ + status: 'success', + count: posts.length, + posts, + }); +}); + +router.get('/byId', async (req, res, next) => { + const post = await Post.findById(req.params.id).populate({ + path: 'profile', + select: '-bio -website -user -_v', + }); + + if (!post) { + return next(new AppError('Post not found', 400)); + } + + res.status(200).json({ + status: 'success', + post, + }); +}); + +router.delete('/', async (req, res, next) => { + //const post = await Post.deleteOne({ _id: req.params.id }); + const post = await Post.findById(req.params.id); + if (!post) { + return next(new AppError('Post not found', 400)); + } + // console.log(post, post.user.toString() === req.user.id) + if (post.user.toString() !== req.user.id) { + return next( + new AppError('You are not authorized to delete this post', 401) + ); + } + + post.commentsPost.length && + (await Comment.findByIdAndDelete(post.commentsPost[0]._id)); + + await post.remove(); + + res.status(200).json({ + message: 'deleted', + }); +}); + +router.post('/like', async (req, res, next) => { + const post = await Post.findById(req.params.id).populate('profile'); + + if (!post) { + return next(new AppError('Post not found', 400)); + } + const id = await post.getProfileId(req.user.id); + + if (post.likes.includes(id)) { + const index = post.likes.indexOf(id); + post.likes.splice(index, 1); + await post.save((err) => { + console.log(err); + }); + await Notification.deleteMany({ + to: post.profile._id, + user: id, + type: 'Like', + }); + } else { + post.likes.push(id); + await post.save(); + } + + res.status(200).json({ + status: 'success', + post, + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/orders.js b/routes/orders.js new file mode 100644 index 0000000000000000000000000000000000000000..32abd538e2d2096236339ef392a6c3a2f2d54800 --- /dev/null +++ b/routes/orders.js @@ -0,0 +1,199 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +var axios = require('axios'); +const Order = require("../Database/models/order"); +const Product = require("../Database/models/product"); +var User = require('../Database/models/user'); +const pushApi = "https://fcm.googleapis.com/fcm/send"; +const { responseAddProduct, responseFetchProduct, failedResponse, successResponse } = require("../utils/responseModel"); + +//Post order +router.post("/", async (req, res, next) => { + try { + console.log(req.body); + const order = new Order(req.body); + const orders = await order.save(); + + if (orders) { + const data = await User.findOne({ unique_id: req.body.unique_id }) + console.log(data.pushToken); + if (data) { + /* var data = JSON.stringify({ + "content_available": true, + "priority": "high", + "to": data.pushToken, + "notification": { + "title": "Order Placed", + "body": "We are preparing your orders..." + } + }); */ + + var config = { + method: 'post', + url: pushApi, + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=AAAAKXRRooI:APA91bH9pMJziYPRNRI2XyMaSIG_e5a-eJzxMSkaozaCrmCencitDrTul4XyrVAV87K6d-56zGJC49y7Cz6mTRpcxca16QzmF1TF8EW7OmxHPvcQdseHWoD3TIAe62u2gfY0pVXlhJ8Y' + }, + data: data + }; + + axios(config) + .then(function (response) { + console.log(JSON.stringify(response.data)); + }) + .catch(function (error) { + console.log(error); + }); + } + + // If order placed it will send push notification to admin + // Who will deliver the order + const adminUsers = await User.find({ role: 'admin' }); + + if (adminUsers) { + await Promise.all(adminUsers.map(async (data) => { + console.log("Hope it will work" + data.pushToken) + var data = JSON.stringify({ + "content_available": true, + "priority": "high", + "to": data.pushToken, + "notification": { + "title": "Order Placed", + "body": "New order placed. Take ready :)" + } + }); + + var config = { + method: 'post', + url: pushApi, + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=AAAAKXRRooI:APA91bH9pMJziYPRNRI2XyMaSIG_e5a-eJzxMSkaozaCrmCencitDrTul4XyrVAV87K6d-56zGJC49y7Cz6mTRpcxca16QzmF1TF8EW7OmxHPvcQdseHWoD3TIAe62u2gfY0pVXlhJ8Y' + }, + data: data + }; + + axios(config) + .then(function (response) { + console.log(JSON.stringify(response.data)); + }) + .catch(function (error) { + console.log(error); + }); + + })); + } else { + console.log("Admin Users not found!") + } + } + + res.status(200).json(responseAddProduct(true, "Order placed!")); + + } catch (err) { + res.status(500).json(responseAddProduct(false, err)); + } +}); + +//UPDATE +router.put("/:id", async (req, res) => { + try { + console.log(req.params.id); + console.log(req.body); + + const data = await Order.updateOne({ _id: req.params.id }, + { $set: { status: req.body.status } }).exec(); + + if (data) { + try { + var statusText = "" + + if (req.body.status == "Cancelled" || req.body.status == "cancelled") { + statusText = "You're order is cancelled" + } else if (req.body.status == "Accepted" || req.body.status == "accepted") { + statusText = "You're order is accepted by the dealer :) " + } else if (req.body.status == "Preparing" || req.body.status == "preparing") { + statusText = "You're order is about to packing :) " + } + + const data = await User.findOne({ unique_id: req.body.unique_id }).exec(); + if (data) { + console.log(data.pushToken); + var config = { + method: 'post', + url: pushApi, + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'key=AAAAKXRRooI:APA91bH9pMJziYPRNRI2XyMaSIG_e5a-eJzxMSkaozaCrmCencitDrTul4XyrVAV87K6d-56zGJC49y7Cz6mTRpcxca16QzmF1TF8EW7OmxHPvcQdseHWoD3TIAe62u2gfY0pVXlhJ8Y' + }, + data: data + }; + axios(config) + .then(function (response) { + console.log(JSON.stringify(response.data)); + }) + .catch(function (error) { + console.log(error); + }); + } + } catch (e) { + console.log(e) + } + } else { + return res.status(201).send(failedResponse(err)) + } + } catch (err) { + console.log(err); + res.status(500).json(err); + } +}); + +// //GET USER ORDERS +// router.get("/:id", async (req, res) => { + +// console.log(req.params.unique_id); + +// try { +// const orders = await Order.find({ id: req.params.id }); +// res.status(200).json(orders); +// } catch (err) { +// res.status(500).json(err); +// } +// }); + +//find order by unique_id +router.get("/:unique_id", async (req, res, next) => { + try { + console.log(req.params.unique_id); + const orders = await Order.find({ unique_id: req.params.unique_id }); + res.status(200).json(orders); + } catch (err) { + res.status(500).json(err); + } +}); + +// //GET ALL +router.get("/", async (req, res) => { + try { + const orders = await Order.find(); + res.status(200).send(successResponse(orders)); + } catch (err) { + res.status(500).send(failedResponse(err)); + } +}); + + +//delete order +router.delete("/:orderId", async (req, res, next) => { + await Order.remove({ _id: req.params.orderId }) + .exec() + .then(result => { + res.status(200).json(successResponse(result)); + }) + .catch(err => { + res.status(500).json(failedResponse(err)); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/personalCare.js b/routes/personalCare.js new file mode 100644 index 0000000000000000000000000000000000000000..4ad4ebd24dd5ea0cefbb02a3ce8918dbde3533ec --- /dev/null +++ b/routes/personalCare.js @@ -0,0 +1,125 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const PersonalCare = require("../Database/models/personalCare"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "PersonalCare/" + req.file.filename) + await firebase.generateSignedUrl("PersonalCare/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const fruites = PersonalCare({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + + }); + fruites + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + + +//Get products +router.get("/", (req, res, next) => { + PersonalCare.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('fruitImage'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + console.log(updateOps); + PersonalCare.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + PersonalCare.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + + + +module.exports = router; diff --git a/routes/post.js b/routes/post.js new file mode 100644 index 0000000000000000000000000000000000000000..db946e9d8aac3ca0cec32b2fee4b92283cd58d72 --- /dev/null +++ b/routes/post.js @@ -0,0 +1,121 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const User = require('../Database/models/user'); +const Post = require('../Database/models/postNews'); +const Comment = require('../Database/models/comments'); +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/dairy'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +function failedResponse(message) { + return { + "status": 500, + "connection": "Disconnected", + "message": message, + "userData": { + + } + } +} + +router.get("/", async (req, res) => { + Post.find() + .then((post) => { + const response = { + count: post.length, + products: post.map(doc => { + return { + _id: doc._id, + postId: doc.postId, + postedBy: doc.postedBy, + caption: doc.caption, + imageUrl: doc.imageUrl, + liked: doc.liked, + request: { + type: "GET", + url: "http://localhost:4000/products/" + doc._id + } + + + }; + }) + }; + res.status(200).json(response); + }) + .catch((error) => { + res.status(500).json({ error: 'An error occurred while retrieving posts.' }); + }); +}) + +// Route to create a post +router.post('/', upload.single('file'), async (req, res) => { + const { caption } = req.body; + + await firebase.uploadFile(req.file.path, req.file.filename) + await firebase.generateSignedUrl(req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + User.findOne({ unique_id: req.body.userId }, function (err, data) { + if (!data) { + res.send(failedResponse('Data not found!')) + } else { + console.log(" Data => " + data) + const post = Post({ + postId: data, + postedBy: req.body.userId, + caption: caption, + imageUrl: imageUrl, + liked: req.body.liked, + + }); + post.save() + .then((post) => { + + res.status(200).json(post); + + }) + .catch((error) => { + res.status(500).json({ error: 'An error occurred while creating the post.' }); + }); + } + }); + +}); + + + +module.exports = router; \ No newline at end of file diff --git a/routes/products.js b/routes/products.js new file mode 100644 index 0000000000000000000000000000000000000000..b8ee6b4f9f0b66c16484c8641a667a386004a297 --- /dev/null +++ b/routes/products.js @@ -0,0 +1,267 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const Product = require("../Database/models/product"); +const { Category } = require("../Database/models/category"); + +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/products'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +//image size +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, req.file.filename) + await firebase.generateSignedUrl(req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const product = Product({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + productImage: imageUrl, + isLiked: req.body.isLiked, + }); + product + .save() + .then(result => { + console.log(result); + res.status(201).json({ + message: "Created product successfully", + createdProduct: { + productName: result.name, + productPrice: result.price, + productDescription: result.description, + productisLiked: result.isLiked, + _id: result._id, + request: { + type: 'GET', + url: "http://localhost:3000/products/" + result._id + } + } + }); + }) + .catch(err => { + console.log(err.message); + res.status(500).json({ + error: err + }); + }); +}); + +//Get products +router.get("/", (req, res, next) => { + Product.find() + .select("name price description category _id productImage isLiked") + .exec() + .then(docs => { + const response = { + count: docs.length, + products: docs.map(doc => { + return { + productName: doc.name, + productPrice: doc.price, + productDescription: doc.description, + productImage: doc.productImage, + productisLiked: doc.isLiked, + _id: doc._id, + request: { + type: "GET", + url: "http://localhost:4000/products/" + doc._id + } + }; + }) + }; + // if (docs.length >= 0) { + res.status(200).json(response); + // } else { + // res.status(404).json({ + // message: 'No entries found' + // }); + // } + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + +//Update products +router.put('/:id', async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops.propName] = ops.value; + } + + // const product = new Product({ + // _id: new mongoose.Types.ObjectId(), + // name: req.body.name, + // price: req.body.price, + // description: req.body.description, + // category: req.body.category, + // productImage: req.file.path, + // rating: req.body.rating, + // }); + + Product.findOne({ _id: id }, function (err, data) { + if (!data) { + console.log(err); + res.status(500).json({ + error: err + }); + } else { + if (req.body.name != "") { + data.name = req.body.name + } + if (req.body.price != "") { + data.price = req.body.price + } + if (req.body.description != "") { + data.description = req.body.description + } + if (req.body.productImage != "") { + data.productImage = req.body.productImage + } + if (req.body.rating != "") { + data.rating = req.body.rating + } + + data.save(function (err, Person) { + if (err) { + console.log(err); + res.status(500).json({ + error: err + }); + } else { + res.status(200).json({ + message: 'Product updated', + request: { + type: 'GET', + url: 'http://localhost:4000/products/' + id + } + }); + } + }); + } + }); + + // Product.updateOne({ _id: id }, { $set: updateOps }) + // .exec() + // .then(result => { + // res.status(200).json({ + // message: 'Product updated', + // request: { + // type: 'GET', + // url: 'http://localhost:4000/products/' + id + // } + // }); + // }) + // .catch(err => { + // console.log(err); + // res.status(500).json({ + // error: err + // }); + // }); +}); + + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + Product.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).json({ + message: 'Product deleted', + request: { + type: 'POST', + url: 'http://localhost:3000/products', + body: { name: 'String', price: 'Number' } + } + }); + }) + .catch(err => { + console.log(err); + res.status(500).json({ + error: err + }); + }); +}); + +module.exports = router; + + +// Product.findOne({ _id: req.body.productId }, (err, data) => { + +// if (!data) { +// res.status(500).json({ +// err: 'Data not found' +// }); +// } else { +// data.Product = req.body.Product; +// data.price = req.body.price; + +// data.save(function (err, Person) { +// if (err) { +// res.status(500).json({ +// err: err +// }) +// } else { +// res.status(200).json({ +// message: 'Product updated', +// request: { +// trype: 'GET', +// url: 'http://localhost:4000/products/' + data._id +// } +// }) +// } +// }); + +// } +// }).catch(err => { +// console.log(err); +// res.status(500).json({ +// error: err +// }); +// }); \ No newline at end of file diff --git a/routes/profile.js b/routes/profile.js new file mode 100644 index 0000000000000000000000000000000000000000..4bb32155ac35ac17dc846992ffadd58b3b7bcc6a --- /dev/null +++ b/routes/profile.js @@ -0,0 +1,66 @@ +const express = require('express'); +const router = express.Router(); +const User = require('../Database/models/user'); + +// Utility functions for responses +function successResponse(message) { + return { + "status": 200, + "connection": "Connected", + "message": message + }; +} + +function failedResponse(message) { + return { + "status": 400, + "connection": "Disconnected", + "message": message + }; +} + +function profileResponse(message, statusCode, data) { + return { + "status": statusCode, + "connection": "Connected", + "message": message, + "data": data, + }; +} + +// Profile API to fetch user profile data +router.post('/', async (req, res) => { + try { + const { userId } = req.body; + console.log(userId); + const user = await User.findOne({ unique_id: userId }); + + if (!user) { + return res.status(201).send(failedResponse('Data not found!')); + } + + res.status(200).send(profileResponse('Success', 200, user)); + } catch (err) { + console.error('Error fetching profile data:', err); + res.status(500).send(failedResponse('Internal Server Error')); + } +}); + +// User Role API to fetch user role based on userId +router.get('/userRole', async (req, res) => { + try { + const { userId } = req.query; + const user = await User.findOne({ unique_id: userId }); + + if (!user) { + return res.status(201).json({ error: 'User not found' }); + } + + res.json({ role: user.role }); + } catch (error) { + console.error('Error fetching user role:', error); + res.status(500).json({ error: 'Internal Server Error' }); + } +}); + +module.exports = router; diff --git a/routes/profileUpdate.js b/routes/profileUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..a403b6b3bf5df18eb430da8225d9b08e8f96c92c --- /dev/null +++ b/routes/profileUpdate.js @@ -0,0 +1,109 @@ +var express = require('express'); +var router = express.Router(); +var User = require('../Database/models/user'); +const multer = require('multer'); +const firebase = require("../utils/firebase") +var imageUrl = "" + +function successResponse(message, data) { + return { + "status": 200, + "connection": "Connected", + "message": message, + "data": data, + } +} + +function failedResponse(message) { + return { + "status": 400, + "connection": "Dissconnected", + "message": message + } +} + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 + }, + fileFilter: fileFilter +}); + + +//Update profile and watch +router.post('/', upload.single('file'), async (req, res) => { + try { + console.log("File", req.body); + const formData = await req.body; + var imageJSON = await JSON.parse(formData.file); + + console.log("userJSON", imageJSON); + + + const user = await User.findOne({ unique_id: req.body.userId }); + + if (!user) { + return resres.status(404).send(failedResponse('User not found!')); + } + + const { avatar, imageName, filePath } = imageJSON + if (avatar && !avatar.includes("https://storage.googleapis.com")) { + // Upload the file to Firebase Storage + //await firebase.uploadFile(filePath, "ProfilePictures/" + imageName); + + // Generate a signed URL for the uploaded file + const imageUrl = await firebase.uploadAvatar(filePath, req.body.userId); + + // Update profilePic only if imageUrl is not empty + if (imageUrl) { + user.profilePic = imageUrl; + } else { + user.profilePic = req.file.path; + } + } + + if (req.body.username) { + user.username = req.body.username; + } + if (req.body.dateOfBirth) { + user.dateOfBirth = req.body.dateOfBirth; + } + + // Update email or mobile number based on the request body + if (req.body.mobileNumber) { + user.mobileNumber = req.body.mobileNumber; + } else if (req.body.email) { + user.email = req.body.email; + } + + const savedData = await user.save(); + console.log('Profile updated successfully', savedData); + res.status(200).send(successResponse('Profile updated!', savedData)); + } catch (error) { + console.error('Error updating profile:', error); + res.status(400).send(failedResponse(error)); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/register.js b/routes/register.js new file mode 100644 index 0000000000000000000000000000000000000000..fc51e9b123479cbd74e33c96a487746701b5f407 --- /dev/null +++ b/routes/register.js @@ -0,0 +1,125 @@ +var express = require('express'); +var router = express.Router(); +var User = require('../Database/models/user'); +const bcrypt = require('bcrypt'); +const { OAuth2Client } = require('google-auth-library'); +require('dotenv').config(); +const googleClientId = process.env.GOOGLE_ID; +const { profileResponse, failedResponse } = require('../utils/responseModel'); +const verifyGoogleToken = require('../core/auth'); + +const client = new OAuth2Client(googleClientId); + +// Utility function to generate unique_id +async function generateUniqueId() { + const lastUser = await User.findOne({}).sort({ _id: -1 }).limit(1); + return lastUser ? lastUser.unique_id + 1 : 1; +} + +// Email/Password Registration +router.post('/email', async function (req, res) { + const { email, password, passwordConf, username, dateOfBirth } = req.body; + + if (!email || !username || !password || !passwordConf) { + return res.status(201).send(failedResponse('Please provide all required information')); + } + + if (password !== passwordConf) { + return res.status(201).send(failedResponse('Passwords do not match')); + } + + try { + const existingUser = await User.findOne({ email }); + if (existingUser) { + return res.status(201).send(failedResponse('Email is already registered')); + } + + const hashedPassword = await bcrypt.hash(password, 10); + const unique_id = await generateUniqueId(); + + const newUser = new User({ + unique_id, + email, + username, + dateOfBirth, + password: hashedPassword, + role: 'user' + }); + + await newUser.save(); + res.send(profileResponse('Email registration successful.', 200, newUser)); + } catch (error) { + res.status(500).send(failedResponse('Error registering user: ' + error.message)); + } +}); + +// Mobile Number Registration +router.post('/mobile', async function (req, res) { + const { mobileNumber, password, passwordConf, username, dateOfBirth } = req.body; + + if (!mobileNumber || !username || !password || !passwordConf) { + return res.status(201).send(failedResponse('Please provide all required information')); + } + + if (password !== passwordConf) { + return res.status(201).send(failedResponse('Passwords do not match')); + } + + try { + const existingUser = await User.findOne({ mobileNumber }); + if (existingUser) { + return res.status(201).send(failedResponse('Mobile number is already registered')); + } + + const hashedPassword = await bcrypt.hash(password, 10); + const unique_id = await generateUniqueId(); + + const newUser = new User({ + unique_id, + mobileNumber, + username, + dateOfBirth, + password: hashedPassword, + role: 'user' + }); + + await newUser.save(); + res.status(200).send(profileResponse('Mobile number registration successful.', 200, newUser)); + } catch (error) { + res.status(500).send(failedResponse('Error registering user: ' + error.message)); + } +}); + +// Google Registration +router.post('/google', async function (req, res) { + const { googleToken } = req.body; + + if (!googleToken) { + return res.status(400).send(failedResponse('ID Token is required')); + } + + try { + const googleUser = (await verifyGoogleToken(googleToken)).getPayload(); + const { email, name, id } = googleUser; + + let user = await User.findOne({ email }); + if (!user) { + const unique_id = await generateUniqueId(); + user = new User({ + unique_id, + email, + username: name, + role: 'user', + googleId: id + }); + + await user.save(); + } + + res.status(200).send(profileResponse('Google registration successful.', 200, user)); + } catch (error) { + res.status(500).send(failedResponse('Error registering user with Google: ' + error.message)); + } +}); + +module.exports = router; diff --git a/routes/vegetables.js b/routes/vegetables.js new file mode 100644 index 0000000000000000000000000000000000000000..a60a6ded570f0fa1fe9cb4e10613debe4b82d433 --- /dev/null +++ b/routes/vegetables.js @@ -0,0 +1,124 @@ +const express = require("express"); +const router = express.Router(); +const mongoose = require("mongoose"); +const multer = require('multer'); +const Vegetables = require("../Database/models/vegitables"); +const { responseAddProduct, responseFetchProduct } = require("../utils/responseModel"); + +const firebase = require("../utils/firebase") +var imageUrl = "" + +//Disk storage where image store +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads/vegetables'); + }, + filename: function (req, file, cb) { + cb(null, file.originalname); + } +}); + +//Check the image formate +const fileFilter = (req, file, cb) => { + // reject a file + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); + } else { + cb(null, false); + } +}; + +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 10 + }, + fileFilter: fileFilter +}); + +//Add products +router.post("/", upload.single('file'), async (req, res, next) => { + + await firebase.uploadFile(req.file.path, "Vegetabled/" + req.file.filename) + await firebase.generateSignedUrl("Vegetabled/" + req.file.filename).then(res => { + imageUrl = res + }) + + if (imageUrl == "") { + imageUrl = req.file.path + } + + console.log(req.body) + const vegetable = Vegetables({ + _id: mongoose.Types.ObjectId(), + name: req.body.name, + price: req.body.price, + description: req.body.description, + image: imageUrl, + isLiked: req.body.isLiked, + }); + vegetable + .save() + .then(result => { + console.log(result); + res.status(200).send( + responseAddProduct(true, result)); + }) + .catch(err => { + console.log(err.message); + res.status(500).send(responseAddProduct(false, err)); + }); +}); + +//Get products +router.get("/", (req, res, next) => { + Vegetables.find() + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Update products +router.put('/:id', upload.single('file'), async (req, res) => { + const id = req.params.id; + console.log(req.body); + const updateOps = {}; + for (const ops of Object.keys(req.body)) { + updateOps[ops] = req.body[ops]; + } + + console.log(updateOps); + Vegetables.updateOne({ _id: id }, { $set: updateOps }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + +//Delete products +router.delete("/:id", (req, res) => { + const id = req.params.id; + Vegetables.deleteOne({ _id: id }) + .exec() + .then(result => { + res.status(200).send(responseFetchProduct(true, result)); + }) + .catch(err => { + console.log(err); + res.status(500).send(responseFetchProduct(false, err)); + }); +}); + + + + +module.exports = router; diff --git a/server.js b/server.js index e59b17c9865ede350d29c1360b1e333ecd54470c..8294c932c948b221e5cde6b726efa720891010ec 100644 --- a/server.js +++ b/server.js @@ -1,36 +1,21 @@ -const http = require('http'); -const url = require('url'); +const express = require("express"); +const { bootstrap } = require("./bootstrap.js") +const { dbConnection } = require("./Database/DbConnection.js") +const dotenv = require("dotenv") +const morgan = require("morgan") +const cors = require("cors") -const PORT = process.env.PORT || 7860; -const requestHandler = (req, res) => { - const parsedUrl = url.parse(req.url, true); +dotenv.config(); +const app = express(); +app.use(cors()) - // If the request is to /api and has ?raw=true, return a raw JSON response. - if (parsedUrl.pathname === '/api' && parsedUrl.query.raw === 'true') { - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ message: 'Hello from your Node.js API!' })); - return; - } +dbConnection(); - // Default route returns a basic HTML page. - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(` - - Welcome - -

Welcome to my HF Space!

-

For a raw API response, use /api?raw=true

- - - `); -}; +const port = 4000; +app.use(express.json()); +app.use(morgan("dev")); +app.use(express.static("uploads")); -const server = http.createServer(requestHandler); - -server.listen(PORT, (err) => { - if (err) { - return console.error('Error starting server:', err); - } - console.log(`Server is running on port ${PORT}`); -}); +bootstrap(app); +app.listen(process.env.PORT || port, () => console.log(`Example app listening on port ${port}!`)); diff --git a/serviceAccountKey.json b/serviceAccountKey.json new file mode 100644 index 0000000000000000000000000000000000000000..a2e2cedf0342f3914790d3959ff331a0374f2218 --- /dev/null +++ b/serviceAccountKey.json @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "flutter-hayat", + "private_key_id": "0602ddebd5f0ac567ba04229bac4333f389567dc", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCmaCDrNp+mD3ww\n6z5JoN+Tr0qBmTn45etK9Efa/wkk3hZEeEpSLxZWjouabrjSuLm/YrbJdZ3nQOVS\nz49F9AT4c/bfigKxACfpPotuW8lpce4tgDV8aqV193gpurjzy1AD5e7MgnFRWPlb\nGM46CLAu1mggASPoukiNWbhway7LJ6zVds4575Oo0DBKDM9l2FJhDk2+UN+myDkT\nWtgak2ICMAqVM1cR8IlepfEdA9pRDvCKr4sf1BfRvaMlGaT+E9IF232YdPLS6YuD\nPDJ798cJOW7qpYtjZJqvO6OdMZNJ0dqVs4z9GUSieDym2U1x7q9TXuxV6U0DZJa9\n0LoDZP3ZAgMBAAECggEAFqsFnPT+b3EZklJhVEdRXX1Z8WiNkJ3FXRsEtMzcEoUc\nVGxsd2CJsvXNB5cAn1fhmbQZQT0/6tIYyxySIE3a5XtqjE3xCuqCBVBrTve66p3F\n+7XE03N1oam52Tlh23f9KOLIElzMke/EXAf3g8lOMrsrSPzOxvOlUXgA23OGVs8T\nDSJWFFLaCHLcVb6lBJhLdAM51sErxxDjL9d/qhlb1MCzfHB+ZpU6z30IRYhrmB0j\n14sOdzG9sGIXPOptOFpahijrmJr+IS1PaH9Zhc3+H3eCt9/xlUFQVkpuByGCGFKP\njXasaZch9De7ycdiXEPq6PDSjIbYSdXUHCfffAGiJwKBgQDPF1odaxfLHK+NIDaE\nbpkjB5+IvTWpi8zNbut0VrfSvn4024pAhu1Rsovagt1K+YjGqZEEYDbZmKHAWuNM\nnuwB410oO6q+LohgLRQloE2s+n/oCAWekVVqsxoZJM2Bq+tDhJl+1DP4bG5j+6nM\nS5fsKolm430kgtQwNaSwyevyhwKBgQDNtQLGucwPKpdNcxMidHL8WwiLvXJBNdik\n7eVyQfi5fF7puOpfTgQjXSJeN5oanhZuVjQ4FaYiw0YFX042rzNuG3vjgYGXuaiR\nlZftSC+sj777+GnUf4F02JDZji7l5+wDapALQYbPk9vv0uG7klnwtuoJ8je3VFQv\nBEeh0wbEnwKBgQDFDvmHKNLZSZCa/94gooVB2g0qtrELhqX5jeSrLaF5/h5l+cpS\noJHOvdFqukANCenm8I+31D4dTKoOOe40iL0XBt0sXaqZkfnfWsXjD+kaArwXdRqz\nyqO3Bnp9FpIfJBKYiuLs1swlRji9F0p5xizoY4mfyDTau0tiHIl8WIgWnQKBgQDN\nOt/HNs1BAGQt0DZx9K5X2db/3AWmy7sWaYa2ZN1q6YukMWobpbF5Os00JNMp5TlJ\n4dV9cxPqsNomN/zHkCqGmwMSaz3JC2EDxrTp9lAiINQRfbjQWlnlIr/5XeKqW6Xb\njrChmkGOzdzrO4Ec65myEDwVqkQuMwM+WU3CRNEGzwKBgQC1sgj63L4omVqHT8Xd\ndp+mLNz8il3Jsha8nY4ZIq1LQuYBqEnVH3Vyeun8DoDkMO2OKWm5pCfXixbsDBq7\nEyy6FzZ/NUUpMDECGSkboNZEbeKIOKNnogwo8z2GYde5agXlOHmEsp2Emcg11kL/\nkzuZ07sO03ByJo2HASkfUVODrQ==\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-fr502@flutter-hayat.iam.gserviceaccount.com", + "client_id": "102750862365764776921", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-fr502%40flutter-hayat.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} diff --git a/utils/ApiFeatures.js b/utils/ApiFeatures.js new file mode 100644 index 0000000000000000000000000000000000000000..bcc3137f205fa9b502ed24e0d375d4952e96076c --- /dev/null +++ b/utils/ApiFeatures.js @@ -0,0 +1,78 @@ +export class ApiFeatures { + constructor(mongooseQuery, queryString) { + this.mongooseQuery = mongooseQuery; + this.queryString = queryString; + } + + //1-Pagination + pagination() { + const PAGE_LIMIT = 3; + let PAGE_NUMBER = this.queryString.page * 1 || 1; + if (this.queryString.page <= 0) PAGE_NUMBER = 1; + const PAGE_SKIP = (PAGE_NUMBER - 1) * PAGE_LIMIT; //2*3 + + this.mongooseQuery.skip(PAGE_SKIP).limit(PAGE_LIMIT); + return this; + } + + //2-Filteration + + filteration() { + let filterObj = { ...this.queryString }; + // console.log(filterObj); + + let excludedQuery = ["page", "sort", "fields", "keyword"]; + + excludedQuery.forEach((ele) => { + delete filterObj[ele]; + }); + filterObj = JSON.stringify(filterObj); + // console.log(filterObj); + + filterObj = filterObj.replace( + /\b(gt|gte|lt|lte)\b/g, + (match) => `$${match}` + ); + filterObj = JSON.parse(filterObj); + + this.mongooseQuery.find(filterObj); + return this; + } + //3-Sort + sort() { + if (this.queryString.sort) { + // console.log(req.query.sort); + let sortedBy = this.queryString.sort.split(",").join(" "); + // console.log(sortedBy); + this.mongooseQuery.sort(sortedBy); + } + return this; + } + //4-Search + + search() { + if (this.queryString.keyword) { + // console.log(this.queryString.keyword); + + this.mongooseQuery.find({ + $or: [ + { title: { $regex: this.queryString.keyword, $options: "i" } }, + { descripton: { $regex: this.queryString.keyword, $options: "i" } }, + ], + }); + } + return this; + } + + //4-Fields + + fields() { + if (this.queryString.fields) { + // console.log(this.queryString.fields); + let fields = this.queryString.fields.split(",").join(" "); + console.log(fields); + // this.mongooseQuery.select(fields); + } + return this; + } +} diff --git a/utils/AppError.js b/utils/AppError.js new file mode 100644 index 0000000000000000000000000000000000000000..036f107c7fcd49a8e5672512975f565802f46630 --- /dev/null +++ b/utils/AppError.js @@ -0,0 +1,8 @@ +class AppError extends Error { + constructor(message, statuscode) { + super(message); + this.statuscode = statuscode; + } +} + +module.exports = { AppError }; diff --git a/utils/GlobalErrorHandling.js b/utils/GlobalErrorHandling.js new file mode 100644 index 0000000000000000000000000000000000000000..913660be7b2db2c3f872d0d059f096f899b15711 --- /dev/null +++ b/utils/GlobalErrorHandling.js @@ -0,0 +1,10 @@ +const globalErrorHandling = (err, req, res, next) => { + //Must be last middleware + let error = err.message; + let code = err.statuscode || 500; + process.env.MODE == "dev" + ? res.status(code).json({ error, stack: err.stack }) + : res.status(code).json({ error }); +}; + +module.exports = { globalErrorHandling }; diff --git a/utils/catchAsyncError.js b/utils/catchAsyncError.js new file mode 100644 index 0000000000000000000000000000000000000000..69a375dc688295b5a25b34fdf8d4ff9f0677815c --- /dev/null +++ b/utils/catchAsyncError.js @@ -0,0 +1,8 @@ + let catchAsyncError = (fn) => { + return (req, res, next) => { + fn(req, res, next).catch((err) => next(err)); + }; +}; + +module.exports = catchAsyncError; + diff --git a/utils/firebase.js b/utils/firebase.js new file mode 100644 index 0000000000000000000000000000000000000000..b70b18c61949e95bf5335bbfe03df60d0f18bd39 --- /dev/null +++ b/utils/firebase.js @@ -0,0 +1,95 @@ +var admin = require("firebase-admin"); +var serviceAccount = require("../serviceAccountKey.json") +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), + storageBucket: "gs://flutter-hayat.appspot.com/" +}); +var bucket = admin.storage().bucket(); +const d = new Date() +const date = new Date(d.setFullYear(d.getFullYear() + 200)).toString() + +async function uploadFile(filepath, filename) { + console.log("File path =>" + filepath) + console.log("File name =>" + filename) + try { + const file = bucket.file(filename); + const [exists] = await file.exists(); + + if (exists) { + console.log(`File with name ${filename} already exists. Deleting it...`); + await file.delete(); + console.log(`File ${filename} deleted successfully.`); + } + + await bucket.upload(filepath, { + gzip: true, + destination: filename, + metadata: { + cacheControl: 'public, max-age=31536000' + } + }); + + console.log(`${filename} uploaded to bucket.`); + } catch (e) { + console.log("Error: ", e); + } +} + +async function generateSignedUrl(filename) { + const options = { + version: 'v2', + action: 'read', + expires: date + }; + + const [url] = await bucket.file(filename).getSignedUrl(options); + imageUrl = url + '' + console.log(url); + return url +}; + +async function uploadAvatar(filepath, userId) { + const imageName = `${userId}_profile.jpg`; + // Check file exists + const file = bucket.file(`ProfilePictures/${imageName}`); + const [exists] = await file.exists(); + + if (exists) { + console.log(`File with name ${file.name} already exists. Deleting it...`); + await file.delete(); + console.log(`File ${file.name} deleted successfully.`); + } + + // Upload file to Firebase Storage + await bucket.upload(filepath, { + gzip: true, + destination: `ProfilePictures/${imageName}`, + metadata: { + cacheControl: 'public, max-age=31536000', + }, + }); + + console.log(`${imageName} uploaded successfully.`); + + if (!exists) { + throw new Error(`File does not exist after upload: ${imageName}`); + } + + // Generate signed URL + const [url] = await file.getSignedUrl({ + action: 'read', + expires: '03-01-2030', + }); + + console.log('Generated URL:', url); + return url; +} + + +module.exports = { + admin, + bucket, + uploadFile, + generateSignedUrl, + uploadAvatar +} \ No newline at end of file diff --git a/utils/multerConfig.js b/utils/multerConfig.js new file mode 100644 index 0000000000000000000000000000000000000000..5e2641d6367b32b89d8932cfe00e09a2a3421a1e --- /dev/null +++ b/utils/multerConfig.js @@ -0,0 +1,32 @@ +const multer = require('multer'); + +// Disk storage configuration where images will be stored +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, './uploads'); // Specify the folder where files will be stored + }, + filename: function (req, file, cb) { + cb(null, Date.now() + file.originalname); + } +}); + +// File filter to accept only specific image types +const fileFilter = (req, file, cb) => { + // Allow only jpeg, png, and jpg formats + if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { + cb(null, true); // Accept the file + } else { + cb(null, false); // Reject the file + } +}; + +// Multer configuration to handle file uploads +const upload = multer({ + storage: storage, + limits: { + fileSize: 1024 * 1024 * 5 // Limit the file size to 5MB + }, + fileFilter: fileFilter +}); + +module.exports = upload; diff --git a/utils/responseModel.js b/utils/responseModel.js new file mode 100644 index 0000000000000000000000000000000000000000..0befafce17e5032993f4580e3f16f4fca037e755 --- /dev/null +++ b/utils/responseModel.js @@ -0,0 +1,123 @@ +// responseUtils.js + +/** + * Standard response for successful operations. + * @param {string} message - Success message + * @param {object} [data=null] - Optional data to include in the response + * @returns {object} - Response object + */ +function successResponse(message, data = null) { + return { + status: 200, + connection: 'Connected', + message: message, + data: data, + }; +} + +/** + * Standard response for failed operations. + * @param {string} message - Error message + * @param {number} [statusCode=400] - HTTP status code + * @param {object} [errors=null] - Optional error details + * @returns {object} - Response object + */ +function failedResponse(message, statusCode = 400, errors = null) { + return { + status: statusCode, + connection: 'Disconnected', + message: message, + errors: errors, + }; +} + +/** + * Response format for profile data. + * @param {string} message - Success or error message + * @param {number} statusCode - HTTP status code + * @param {object} data - User data + * @returns {object} - Response object + */ +function profileResponse(message, statusCode, data) { + return { + status: statusCode, + connection: 'Connected', + message: message, + userData: { + user_id: data.unique_id, + username: data.username, + email: data.email, + dateOfBirth: data.dateOfBirth, + mobileNumber: data.mobileNumber, + profilePic: data.profilePic + }, + }; +} + +/** + * Response format for login operations. + * @param {boolean} success - Indicates if the operation was successful + * @param {string} message - Success or error message + * @param {object} [data=null] - Optional data to include in the response + * @returns {object} - Response object + */ +function responseLogin(success, message, data = null) { + return { + success: success, + message: message, + data: data, + }; +} + +/** + * Response format for registration operations. + * @param {boolean} success - Indicates if the operation was successful + * @param {string} message - Success or error message + * @param {object} [data=null] - Optional data to include in the response + * @returns {object} - Response object + */ +function responseRegistration(success, message, data = null) { + return { + success: success, + message: message, + data: data, + }; +} + +/** + * Response format for adding products. + * @param {boolean} success - Indicates if the operation was successful + * @param {string} message - Success or error message + * @param {object} [errors=null] - Optional error details + * @returns {object} - Response object + */ +function responseAddProduct(success, message, errors = null) { + return { + success: success, + message: message, + errors: errors, + }; +} + +/** + * Response format for fetching products. + * @param {boolean} success - Indicates if the operation was successful + * @param {object} data - Data to include in the response + * @returns {object} - Response object + */ +function responseFetchProduct(success, data) { + return { + success: success, + data: data, + }; +} + +module.exports = { + successResponse, + failedResponse, + profileResponse, + responseLogin, + responseRegistration, + responseAddProduct, + responseFetchProduct, +}; diff --git a/utils/upladImageUtils.js b/utils/upladImageUtils.js new file mode 100644 index 0000000000000000000000000000000000000000..b9b3f106ddf96efb4d8e43944fac0fb0b59c92b3 --- /dev/null +++ b/utils/upladImageUtils.js @@ -0,0 +1,45 @@ +// const multer = require('multer'); + +// //Disk storage where image store +// const storage = multer.diskStorage({ +// destination: function (req, file, cb) { +// cb(null, './uploads/fruits'); +// }, +// filename: function (req, file, cb) { +// cb(null, file.originalname); +// } +// }); + +// function storage(path) { +// return diskStorage({ +// destination: function (req, file, cb) { +// cb(null, path); +// }, +// filename: function (req, file, cb) { +// cb(null, file.originalname); +// } +// }); +// } + +// //Check the image formate +// const fileFilter = (req, file, cb) => { +// // reject a file +// if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/jpg') { +// cb(null, true); +// } else { +// cb(null, false); +// } +// }; + +// function filePath(path) { +// return multer({ +// storage: storage(path), +// limits: { +// fileSize: 1024 * 1024 * 5 +// }, +// fileFilter: fileFilter +// }); + +// } + +// module.exports = { filePath }