migration to typescript
This commit is contained in:
parent
924000b084
commit
9fde77468a
41 changed files with 11952 additions and 10164 deletions
|
|
@ -4,7 +4,7 @@ description: Complete workflow for developing E-Learning Platform backend
|
|||
|
||||
# E-Learning Backend Development Workflow
|
||||
|
||||
Complete guide for developing the E-Learning Platform backend from scratch.
|
||||
Complete guide for developing the E-Learning Platform backend using TypeScript and TSOA.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -28,6 +28,10 @@ cd e-learning/Backend
|
|||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Install TypeScript and TSOA
|
||||
npm install -D typescript @types/node @types/express ts-node nodemon
|
||||
npm install tsoa swagger-ui-express
|
||||
|
||||
# Setup environment
|
||||
cp .env.example .env
|
||||
# Edit .env with your configuration
|
||||
|
|
@ -126,72 +130,12 @@ npx prisma migrate dev --name initial_schema
|
|||
- `POST /api/auth/refresh` - Refresh token
|
||||
|
||||
**Implementation steps:**
|
||||
1. Create `src/routes/auth.routes.js`
|
||||
2. Create `src/controllers/auth.controller.js`
|
||||
3. Create `src/services/auth.service.js`
|
||||
4. Implement JWT middleware
|
||||
5. Write tests
|
||||
1. Create TSOA controller with `@Route`, `@Post` decorators
|
||||
2. Create TypeScript service with interfaces
|
||||
3. Implement JWT middleware
|
||||
4. Write tests
|
||||
|
||||
**Example:**
|
||||
```javascript
|
||||
// src/services/auth.service.js
|
||||
const bcrypt = require('bcrypt');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const { PrismaClient } = require('@prisma/client');
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
class AuthService {
|
||||
async register({ username, email, password, role_id = 3 }) {
|
||||
const hashedPassword = await bcrypt.hash(password, 10);
|
||||
|
||||
const user = await prisma.user.create({
|
||||
data: {
|
||||
username,
|
||||
email,
|
||||
password: hashedPassword,
|
||||
role_id
|
||||
},
|
||||
include: { role: true }
|
||||
});
|
||||
|
||||
const token = this.generateToken(user);
|
||||
return { user, token };
|
||||
}
|
||||
|
||||
async login({ username, email, password }) {
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
OR: [
|
||||
{ username },
|
||||
{ email }
|
||||
]
|
||||
},
|
||||
include: { role: true }
|
||||
});
|
||||
|
||||
if (!user || !await bcrypt.compare(password, user.password)) {
|
||||
throw new Error('Invalid credentials');
|
||||
}
|
||||
|
||||
const token = this.generateToken(user);
|
||||
return { user, token };
|
||||
}
|
||||
|
||||
generateToken(user) {
|
||||
return jwt.sign(
|
||||
{
|
||||
userId: user.id,
|
||||
username: user.username,
|
||||
role: user.role.code
|
||||
},
|
||||
process.env.JWT_SECRET,
|
||||
{ expiresIn: process.env.JWT_EXPIRES_IN }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new AuthService();
|
||||
```
|
||||
See [Create API Endpoint Workflow](./create-api-endpoint.md) for detailed examples.
|
||||
|
||||
### 3.2 Course Management
|
||||
|
||||
|
|
@ -324,41 +268,11 @@ model Course {
|
|||
|
||||
### 5.2 Caching (Redis)
|
||||
|
||||
Implement caching for:
|
||||
- Course listings
|
||||
- User sessions
|
||||
- Frequently accessed data
|
||||
|
||||
```javascript
|
||||
const redis = require('redis');
|
||||
const client = redis.createClient({
|
||||
url: process.env.REDIS_URL
|
||||
});
|
||||
|
||||
// Cache course list
|
||||
const cacheKey = 'courses:approved';
|
||||
const cached = await client.get(cacheKey);
|
||||
|
||||
if (cached) {
|
||||
return JSON.parse(cached);
|
||||
}
|
||||
|
||||
const courses = await prisma.course.findMany(...);
|
||||
await client.setEx(cacheKey, 3600, JSON.stringify(courses));
|
||||
```
|
||||
Cache course listings, user sessions, and frequently accessed data using Redis with `setEx()` for TTL.
|
||||
|
||||
### 5.3 Rate Limiting
|
||||
|
||||
```javascript
|
||||
const rateLimit = require('express-rate-limit');
|
||||
|
||||
const limiter = rateLimit({
|
||||
windowMs: 15 * 60 * 1000, // 15 minutes
|
||||
max: 100 // limit each IP to 100 requests per windowMs
|
||||
});
|
||||
|
||||
app.use('/api/', limiter);
|
||||
```
|
||||
Use `express-rate-limit` middleware to limit requests (e.g., 100 requests per 15 minutes).
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -379,16 +293,7 @@ app.use('/api/', limiter);
|
|||
|
||||
### 6.2 Implement Security Middleware
|
||||
|
||||
```javascript
|
||||
const helmet = require('helmet');
|
||||
const cors = require('cors');
|
||||
|
||||
app.use(helmet());
|
||||
app.use(cors({
|
||||
origin: process.env.CORS_ORIGIN.split(','),
|
||||
credentials: true
|
||||
}));
|
||||
```
|
||||
Use `helmet()` for security headers and configure CORS with allowed origins.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -396,15 +301,25 @@ app.use(cors({
|
|||
|
||||
### 7.1 API Documentation
|
||||
|
||||
Use Swagger/OpenAPI:
|
||||
TSOA automatically generates Swagger/OpenAPI documentation:
|
||||
|
||||
```javascript
|
||||
const swaggerUi = require('swagger-ui-express');
|
||||
const swaggerDocument = require('./swagger.json');
|
||||
```typescript
|
||||
import swaggerUi from 'swagger-ui-express';
|
||||
|
||||
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
|
||||
app.use('/api-docs', swaggerUi.serve, async (_req, res) => {
|
||||
return res.send(
|
||||
swaggerUi.generateHTML(await import('../public/swagger.json'))
|
||||
);
|
||||
});
|
||||
```
|
||||
|
||||
**Generate documentation:**
|
||||
```bash
|
||||
npm run tsoa:gen
|
||||
```
|
||||
|
||||
Access at: `http://localhost:4000/api-docs`
|
||||
|
||||
### 7.2 Code Documentation
|
||||
|
||||
- JSDoc comments for all functions
|
||||
|
|
@ -500,35 +415,9 @@ git push origin feature/user-authentication
|
|||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Database connection error:**
|
||||
```bash
|
||||
# Check PostgreSQL
|
||||
docker ps | grep postgres
|
||||
docker logs elearning-postgres
|
||||
|
||||
# Test connection
|
||||
npx prisma db pull
|
||||
```
|
||||
|
||||
**Port already in use:**
|
||||
```bash
|
||||
# Find process
|
||||
lsof -i :4000
|
||||
|
||||
# Kill process
|
||||
kill -9 <PID>
|
||||
```
|
||||
|
||||
**Prisma Client error:**
|
||||
```bash
|
||||
# Regenerate client
|
||||
npx prisma generate
|
||||
|
||||
# Reset and migrate
|
||||
npx prisma migrate reset
|
||||
```
|
||||
- **Database error**: Check `docker logs elearning-postgres`, run `npx prisma db pull`
|
||||
- **Port in use**: Find with `lsof -i :4000`, kill with `kill -9 <PID>`
|
||||
- **Prisma error**: Run `npx prisma generate` or `npx prisma migrate reset`
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -545,7 +434,9 @@ npx prisma migrate reset
|
|||
|
||||
```bash
|
||||
# Development
|
||||
npm run dev # Start dev server
|
||||
npm run dev # Start dev server (ts-node)
|
||||
npm run build # Build TypeScript
|
||||
npm run tsoa:gen # Generate TSOA routes & Swagger
|
||||
npm test # Run tests
|
||||
npm run lint # Run linter
|
||||
npm run format # Format code
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue