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
|
# Fizika
|
||||||
|
|
||||||
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
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
ENV PORT=3001
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
|
|
||||||
# Health check
|
|
||||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
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))"
|
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