Added signin route in backend

This commit is contained in:
Manik Maity
2024-11-08 12:51:14 +05:30
parent edfce3edaa
commit 582daa2c3b
9 changed files with 256 additions and 28 deletions

View File

@@ -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;

View File

@@ -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,
});
}
}
}
}

View File

@@ -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) => {

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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;
}
}

View 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;