Clean up
This commit is contained in:
parent
bf629ac985
commit
026d864a53
4 changed files with 1 additions and 228 deletions
24
README.md
24
README.md
|
|
@ -1,23 +1 @@
|
|||
# Fizika - Physics Quiz Application
|
||||
|
||||
A comprehensive physics quiz application for Hungarian students preparing for their physics exams (érettségi). The application consists of a frontend quiz interface and an admin backend for content management.
|
||||
|
||||
## 🚀 Features
|
||||
|
||||
### Student Interface (Frontend)
|
||||
|
||||
- Interactive physics quiz questions
|
||||
- Multiple choice questions with immediate feedback
|
||||
- Category-based filtering (dynamics, mechanics, fluids, etc.)
|
||||
- Search functionality by year, month, and question number
|
||||
- Responsive design for desktop and mobile
|
||||
- Progress tracking and scoring
|
||||
- Timer functionality
|
||||
|
||||
### Admin Interface (Backend)
|
||||
|
||||
- 📝 Full CRUD operations for quiz questions
|
||||
- 🖼️ Image management (upload, view, delete)
|
||||
- 📊 RESTful API for frontend integration
|
||||
- 🛡️ Basic security features (input validation)
|
||||
- 🐳 Docker containerization ready
|
||||
# Fizika
|
||||
|
|
|
|||
|
|
@ -1,134 +0,0 @@
|
|||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Common Development Commands
|
||||
|
||||
### Running the Application
|
||||
```bash
|
||||
npm run dev # Development mode with nodemon hot reload
|
||||
npm start # Production mode
|
||||
```
|
||||
|
||||
### Docker Commands
|
||||
```bash
|
||||
# Production deployment
|
||||
docker-compose up -d
|
||||
|
||||
# Development with hot reload
|
||||
docker-compose --profile dev up fizika-admin-dev
|
||||
|
||||
# Build image manually
|
||||
docker build -t fizika-admin ./backend
|
||||
```
|
||||
|
||||
### Environment Setup
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Edit .env with your configuration
|
||||
```
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
This is a single-file Node.js/Express backend (`server.js`) that serves as both:
|
||||
1. **API Server**: Provides REST endpoints for question and image management
|
||||
2. **Static File Server**: Serves the admin interface from `/public/` directory
|
||||
|
||||
### Key Components
|
||||
|
||||
**Data Storage**:
|
||||
- Questions stored in JSON file at `../frontend/fizika.json` (configurable via `DATA_PATH`)
|
||||
- Images stored in `../frontend/pics/` directory (configurable via `PICS_PATH`)
|
||||
|
||||
**Admin Interface**:
|
||||
- Built-in web UI served from `/public/index.html`
|
||||
- JavaScript client in `/public/admin.js`
|
||||
- No authentication required (simplified for admin use)
|
||||
|
||||
**API Structure**:
|
||||
- Public endpoints: `/api/fizika`, `/api/images`, `/api/pics/:filename`
|
||||
- Admin endpoints: `/api/admin/questions`, `/api/admin/images`
|
||||
- No JWT authentication implemented despite README documentation
|
||||
|
||||
### Question Data Format
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"source": "2016/m1/1",
|
||||
"description": "Question text...",
|
||||
"a": "Option A",
|
||||
"b": "Option B",
|
||||
"c": "Option C",
|
||||
"d": "Option D",
|
||||
"correct": 2,
|
||||
"type": "md",
|
||||
"image": "optional-image.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
### Complete Question Types (17 Categories)
|
||||
|
||||
**IMPORTANT**: The README only mentions 3 types, but the frontend supports all 17:
|
||||
|
||||
**Mechanics (Mechanika)**:
|
||||
- `mec` - Mechanika (general mechanics)
|
||||
- `mk` - Kinematika (kinematics)
|
||||
- `md` - Dinamika (dynamics)
|
||||
- `me` - Munka és energia (work and energy)
|
||||
- `mf` - Folyadékok és gázok mechanikája (fluid mechanics)
|
||||
- `mr` - Rezgések és hullámok (oscillations and waves)
|
||||
|
||||
**Thermodynamics**:
|
||||
- `h` - Hőtan (thermodynamics)
|
||||
|
||||
**Electricity**:
|
||||
- `ele` - Elektromosság (general electricity)
|
||||
- `es` - Elektrosztatika (electrostatics)
|
||||
- `ee` - Egyenáram (direct current)
|
||||
- `ev` - Váltakozó áram (alternating current)
|
||||
|
||||
**Other Physics**:
|
||||
- `m` - Mágnesesség (magnetism)
|
||||
- `o` - Fénytan (optics)
|
||||
- `atm` - Atomfizika (general atomic physics)
|
||||
- `ah` - Atomhéj (electron shells)
|
||||
- `am` - Atommag (atomic nucleus)
|
||||
- `cs` - Égi mechanika, csillagászat (celestial mechanics, astronomy)
|
||||
- `v` - Vegyes (mixed/various)
|
||||
|
||||
### Security Considerations
|
||||
- Helmet.js for security headers
|
||||
- CORS configuration via `FRONTEND_URL` environment variable
|
||||
- File upload restricted to images only (5MB limit)
|
||||
- Input validation minimal - add validation when modifying endpoints
|
||||
|
||||
## File Structure
|
||||
```
|
||||
backend/
|
||||
├── server.js # Main application file
|
||||
├── public/
|
||||
│ ├── index.html # Admin interface HTML
|
||||
│ └── admin.js # Admin interface JavaScript
|
||||
├── package.json
|
||||
├── Dockerfile
|
||||
├── docker-compose.yml
|
||||
└── .env.example
|
||||
```
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **Single File Architecture**: All server logic is in `server.js` - no separate route files or modules
|
||||
- **File-based Data**: Uses JSON file for persistence, not a database
|
||||
- **No Authentication**: Despite README documentation mentioning JWT, no auth is implemented
|
||||
- **Path Dependencies**: Assumes frontend directory structure (`../frontend/fizika.json`, `../frontend/pics/`)
|
||||
- **Admin UI Included**: Built-in web interface accessible at root path `/`
|
||||
- **Question Types**: Support all 17 physics categories listed above, not just the 3 in README
|
||||
|
||||
## Making Changes
|
||||
|
||||
When modifying the API:
|
||||
1. All changes go in `server.js`
|
||||
2. Test both API endpoints and admin UI functionality
|
||||
3. Ensure question type validation supports all 17 categories if adding validation
|
||||
4. Consider impact on file paths and data format
|
||||
5. Update environment variables in `.env.example` if needed
|
||||
|
|
@ -17,7 +17,6 @@ ENV NODE_ENV=production
|
|||
ENV PORT=3001
|
||||
EXPOSE 3001
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD node -e "require('http').get('http://localhost:3001/api/fizika', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,70 +0,0 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
fizika-admin:
|
||||
build:
|
||||
context: ./backend
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "3001:3001"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- PORT=3001
|
||||
- FRONTEND_URL=${FRONTEND_URL:-*}
|
||||
- DATA_PATH=${DATA_PATH:-/usr/src/app/fizika.json}
|
||||
- PICS_PATH=${PICS_PATH:-/usr/src/app/pics}
|
||||
volumes:
|
||||
# Mount data files
|
||||
- ./fizika.json:/usr/src/app/fizika.json:ro
|
||||
- ./pics:/usr/src/app/pics
|
||||
# Optional: mount for development
|
||||
# - ./backend:/usr/src/app
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "node", "-e", "require('http').get('http://localhost:3001/api/fizika', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
# Optional: Development service with hot reload
|
||||
fizika-admin-dev:
|
||||
build:
|
||||
context: ./backend
|
||||
dockerfile: Dockerfile
|
||||
target: dev-dependencies
|
||||
ports:
|
||||
- "3001:3001"
|
||||
environment:
|
||||
- NODE_ENV=development
|
||||
- PORT=3001
|
||||
- FRONTEND_URL=*
|
||||
- DATA_PATH=/usr/src/app/fizika.json
|
||||
- PICS_PATH=/usr/src/app/pics
|
||||
volumes:
|
||||
- ./backend:/usr/src/app
|
||||
- ./fizika.json:/usr/src/app/fizika.json
|
||||
- ./pics:/usr/src/app/pics
|
||||
- /usr/src/app/node_modules
|
||||
command: npm run dev
|
||||
profiles: ["dev"]
|
||||
|
||||
# Optional: Nginx reverse proxy for production
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- .:/usr/share/nginx/html:ro
|
||||
# SSL certificates (if using HTTPS)
|
||||
# - ./ssl:/etc/ssl/certs
|
||||
depends_on:
|
||||
- fizika-admin
|
||||
restart: unless-stopped
|
||||
profiles: ["nginx"]
|
||||
|
||||
networks:
|
||||
default:
|
||||
name: fizika-network
|
||||
Loading…
Add table
Add a link
Reference in a new issue