Added signin route in backend
This commit is contained in:
@@ -3,4 +3,5 @@ dotenv.config();
|
||||
|
||||
export const PORT = Number(process.env.PORT);
|
||||
export const DB_URL = process.env.DB_CONNECTION;
|
||||
export const SALT = Number(process.env.SALT_ROUNDS);
|
||||
export const SALT = Number(process.env.SALT_ROUNDS);
|
||||
export const JWT_PRIVATE = process.env.JWT_PRIVATE;
|
||||
@@ -1,28 +1,55 @@
|
||||
import { signupService } from "../services/user.service.js";
|
||||
import { signinService, signupService } from "../services/user.service.js";
|
||||
|
||||
export async function signupController(req, res) {
|
||||
try {
|
||||
const { username, email, password } = req.body;
|
||||
const user = await signupService(username, email, password);
|
||||
res.status(201).json({
|
||||
success : true,
|
||||
message : "User created successfully",
|
||||
data : user
|
||||
})
|
||||
try {
|
||||
const { username, email, password } = req.body;
|
||||
const user = await signupService(username, email, password);
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
message: "User created successfully",
|
||||
data: user,
|
||||
});
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (err.statusCode) {
|
||||
res.status(err.statusCode).json({
|
||||
success: false,
|
||||
message: err.message,
|
||||
});
|
||||
} else {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
catch(err){
|
||||
console.log(err);
|
||||
if (err.statusCode){
|
||||
res.status(err.statusCode).json({
|
||||
success : false,
|
||||
message : err.message
|
||||
})
|
||||
}
|
||||
else {
|
||||
res.status(500).json({
|
||||
success : false,
|
||||
message : err.message
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function signinController(req, res) {
|
||||
try {
|
||||
const { email, password } = req.body;
|
||||
const { token, userData } = await signinService(email, password);
|
||||
res.cookie("access-token", token, {
|
||||
httpOnly: true,
|
||||
maxAge: 10 * 24 * 60 * 60 * 1000, // 10 days
|
||||
}).status(200).json({
|
||||
success : true,
|
||||
message : "User signedin successfully.",
|
||||
user : userData
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (err.statusCode) {
|
||||
res.status(err.statusCode).json({
|
||||
success: false,
|
||||
message: err.message,
|
||||
});
|
||||
} else {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: err.message,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import { connectDB } from './config/dbConfig.js';
|
||||
import userRouter from './routes/v1/user.route.js';
|
||||
import swaggerDocs from '../swagger.js';
|
||||
import swaggerUi from 'swagger-ui-express';
|
||||
import cookieParser from "cookie-parser";
|
||||
|
||||
|
||||
const app = express();
|
||||
@@ -20,6 +21,7 @@ const io = new Server(httpServer, {
|
||||
}
|
||||
})
|
||||
|
||||
app.use(cookieParser());
|
||||
app.use(cors())
|
||||
app.use(express.json())
|
||||
app.get("/ping", (_req, res) => {
|
||||
|
||||
@@ -13,4 +13,14 @@ export const createUser = async (username, email, password) => {
|
||||
catch(err) {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
export async function findUserByEmail(email) {
|
||||
try{
|
||||
const user = await UserModel.findOne({email});
|
||||
return user;
|
||||
}
|
||||
catch(err){
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
import express from "express";
|
||||
import { signupController } from "../../controllers/user.controller.js";
|
||||
import { signinController, signupController } from "../../controllers/user.controller.js";
|
||||
import validate from "../../validations/validator.js";
|
||||
import signupSchema from "../../validations/signupValidation.js";
|
||||
import signinSchema from "../../validations/signinValidation.js";
|
||||
const userRouter = express.Router();
|
||||
|
||||
/**
|
||||
@@ -39,4 +40,6 @@ userRouter.get("/test", (req, res) => {
|
||||
*/
|
||||
userRouter.post("/signup", validate(signupSchema), signupController);
|
||||
|
||||
userRouter.post("/signin", validate(signinSchema), signinController);
|
||||
|
||||
export default userRouter;
|
||||
@@ -1,6 +1,7 @@
|
||||
import { SALT } from "../config/veriables.js";
|
||||
import { createUser } from "../repositories/user.repo.js";
|
||||
import { JWT_PRIVATE, SALT } from "../config/veriables.js";
|
||||
import { createUser, findUserByEmail } from "../repositories/user.repo.js";
|
||||
import bcrypt from "bcrypt";
|
||||
import jwt from "jsonwebtoken";
|
||||
|
||||
export async function signupService(username, email, password) {
|
||||
try {
|
||||
@@ -24,3 +25,35 @@ export async function signupService(username, email, password) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function signinService(email, password) {
|
||||
try{
|
||||
if (email.trim() == "" || password.trim() == "") {
|
||||
throw {
|
||||
statusCode: 400,
|
||||
message: "All fields are required",
|
||||
};
|
||||
}
|
||||
|
||||
const user = await findUserByEmail(email);
|
||||
if (!user){
|
||||
throw {
|
||||
statusCode : 404,
|
||||
message : "User not found."
|
||||
}
|
||||
}
|
||||
if (!bcrypt.compareSync(password, user?.password)){
|
||||
throw {
|
||||
statusCode : 401,
|
||||
message : "Password isn't correct."
|
||||
}
|
||||
}
|
||||
|
||||
const token = jwt.sign({id : user._id}, JWT_PRIVATE);
|
||||
const {password:pass, ...userData} = user._doc;
|
||||
return {token, userData};
|
||||
}
|
||||
catch(err){
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
20
backend/src/validations/signinValidation.js
Normal file
20
backend/src/validations/signinValidation.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import { z } from "zod";
|
||||
|
||||
const signinSchema = z.object({
|
||||
email: z
|
||||
.string({
|
||||
required_error: "Email is required.",
|
||||
})
|
||||
.min(1, "Email is required.")
|
||||
.max(200, "Email cant be more then 200 charecters.")
|
||||
.email("Invalid email input"),
|
||||
|
||||
password: z
|
||||
.string({
|
||||
required_error: "Password is required",
|
||||
})
|
||||
.min(6, "Password cant be less than 6 charecters")
|
||||
.max(50, "Password cant be more than 50 charecters"),
|
||||
});
|
||||
|
||||
export default signinSchema;
|
||||
Reference in New Issue
Block a user