Una API RESTful robusta y escalable construida con Node.js y TypeScript. Incluye autenticación, documentación automática, validación de datos y todas las mejores prácticas para el desarrollo de APIs modernas.
// controllers/user.controller.ts
import { Request, Response } from 'express';
import { User } from '../models/user.model';
import { createUserSchema } from '../validators/user.validator';
export class UserController {
async createUser(req: Request, res: Response) {
try {
// Validar input
const { error, value } = createUserSchema.validate(req.body);
if (error) {
return res.status(400).json({
status: 'error',
message: error.details[0].message
});
}
// Verificar si el usuario existe
const existingUser = await User.findOne({ email: value.email });
if (existingUser) {
return res.status(409).json({
status: 'error',
message: 'User already exists'
});
}
// Crear nuevo usuario
const user = new User(value);
await user.save();
// Generar token
const token = user.generateAuthToken();
res.status(201).json({
status: 'success',
data: {
user: user.toJSON(),
token
}
});
} catch (error) {
res.status(500).json({
status: 'error',
message: 'Internal server error'
});
}
}
}
// middleware/auth.middleware.ts
import { Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';
import { User } from '../models/user.model';
export const auth = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) {
throw new Error();
}
const decoded = jwt.verify(token, process.env.JWT_SECRET!);
const user = await User.findOne({
_id: decoded._id,
'tokens.token': token
});
if (!user) {
throw new Error();
}
req.token = token;
req.user = user;
next();
} catch (error) {
res.status(401).json({
status: 'error',
message: 'Please authenticate'
});
}
}
Explora la documentación y el código: