# Math Platform Backend

Backend API for the Linear Algebra Learning Platform built with Node.js, Express, TypeScript, Prisma, and PostgreSQL.

## Features

- **RESTful API** with Express.js
- **Type-safe** with TypeScript
- **ORM** with Prisma
- **Database** with PostgreSQL
- **Caching** with Redis
- **Authentication** with JWT
- **Rate Limiting** with Redis-backed storage
- **Structured Logging** with Winston
- **PDF Processing** with pdf-parse and pdf2pic
- **AI Integration** with MiniMax-M2.5 (Aliyun DashScope)
- **Telegram Notifications** (backend-only)
- **Queue System** with Bull
- **Docker Support** for containerization

## Tech Stack

- **Runtime**: Node.js 20 LTS
- **Framework**: Express.js 4.x
- **Language**: TypeScript 5.x
- **Database**: PostgreSQL 15
- **ORM**: Prisma 5.x
- **Cache/Queue**: Redis 7
- **Authentication**: JWT + bcrypt
- **Validation**: Zod
- **Logging**: Winston
- **Math Rendering**: KaTeX
- **AI**: MiniMax-M2.5 (OpenAI-compatible)

## Project Structure

```
backend/
├── prisma/
│   └── schema.prisma           # Prisma schema with all entities
├── src/
│   ├── config/
│   │   ├── auth/               # Authentication configuration
│   │   ├── database/           # Database configuration
│   │   ├── redis/              # Redis configuration
│   │   └── ai/                 # AI service configuration
│   ├── modules/
│   │   ├── auth/               # Authentication module
│   │   ├── pdf/                # PDF processing module
│   │   ├── exercise/           # Exercise management module
│   │   ├── module/             # Module management module
│   │   ├── progress/           # Progress tracking module
│   │   ├── ranking/            # Ranking system module
│   │   ├── notification/       # Notification module
│   │   └── user/               # User management module
│   ├── shared/
│   │   ├── database/           # Prisma client setup
│   │   ├── middleware/         # Express middleware
│   │   ├── utils/              # Utility functions
│   │   └── types/              # TypeScript types
│   ├── workers/                # Background workers
│   └── server.ts               # Main server file
├── .env.example                # Environment variables template
├── .gitignore
├── package.json
├── tsconfig.json
└── README.md
```

## Database Schema

### Core Entities

1. **User** - User accounts with authentication
2. **Module** - 3 pedagogical modules (Fundamentals, Systems/Spaces, Applications)
3. **Topic** - 5 topics (Vectors, Matrices, Systems, Vector Spaces, Linear Programming)
4. **Exercise** - Exercises with LaTeX formulas
5. **ExerciseAttempt** - User exercise attempts
6. **Progress** - User progress per module
7. **Achievement** - Gamification badges/achievements
8. **UserAchievement** - Unlocked achievements
9. **Ranking** - Leaderboard positions (global and per module)
10. **Notification** - Telegram notifications (backend only)
11. **ProcessedPdf** - Processed PDF metadata

### Enums

- **ModuleType**: FUNDAMENTOS, SISTEMAS_ESPACIOS, APLICACIONES
- **TopicType**: VECTORES, MATRICES, SISTEMAS, ESPACIOS_VECTORIALES, PROGRAMACION_LINEAL
- **ExerciseType**: MULTIPLE_CHOICE, OPEN_RESPONSE, CALCULATION, PROOF, TRUE_FALSE
- **ExerciseDifficulty**: BASIC, INTERMEDIATE, ADVANCED, EXPERT
- **AttemptStatus**: CORRECT, INCORRECT, PARTIAL, PENDING
- **AchievementCategory**: EXERCISES, MODULES, STREAKS, RANKING, SPECIAL
- **AchievementRarity**: COMMON, RARE, EPIC, LEGENDARY

## Getting Started

### Prerequisites

- Node.js 20+ LTS
- PostgreSQL 15
- Redis 7
- Docker (optional, for containerization)

### Installation

1. **Clone the repository**
   ```bash
   cd /home/ren/Documents/math2/backend
   ```

2. **Install dependencies**
   ```bash
   npm install
   ```

3. **Set up environment variables**
   ```bash
   cp .env.example .env
   # Edit .env with your configuration
   ```

4. **Set up the database**
   ```bash
   # Generate Prisma client
   npm run prisma:generate

   # Run migrations
   npm run prisma:migrate

   # (Optional) Seed database
   npm run prisma:seed
   ```

5. **Start the development server**
   ```bash
   npm run dev
   ```

The API will be available at `http://localhost:3001`

## API Endpoints

### Authentication
- `POST /api/auth/register` - Register new user
- `POST /api/auth/login` - Login user
- `GET /api/auth/me` - Get current user profile
- `POST /api/auth/refresh` - Refresh access token
- `POST /api/auth/logout` - Logout user

### Modules
- `GET /api/modules` - List all modules
- `GET /api/modules/:id` - Get module details
- `GET /api/modules/:id/introduction` - Get module introduction
- `GET /api/modules/:id/examples` - Get module examples
- `GET /api/modules/:id/exercises` - Get module exercises
- `GET /api/modules/:id/answers` - Get module answers

### Topics
- `GET /api/topics` - List all topics
- `GET /api/topics/:id` - Get topic details
- `GET /api/topics/:id/theory` - Get topic theory content

### Exercises
- `GET /api/exercises` - List exercises
- `GET /api/exercises/:id` - Get exercise details
- `POST /api/exercises/:id/attempt` - Submit exercise attempt
- `GET /api/exercises/:id/solution` - Get exercise solution

### Progress
- `GET /api/progress` - Get overall progress
- `GET /api/progress/module/:moduleId` - Get progress for specific module

### Ranking
- `GET /api/ranking/global` - Get global ranking
- `GET /api/ranking/module/:moduleId` - Get ranking for specific module
- `GET /api/ranking/my-position` - Get current user's position

### Achievements
- `GET /api/achievements` - List all available achievements
- `GET /api/achievements/my` - Get user's achievements

### AI Generation
- `POST /api/ai/generate-exercise` - Generate new exercise with AI
- `POST /api/ai/validate-answer` - Validate answer with AI

## Environment Variables

See `.env.example` for all available environment variables. Key variables include:

- `DATABASE_URL` - PostgreSQL connection string
- `REDIS_HOST` - Redis server host
- `JWT_SECRET` - Secret for JWT signing
- `AI_API_KEY` - API key for AI service
- `TELEGRAM_BOT_TOKEN` - Telegram bot token (backend notifications)

## Development Scripts

```bash
npm run dev              # Start development server with hot reload
npm run build            # Build for production
npm start                # Start production server
npm run prisma:generate  # Generate Prisma client
npm run prisma:migrate   # Run database migrations
npm run prisma:studio    # Open Prisma Studio
npm test                 # Run tests
npm run lint             # Lint code
npm run format           # Format code with Prettier
```

## Docker Usage

```bash
# Build image
docker build -t math-backend .

# Run container
docker run -p 3001:3001 --env-file .env math-backend

# Use Docker Compose (from root directory)
docker-compose up backend
```

## API Documentation

API documentation is available using OpenAPI/Swagger. Access it at:
- Production: `http://localhost:3001/api-docs`

## Testing

```bash
# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

# Run tests with coverage
npm run test:coverage
```

## Error Handling

The API uses standard HTTP status codes and returns error responses in the following format:

```json
{
  "success": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "Human-readable error message",
    "details": {}
  },
  "meta": {
    "timestamp": "2024-01-01T00:00:00.000Z",
    "requestId": "req_xxx"
  }
}
```

## Logging

Logs are stored in the `logs/` directory:
- `combined.log` - All logs
- `error.log` - Error logs only

Logs are structured JSON with correlation IDs for request tracing.

## Security Features

- JWT-based authentication
- Password hashing with bcrypt
- Rate limiting (Redis-backed)
- CORS configuration
- Helmet.js security headers
- Input validation with Zod
- SQL injection prevention (Prisma)
- XSS protection

## Performance Optimization

- Database connection pooling
- Redis caching
- Indexed database queries
- Compression middleware
- Optimized Prisma queries
- Background workers for heavy tasks

## Contributing

1. Follow the existing code style
2. Write tests for new features
3. Update documentation
4. Use TypeScript for type safety
5. Follow git commit conventions

## License

MIT

## Support

For issues or questions, please create an issue in the repository.
