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: `
+
+
+
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: `
+
+
+
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 }