@tomisakae/syosetu-api
Version:
Enterprise-grade Fastify TypeScript API for Syosetu.com data extraction using official API and web scraping. Run instantly with 'npx @tomisakae/syosetu-api'
296 lines (217 loc) • 7.25 kB
Markdown
# Syosetu API Backend
Enterprise-grade Fastify TypeScript API chuyên dụng để lấy dữ liệu từ trang web tiểu thuyết Nhật Bản **syosetu.com** sử dụng API chính thức và Cheerio scraping (serverless-ready).
## ✨ Tính năng
- 📊 **Lấy ranking tiểu thuyết** theo thể loại và thời gian
- 📚 **Lấy thông tin chi tiết tiểu thuyết** (metadata, danh sách chapter)
- 📖 **Lấy nội dung chapter đầy đủ** với Cheerio scraping
- 🔍 **Tìm kiếm tiểu thuyết** với nhiều bộ lọc nâng cao
- 🛡️ **Bảo mật enterprise** với Helmet, CORS, Rate Limiting
- ⚡ **Hiệu suất cao** với caching thông minh và Cheerio
- 🚀 **Serverless ready** - tối ưu cho Vercel, Netlify, AWS Lambda
- 📝 **TypeScript** với type safety hoàn toàn
- 📚 **Swagger Documentation** tự động
- 🧪 **Testing** với Jest
- 📊 **Logging** với Pino
- 🏗️ **Architecture** chuẩn enterprise
## 🚀 Cài đặt
### Chạy nhanh với NPX (Recommended)
```bash
# Chạy trực tiếp mà không cần cài đặt
npx syosetu-api-backend
# Hoặc cài đặt global
npm install -g syosetu-api-backend
syosetu-api
```
### Development Setup
```bash
# Clone repository
git clone <repository-url>
cd WebDataBackend
# Cài đặt dependencies
npm install
# Copy và cấu hình environment
cp .env.example .env
# Build TypeScript
npm run build
# Chạy ở chế độ development
npm run dev
# Chạy ở chế độ production
npm start
```
## 📋 Scripts
```bash
npm run build # Build TypeScript to JavaScript
npm start # Chạy server production
npm run dev # Chạy server development với hot reload
npm run dev:watch # Chạy server development với nodemon
npm test # Chạy tests
npm run test:watch # Chạy tests với watch mode
npm run test:coverage # Chạy tests với coverage report
npm run lint # Kiểm tra code style
npm run lint:fix # Tự động sửa code style
npm run format # Format code với Prettier
npm run clean # Xóa thư mục dist
npm run typecheck # Kiểm tra TypeScript types
```
## 🌐 API Endpoints
### Health Check
```
GET /health # Health check cơ bản
GET /api/syosetu/status # Status chi tiết với cache stats
```
### Novel Data
```
GET /api/syosetu/novel/:ncode # Lấy thông tin tiểu thuyết
GET /api/syosetu/novel/:ncode/chapter/:chapter # Lấy nội dung chapter
POST /api/syosetu/novel/:ncode/chapters # Lấy nhiều chapter (max 10)
```
### Search & Ranking
```
GET /api/syosetu/search # Tìm kiếm tiểu thuyết
GET /api/syosetu/ranking # Lấy ranking tiểu thuyết
```
### Documentation
```
GET /docs # Swagger UI Documentation
```
## 📖 API Documentation
Sau khi chạy server, truy cập:
- **Swagger UI**: `http://localhost:3000/docs`
- **Health Check**: `http://localhost:3000/health`
## 🏗️ Cấu trúc dự án
```
src/
├── config/ # Cấu hình ứng dụng
├── controllers/ # Controllers xử lý request
├── middleware/ # Middleware functions
├── routes/ # Route definitions
├── services/ # Business logic services
├── types/ # TypeScript type definitions
├── utils/ # Utility functions
├── test/ # Test files
├── app.ts # Fastify app setup
└── server.ts # Server entry point
```
## ⚙️ Cấu hình Environment
```env
# Server
NODE_ENV=development
PORT=3000
HOST=0.0.0.0
# API Settings
API_TIMEOUT=30000
MAX_CONCURRENT_REQUESTS=5
# Puppeteer
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=false
PUPPETEER_EXECUTABLE_PATH=
# CORS
CORS_ORIGIN=*
CORS_CREDENTIALS=true
# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000 # 15 phút
RATE_LIMIT_MAX=100 # 100 requests/15 phút
CONTENT_RATE_LIMIT_WINDOW_MS=300000 # 5 phút
CONTENT_RATE_LIMIT_MAX=20 # 20 requests/5 phút
# Logging
LOG_LEVEL=info
LOG_PRETTY_PRINT=true
# Cache
METADATA_CACHE_TTL=600 # 10 phút
CONTENT_CACHE_TTL=3600 # 1 giờ
# External APIs
SYOSETU_API_BASE_URL=https://api.syosetu.com/novelapi/api/
SYOSETU_NCODE_BASE_URL=https://ncode.syosetu.com
```
## 🧪 Testing
```bash
# Chạy tất cả tests
npm test
# Chạy tests với watch mode
npm run test:watch
# Chạy tests với coverage
npm run test:coverage
# Chạy tests cho file cụ thể
npm test -- health.test.ts
```
## 📊 Monitoring & Logging
- **Health Check**: `/health` và `/api/syosetu/status`
- **Logs**: Sử dụng Pino với pretty printing trong development
- **Cache Stats**: Xem thống kê cache trong status endpoint
- **Browser Status**: Kiểm tra trạng thái Puppeteer browser
## 🔒 Security Features
- **Helmet**: Security headers
- **CORS**: Cross-origin resource sharing
- **Rate Limiting**: API và content rate limiting riêng biệt
- **Input Validation**: Zod schema validation
- **Error Handling**: Comprehensive error handling
- **Type Safety**: Full TypeScript coverage
## 🚀 Deployment
### Docker (Recommended)
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY dist ./dist
EXPOSE 3000
CMD ["node", "dist/server.js"]
```
### PM2
```bash
npm run build
pm2 start dist/server.js --name syosetu-api
```
## 🛠️ Development
### Prerequisites
- Node.js 18+
- npm hoặc yarn
- Chrome/Chromium (cho Puppeteer)
### Setup Development Environment
```bash
# Clone và cài đặt
git clone <repo>
cd WebDataBackend
npm install
# Cấu hình environment
cp .env.example .env
# Chạy development server
npm run dev
```
### Code Style
- **ESLint**: Linting với TypeScript rules
- **Prettier**: Code formatting
- **TypeScript**: Strict mode enabled
- **Husky**: Git hooks (nếu cần)
## 📈 Performance
- **Caching**: NodeCache với TTL cho metadata và content
- **Rate Limiting**: Ngăn chặn abuse
- **Connection Pooling**: Tái sử dụng browser instances
- **Request Optimization**: Chặn resources không cần thiết
## 🐛 Troubleshooting
### Lỗi Chromium không khởi động
```bash
# Ubuntu/Debian
sudo apt-get install -y chromium-browser
# Hoặc set executable path
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
```
### Lỗi Memory
```bash
# Tăng memory limit cho Node.js
node --max-old-space-size=4096 dist/server.js
```
### Lỗi Rate Limiting
- Kiểm tra cấu hình rate limit trong .env
- Syosetu.com có thể chậm vào giờ cao điểm
## 📄 License
MIT License
## 🤝 Contributing
1. Fork repository
2. Tạo feature branch
3. Commit changes
4. Push to branch
5. Create Pull Request
## 📞 Support
- **Issues**: GitHub Issues
- **Documentation**: `/docs` endpoint
- **Health Check**: `/health` endpoint