-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
137 lines (113 loc) · 3.9 KB
/
Copy pathserver.js
File metadata and controls
137 lines (113 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const nodemailer = require('nodemailer');
const basicAuth = require('express-basic-auth');
const cors = require('cors');
const dotenv = require('dotenv');
const path = require('path');
const multer = require('multer');
const { CloudinaryStorage } = require('multer-storage-cloudinary');
const cloudinary = require('cloudinary').v2;
const Product = require('./models/product');
const Order = require('./models/order');
dotenv.config();
const app = express();
// Middleware
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// Serve static files from "public" folder
app.use(express.static(path.join(__dirname, 'public')));
// MongoDB connection
mongoose.connect(process.env.MONGO_URI)
.then(() => console.log('✅ Connected to MongoDB'))
.catch(err => console.error('❌ MongoDB error:', err));
// Cloudinary config
cloudinary.config({
cloud_name: process.env.CLOUD_NAME,
api_key: process.env.CLOUD_API_KEY,
api_secret: process.env.CLOUD_API_SECRET
});
const storage = new CloudinaryStorage({
cloudinary,
params: {
folder: 'products',
allowed_formats: ['jpg', 'png', 'jpeg'],
transformation: [{ width: 800, crop: "scale" }]
}
});
const upload = multer({ storage });
// Admin Basic Auth (protect /admin routes)
app.use('/admin', basicAuth({
users: { 'imadmin$': 'wwdevkhati1@gmail.com' },
challenge: true
}));
// Serve admin upload page
app.get('/admin.html', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'admin.html'));
});
// ✅ Add new product with detailed error logging
app.post('/admin/add-product', upload.array('images'), async (req, res) => {
try {
const { title, price, description } = req.body;
if (!req.files || req.files.length === 0) {
console.error('❌ No images received:', req.files);
return res.status(400).send('❌ No images uploaded');
}
const imageUrls = req.files.map(file => file.path);
const product = new Product({ title, price, description, imageUrls });
await product.save();
res.send('✅ Product added!');
} catch (error) {
console.error('❌ Error adding product:');
console.error('Message:', error.message);
console.error('Stack:', error.stack);
console.error('Request Body:', req.body);
console.error('Files:', req.files);
res.status(500).send('❌ Internal Server Error: ' + error.message);
}
});
// Get all products list
app.get('/products', async (req, res) => {
try {
const products = await Product.find().sort({ createdAt: -1 });
res.json(products);
} catch (error) {
console.error('Error fetching products:', error);
res.status(500).send('❌ Failed to load products');
}
});
// Handle order submission
app.post('/order', async (req, res) => {
try {
const { name, mobile, state, district, address } = req.body;
const order = new Order({ name, mobile, state, district, address });
await order.save();
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.EMAIL_FROM,
pass: process.env.EMAIL_PASS
}
});
await transporter.sendMail({
from: process.env.EMAIL_FROM,
to: process.env.EMAIL_TO,
replyTo: process.env.EMAIL_TO,
subject: '🛒 New Order',
text: `Name: ${name}\nMobile: ${mobile}\nState: ${state}\nDistrict: ${district}\nAddress: ${address}`
});
res.send('✅ Order placed!');
} catch (err) {
console.error('❌ Order Error:', err.message);
res.status(500).send('❌ Failed to place order. Please try again later.');
}
});
// Serve homepage
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`🚀 Server running on port ${PORT}`));
// Handle 404 errors