bulk-questionnaire-upload/README.md

182 lines
4.4 KiB
Markdown

# Bulk Questionnaire Upload
A web application for uploading and parsing Excel-based questionnaires in XLSForm-like format with MongoDB integration.
## Project Structure
```
├── frontend/ # Angular frontend application
├── backend/ # FastAPI backend with MongoDB
└── README.md
```
## Stack
### Frontend
- Angular 16+
- Material UI
- SCSS
### Backend
- Python FastAPI
- MongoDB for data persistence
- `openpyxl`/`pandas` for Excel parsing
- `motor`/`pymongo` for MongoDB integration
## Prerequisites
- Python 3.8+ (recommend using a virtual environment)
- Node.js 16+ and npm
- MongoDB (local or cloud instance)
- pip
## Installation & Setup
### 1. Install MongoDB (Artix/Arch Linux)
**Start MongoDB service:**
```bash
sudo rc-service mongodb start # OpenRC (Artix default)
# or
sudo systemctl start mongodb # If using systemd
mongosh --eval "db.runCommand('ping')"
# Should output: { ok: 1 }
```
### 2. Backend Setup
1. **Navigate to the backend directory:**
```bash
cd backend/
```
2. **Create and activate virtual environment:**
```bash
python -m venv .venv
source .venv/bin/activate
```
3. **Install Python dependencies:**
```bash
pip install --upgrade pip
pip install --break-system-packages -r requirements.txt
```
> If you see an "externally-managed-environment" error, use the `--break-system-packages` flag as above.
4. **Create environment configuration:**
Create a `.env` file in the `backend/` directory:
```
MONGODB_URL=mongodb://localhost:27017
DATABASE_NAME=mform_bulk_upload
API_HOST=0.0.0.0
API_PORT=8000
```
5. **Start the FastAPI server:**
```bash
uvicorn main:app --reload
```
The API will be available at [http://localhost:8000](http://localhost:8000)
### 3. Frontend Setup
1. **Navigate to the frontend directory:**
```bash
cd frontend/
```
2. **Install Node.js dependencies:**
```bash
npm install
```
3. **Start the development server:**
```bash
ng serve
```
The frontend will be available at [http://localhost:4200](http://localhost:4200)
## API Endpoints
### File Validation
- **POST** `/api/validate`
Validate Excel file structure.
Returns detailed validation information including sheet status, metadata, and counts.
### File Upload
- **POST** `/api/upload`
Parse and store Excel file in MongoDB.
Saves form metadata, questions, and answer options to separate collections.
### Forms Management
- **GET** `/api/forms`
Get all forms from database.
- **GET** `/api/forms/{form_id}`
Get specific form with questions and options.
- **DELETE** `/api/forms/{form_id}`
Delete form and all related data.
## Database Schema
### Forms Collection
```json
{
"_id": "ObjectId",
"title": "string",
"language": "string",
"version": "string",
"created_at": "ISO timestamp"
}
```
### Questions Collection
```json
{
"_id": "ObjectId",
"form_id": "string",
"order": "number",
"title": "string",
"view_sequence": "number",
"input_type": "number",
"created_at": "ISO timestamp"
}
```
### Options Collection
```json
{
"_id": "ObjectId",
"form_id": "string",
"order": "number",
"option_id": "number",
"label": "string",
"created_at": "ISO timestamp"
}
```
## Sample Performance Metrics Output
Below is a real example of metrics collected for uploading 10 forms (each with ~400 questions and 3-10 options per question) based on the latest performance data:
| Description | Time |
| ------------------------------------------------ | -------------------------- |
| Time to validate each form file | 45.80-123.20ms (59.98ms) |
| Time to process and save one form | 0.49-288.43ms (126.84ms) |
| Time to process and save all questions in a form | 59.64-82.80ms (64.59ms) |
| Average time to process one question | 0.15-0.20ms (0.16ms) |
| Average time to process one option | 0.15-0.17ms (0.16ms) |
| Time to process all forms in the batch | 228.62-288.43ms (253.00ms) |
| Number of forms processed in the batch | 10 |
| Average time to process one form in the batch | 228.62-288.43ms (253.00ms) |
**Notes:**
- Metrics collected from backend/metrics.txt on 2025-07-28
- All times are in ms unless specified otherwise
- Hardware used is an M3 Pro Macbook Pro, with 18GB unified memory and 512GB of storage.