Compare commits
2 commits
b59e652c9b
...
d1ed7dfbcc
Author | SHA1 | Date | |
---|---|---|---|
d1ed7dfbcc | |||
8cbca86205 |
14 changed files with 152 additions and 127 deletions
BIN
.DS_Store
vendored
Normal file
BIN
.DS_Store
vendored
Normal file
Binary file not shown.
|
@ -1,7 +1,7 @@
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
import { Cart, ICart } from '../schemas/cartModel';
|
import { Cart, ICart } from '../schemas/cartSchema';
|
||||||
import { Product } from '../schemas/productModel';
|
import { Product } from '../schemas/productSchema';
|
||||||
import { Order } from '../schemas/orderModel';
|
import { Order } from '../schemas/orderSchema';
|
||||||
import { sendEmailasync } from '../services/sendGrid';
|
import { sendEmailasync } from '../services/sendGrid';
|
||||||
import { config } from 'dotenv';
|
import { config } from 'dotenv';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
import { Product } from '../schemas/productModel';
|
import { Product } from '../schemas/productSchema';
|
||||||
import { handleCreateProductError } from '../middlewares/errorHandlers';
|
// import { handleCreateProductError } from '../middlewares/errorHandler';
|
||||||
|
|
||||||
|
|
||||||
export async function createProduct(req: Request, res: Response) {
|
export async function createProduct(req: Request, res: Response) {
|
||||||
|
@ -10,7 +10,7 @@ export async function createProduct(req: Request, res: Response) {
|
||||||
res.json(product);
|
res.json(product);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error creating product:', error);
|
console.error('Error creating product:', error);
|
||||||
handleCreateProductError(res, error);
|
// handleCreateProductError(res, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,111 +1,90 @@
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
|
// import { createUser } from '../models/userModel';
|
||||||
|
import { IUser } from '../schemas/userSchema';
|
||||||
|
import { User } from '../schemas/userSchema';
|
||||||
import bcrypt from 'bcryptjs';
|
import bcrypt from 'bcryptjs';
|
||||||
import jwt from 'jsonwebtoken';
|
import jwt from 'jsonwebtoken';
|
||||||
import { User, IUser } from '../schemas/userModel';
|
|
||||||
import { clearJwtCookie, setJwtCookie } from '../middlewares/checkAuth';
|
import { clearJwtCookie, setJwtCookie } from '../middlewares/checkAuth';
|
||||||
import validate from 'deep-email-validator';
|
|
||||||
|
|
||||||
export async function createUser(req: Request, res: Response) {
|
const create = async (req: Request, res: Response) => {
|
||||||
try {
|
try {
|
||||||
const { email, password, address } = req.body;
|
const { email, password, address } = req.body;
|
||||||
const isValidEmail = await validate(email);
|
const user = await User.create({ email, password, address });
|
||||||
if (!isValidEmail.valid) {
|
res.status(201).json(user);
|
||||||
console.error('Email is invalid:', isValidEmail.validators);
|
} catch(error) {
|
||||||
return res.status(400).json({ error: 'Email is invalid' });
|
res.status(500).json({ error: 'An error occurred during signup' });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(password && address)) {
|
|
||||||
return res.status(400).json({ error: 'All inputs are required' });
|
|
||||||
}
|
|
||||||
// checkIfUserExists return true if the user exists
|
|
||||||
const userExists = await User.exists({ email });
|
|
||||||
if(userExists) {
|
|
||||||
return res.status(400).json({ error: 'User already exists, Try login :)' });
|
|
||||||
}
|
|
||||||
|
|
||||||
const hashedPassword = await bcrypt.hash(password, 10);
|
|
||||||
|
|
||||||
const user: IUser = await User.create({
|
|
||||||
email,
|
|
||||||
password: hashedPassword,
|
|
||||||
address,
|
|
||||||
});
|
|
||||||
|
|
||||||
res.status(200).json({
|
|
||||||
massage: 'User created successfully'
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error creating user:', error);
|
|
||||||
res.status(500).json({ error: 'An error occurred while creating the user.' });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// export async function login(req: Request, res: Response) {
|
||||||
|
// try {
|
||||||
|
// const { email, password } = req.body;
|
||||||
|
|
||||||
export async function login(req: Request, res: Response) {
|
// // Check if the user exists
|
||||||
try {
|
// const user: IUser | null = await User.findOne({ email });
|
||||||
const { email, password } = req.body;
|
// if (!user) {
|
||||||
|
// console.error('User not found');
|
||||||
|
// return res.status(401).json({ error: 'Invalid email or password' });
|
||||||
|
// }
|
||||||
|
|
||||||
// Check if the user exists
|
// // Compare the provided password with the stored password
|
||||||
const user: IUser | null = await User.findOne({ email });
|
// const isPasswordCorrect = await bcrypt.compare(password, user.password);
|
||||||
if (!user) {
|
// if (!isPasswordCorrect) {
|
||||||
console.error('User not found');
|
// console.error('Invalid password');
|
||||||
return res.status(401).json({ error: 'Invalid email or password' });
|
// return res.status(401).json({ error: 'Invalid email or password' });
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Compare the provided password with the stored password
|
// const payload = {
|
||||||
const isPasswordCorrect = await bcrypt.compare(password, user.password);
|
// userId: user._id
|
||||||
if (!isPasswordCorrect) {
|
// }
|
||||||
console.error('Invalid password');
|
// // Generate a JWT
|
||||||
return res.status(401).json({ error: 'Invalid email or password' });
|
// const token = jwt.sign(payload, process.env.JWT_SECRET as string, { expiresIn: '1d' });
|
||||||
}
|
|
||||||
|
|
||||||
const payload = {
|
// setJwtCookie(res, token);
|
||||||
userId: user._id
|
|
||||||
}
|
|
||||||
// Generate a JWT
|
|
||||||
const token = jwt.sign(payload, process.env.JWT_SECRET as string, { expiresIn: '1d' });
|
|
||||||
|
|
||||||
setJwtCookie(res, token);
|
// // Send the JWT as the response
|
||||||
|
// res.status(200).json({
|
||||||
|
// token
|
||||||
|
// });
|
||||||
|
// } catch (error) {
|
||||||
|
// console.error('Error during login:', error);
|
||||||
|
// res.status(500).json({ error: 'An error occurred during login' });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// Send the JWT as the response
|
// export async function logout(req: Request, res: Response) {
|
||||||
res.status(200).json({
|
// try {
|
||||||
token
|
// clearJwtCookie(res);
|
||||||
});
|
// res.status(200).json({ message: 'Logout successful' });
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
console.error('Error during login:', error);
|
// console.error('Error during logout:', error);
|
||||||
res.status(500).json({ error: 'An error occurred during login' });
|
// res.status(500).json({ error: 'An error occurred during logout' });
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
export async function logout(req: Request, res: Response) {
|
// export async function getAllUsers(req: Request, res: Response) {
|
||||||
try {
|
// try {
|
||||||
clearJwtCookie(res);
|
// const users = await User.find().select('-__v -password');
|
||||||
res.status(200).json({ message: 'Logout successful' });
|
// res.status(200).json({ users });
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
console.error('Error during logout:', error);
|
// console.error('Error getting all users:', error);
|
||||||
res.status(500).json({ error: 'An error occurred during logout' });
|
// res.status(500).json({ error: 'An error occurred while getting all users' });
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
export async function getAllUsers(req: Request, res: Response) {
|
// export async function deleteUser(req: Request, res: Response) {
|
||||||
try {
|
// try {
|
||||||
const users = await User.find().select('-__v -password');
|
// const { id } = req.params;
|
||||||
res.status(200).json({ users });
|
// const user = await User.findByIdAndDelete(id);
|
||||||
} catch (error) {
|
// if (!user) {
|
||||||
console.error('Error getting all users:', error);
|
// return res.status(404).json({ error: 'User not found' });
|
||||||
res.status(500).json({ error: 'An error occurred while getting all users' });
|
// }
|
||||||
}
|
// res.status(200).json({ message: 'User deleted successfully' });
|
||||||
}
|
// } catch (error) {
|
||||||
|
// console.error('Error deleting user:', error);
|
||||||
export async function deleteUser(req: Request, res: Response) {
|
// res.status(500).json({ error: 'An error occurred while deleting the user' });
|
||||||
try {
|
// }
|
||||||
const { id } = req.params;
|
// }
|
||||||
const user = await User.findByIdAndDelete(id);
|
export {
|
||||||
if (!user) {
|
create
|
||||||
return res.status(404).json({ error: 'User not found' });
|
|
||||||
}
|
|
||||||
res.status(200).json({ message: 'User deleted successfully' });
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error deleting user:', error);
|
|
||||||
res.status(500).json({ error: 'An error occurred while deleting the user' });
|
|
||||||
}
|
|
||||||
}
|
}
|
16
src/index.ts
16
src/index.ts
|
@ -6,6 +6,8 @@ import userRouter from './routes/userRouter';
|
||||||
import productRouter from './routes/productRouter';
|
import productRouter from './routes/productRouter';
|
||||||
import cartRouter from './routes/cartRouter';
|
import cartRouter from './routes/cartRouter';
|
||||||
|
|
||||||
|
import { errorHandler } from './middlewares/errorHandler';
|
||||||
|
|
||||||
const env = require('dotenv').config().parsed;
|
const env = require('dotenv').config().parsed;
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
@ -14,6 +16,9 @@ const PORT = env.PORT || 3000;
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
app.use(cookieParser())
|
app.use(cookieParser())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Connect to MongoDB using Mongoose
|
// Connect to MongoDB using Mongoose
|
||||||
mongoose.connect(env.DATABASE_URL);
|
mongoose.connect(env.DATABASE_URL);
|
||||||
|
|
||||||
|
@ -33,6 +38,17 @@ app.use('/users', userRouter);
|
||||||
app.use('/products', productRouter);
|
app.use('/products', productRouter);
|
||||||
app.use('/cart', cartRouter);
|
app.use('/cart', cartRouter);
|
||||||
|
|
||||||
|
app.all('*', (req, res, next) => {
|
||||||
|
// res.status(404).json({ error: 'Route not found' });
|
||||||
|
const error = new Error('Route not found');
|
||||||
|
// error.statusCode = 404;
|
||||||
|
// error.status = 'fail';
|
||||||
|
next(error)
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use(errorHandler);
|
||||||
|
|
||||||
|
|
||||||
// Start server
|
// Start server
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Server started on port ${PORT}`);
|
console.log(`Server started on port ${PORT}`);
|
||||||
|
|
14
src/middlewares/errorHandler.ts
Normal file
14
src/middlewares/errorHandler.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
const errorHandler = (error, req, res, next) => {
|
||||||
|
// error.statusCode = error.statusCode || 500;
|
||||||
|
// error.message = error.message || 'Internal server error';
|
||||||
|
// error.status = error.status || 'error';
|
||||||
|
res.status(error).json(
|
||||||
|
{
|
||||||
|
error: error.message
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
errorHandler
|
||||||
|
}
|
|
@ -1,18 +0,0 @@
|
||||||
import { Request, Response, NextFunction } from 'express';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export function handleCreateProductError(res: Response, error: Error) {
|
|
||||||
let statusCode = 500;
|
|
||||||
let errorMessage = 'An error occurred while creating the product.';
|
|
||||||
|
|
||||||
if (error.message === 'Missing required fields.') {
|
|
||||||
statusCode = 400;
|
|
||||||
errorMessage = 'Missing required fields.';
|
|
||||||
} else if (error.message === 'Product already exists.') {
|
|
||||||
statusCode = 409;
|
|
||||||
errorMessage = 'Product already exists.';
|
|
||||||
}
|
|
||||||
|
|
||||||
res.status(statusCode).json({ error: errorMessage });
|
|
||||||
}
|
|
34
src/models/userModel.ts
Normal file
34
src/models/userModel.ts
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
// import { User, IUser } from "../schemas/userSchema";
|
||||||
|
// import validate from 'deep-email-validator';
|
||||||
|
|
||||||
|
|
||||||
|
// const createUser = async (user: IUser) => {
|
||||||
|
|
||||||
|
// if (!user.email || !user.password || !user.address) {
|
||||||
|
// console.log('All inputs are required')
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const { valid, reason, validators } = await validate(user.email);
|
||||||
|
// if (!valid) {
|
||||||
|
// // throw new Error(reason);
|
||||||
|
// console.log(reason)
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const userExists = await User.exists({ email: user.email });
|
||||||
|
// if (userExists) {
|
||||||
|
// console.log('User already exists, Try login :)')
|
||||||
|
// }
|
||||||
|
// const newUser = new User(user);
|
||||||
|
// try {
|
||||||
|
// await newUser.save();
|
||||||
|
// return newUser;
|
||||||
|
// } catch (error) {
|
||||||
|
// return error;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export {
|
||||||
|
// createUser
|
||||||
|
// }
|
|
@ -1,12 +1,12 @@
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { createUser, login, logout, getAllUsers, deleteUser } from '../controllers/userController';
|
import { create } from '../controllers/userController';
|
||||||
|
|
||||||
const userRouter = express.Router();
|
const userRouter = express.Router();
|
||||||
|
|
||||||
userRouter.post('/', createUser);
|
userRouter.post('/', create);
|
||||||
userRouter.get('/', getAllUsers);
|
// userRouter.get('/', getAllUsers);
|
||||||
userRouter.post('/login', login);
|
// userRouter.post('/login', login);
|
||||||
userRouter.post('/logout', logout);
|
// userRouter.post('/logout', logout);
|
||||||
userRouter.delete('/:id', deleteUser)
|
// userRouter.delete('/:id', deleteUser)
|
||||||
|
|
||||||
export default userRouter;
|
export default userRouter;
|
|
@ -1,6 +1,6 @@
|
||||||
import { config } from "dotenv";
|
import { config } from "dotenv";
|
||||||
import { Order } from "../schemas/orderModel";
|
import { Order } from "../schemas/orderSchema";
|
||||||
import { User } from "../schemas/userModel";
|
import { User } from "../schemas/userSchema";
|
||||||
import client from '@sendgrid/mail';
|
import client from '@sendgrid/mail';
|
||||||
config();
|
config();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue