Is project mein 4 main layers hain:
presentation -> request / response application -> business logic domain -> rules / interfaces infrastructure-> database aur external libraries
import dotenv from 'dotenv'; import app from './src/app'; import connectDatabase from './src/infrastructure/config/database';
Ye project ka entry point hai.
Flow:
1. .env load karta hai 2. MongoDB connect karta hai 3. Express server start karta hai
Agar server.ts na ho to app run hi nahi karegi.
app.use(cors()); app.use(express.json());
Ye main express app banata hai.
Frontend ko backend access karne deta hai.
Example:
Frontend: localhost:3000 Backend : localhost:5000
Without CORS browser request block kar dega.
JSON body ko read karta hai.
Example:
{
"email": "test@gmail.com"
}Iske bina req.body undefined hota hai.
app.use('/auth', authRoutes);
Matlab:
/auth/signup /auth/login
export interface User { id?: string; username: string; email: string; password: string; }
Ye user ka shape define karta hai.
Matlab har user object aise hona chahiye:
{ username: string, email: string, password: string }
Ye sirf structure batata hai, database code nahi.
export interface UserRepository { findByEmail(email: string): Promise<User | null>; }
Ye contract hai.
Ye bolta hai:
Jo bhi repository hogi usme ye methods hone chahiye: - findByEmail - findById - create
Isse application layer ko farq nahi padta ke tum MongoDB use kar rahe ho ya MySQL.
Signup ke time agar same email already mil jaye to ye error throw hoti hai.
User already exists
Login ke time agar password ya email wrong ho.
Invalid email or password
Custom errors ka faida:
Readable code Easy debugging
DTO = Data Transfer Object
{ username, email, password }
{ email, password }
Ye define karta hai ke use case ko kis format mein data milega.
hash(password) compare(password, hashed)
Ye bhi interface hai.
Application layer ko pata nahi hota ke bcrypt use ho raha hai ya koi aur library.
Sirf ye pata hota hai:
Mujhe password hash karna hai Mujhe password compare karna hai
generate(userId) verify(token)
Ye JWT ke liye interface hai.
Application layer kehti hai:
Mujhe token banana aur verify karna hai
Lekin actual JWT code infrastructure mein hai.
Ye signup ki asli business logic hai.
Flow:
1. Email already exist check karo 2. Password hash karo 3. User save karo 4. User return karo
Example:
const existingUser = await this.userRepository.findByEmail(data.email);
Agar user mil jaye:
throw new UserAlreadyExistsError();
Ye login ki business logic hai.
Flow:
1. Email se user find karo 2. Password compare karo 3. JWT token banao 4. Token + user return karo
Example:
const token = this.tokenService.generate(user.id!);
Ye profile route ki business logic hai.
Flow:
1. userId lo 2. Database se user nikaalo 3. User return karo
mongoose.connect(process.env.MONGO_URI)
MongoDB connect karta hai.
.env se MONGO_URI leta hai.
Ye actual MongoDB schema hai.
const userSchema = new Schema({ username: String, email: String, password: String })
MongoDB ko batata hai ke user collection mein kaun kaun se fields hongi.
Ye directly database ke saath baat karta hai.
Ye UserRepository interface ki implementation hai.
Matlab domain ne bola tha:
findByEmail findById create
Aur yahan actual MongoDB code likha gaya:
await UserModel.findOne({ email })
Ye database aur application ke beech bridge hai.
Ye PasswordService ka actual version hai.
bcrypt.hash() bcrypt.compare()
Plain password ko secure password mein convert karta hai.
Example:
123456 ↓ $2a$10$....
Ye TokenService ka actual version hai.
jwt.sign() jwt.verify()
Login ke baad token generate karta hai.
Example:
Bearer eyJhbGciOiJIUzI1Ni...
Express ke normal Request mein user property nahi hoti.
Isliye custom request banayi:
req.user.userId
Ye auth middleware ke baad available hota hai.
if (!username || !email || !password)
Request validate karta hai.
Example:
Password empty ho Ya 6 se chhota ho
To error dega.
Login request validate karta hai.
Email aur password hona chahiye
Controller ka kaam hota hai:
1. Request receive karo 2. Validator call karo 3. Use case call karo 4. Response bhejo
Example:
const { username, email, password } = req.body;
Phir:
const useCase = new SignUpUserUseCase(...)
Controller mein business logic nahi honi chahiye.
Galat:
if (password.length < 6) {}
Ye validator mein hona chahiye.
Ye authenticated user ka profile return karta hai.
req.user!.userId
Ye value middleware se aati hai.
Ye protected routes ke liye hota hai.
Flow:
1. Authorization header lo 2. Token nikalo 3. Token verify karo 4. req.user mein userId save karo 5. next()
Example request:
Authorization: Bearer token_here
Agar token wrong ho:
401 Invalid token
router.post('/signup', signup) router.post('/login', login)
Ye URL ko controller ke saath connect karta hai.
router.get('/', authMiddleware, getProfile)
Pehle middleware chalega.
Agar token valid ho tab getProfile chalega.
PORT=5000 MONGO_URI=mongodb://127.0.0.1:27017/clean-auth JWT_SECRET=supersecret
Secret values yahan rakhi jati hain.
Example:
Database URL JWT secret Port
Inhe code mein directly nahi likhna chahiye.
POST /auth/signup ↓ auth.routes.ts ↓ auth.controller.ts ↓ signup.validator.ts ↓ SignUpUser.usecase.ts ↓ MongoUserRepository ↓ UserModel ↓ MongoDB
POST /auth/login ↓ auth.routes.ts ↓ auth.controller.ts ↓ login.validator.ts ↓ LoginUser.usecase.ts ↓ MongoUserRepository ↓ BcryptPasswordService ↓ JwtTokenService ↓ Response with Token
GET /profile ↓ profile.routes.ts ↓ auth.middleware.ts ↓ profile.controller.ts ↓ GetProfile.usecase.ts ↓ MongoUserRepository ↓ Response