Files
2026-04-18 14:53:41 +00:00

178 lines
6.3 KiB
Markdown

# Networking Event Platform - Specification
## Project Overview
- **Project Name**: NetEvent
- **Type**: Full-stack web application (Flask + MySQL)
- **Core Functionality**: A platform for organizing networking events where attendees can RSVP, connect, and schedule appointments
- **Target Users**: Event organizers and event attendees
## Technology Stack
- **Backend**: Python Flask
- **Database**: MySQL (roast.duckdns.org:33062)
- **Frontend**: HTML/CSS/JavaScript with Jinja2 templates
## Database Schema
### Tables
#### `organizers`
| Column | Type | Description |
|--------|------|-------------|
| id | INT PRIMARY KEY AUTO_INCREMENT | Organizer ID |
| email | VARCHAR(255) UNIQUE | Organizer email |
| password_hash | VARCHAR(255) | Hashed password |
| name | VARCHAR(255) | Organizer name |
| created_at | TIMESTAMP | Creation timestamp |
#### `events`
| Column | Type | Description |
|--------|------|-------------|
| id | INT PRIMARY KEY AUTO_INCREMENT | Event ID |
| organizer_id | INT FOREIGN KEY | Reference to organizers |
| code | VARCHAR(10) UNIQUE | Unique 10-char alphanumeric event code for deep linking |
| name | VARCHAR(255) | Event name |
| description | TEXT | Event description |
| start_time | DATETIME | Event start date/time |
| end_time | DATETIME | Event end date/time |
| location | VARCHAR(255) | Event location |
| max_attendees | INT | Maximum attendees (NULL = unlimited) |
| created_at | TIMESTAMP | Creation timestamp |
#### `attendees`
| Column | Type | Description |
|--------|------|-------------|
| id | INT PRIMARY KEY AUTO_INCREMENT | Attendee ID |
| event_id | INT FOREIGN KEY | Reference to events |
| email | VARCHAR(255) | Attendee email |
| password_hash | VARCHAR(255) | Hashed password |
| first_name | VARCHAR(100) | First name |
| last_name | VARCHAR(100) | Last name |
| organisation | VARCHAR(255) | Organization/Company |
| role | VARCHAR(255) | Role/Profession |
| introduction | TEXT | Short introduction |
| profile_picture | VARCHAR(255) | Profile picture path |
| created_at | TIMESTAMP | Creation timestamp |
#### `connections`
| Column | Type | Description |
|--------|------|-------------|
| id | INT PRIMARY KEY AUTO_INCREMENT | Connection ID |
| attendee_id | INT FOREIGN KEY | Requester attendee |
| connected_attendee_id | INT FOREIGN KEY | Connect target attendee |
| status | ENUM('pending','accepted','rejected') | Connection status |
| created_at | TIMESTAMP | Creation timestamp |
#### `appointments`
| Column | Type | Description |
|--------|------|-------------|
| id | INT PRIMARY KEY AUTO_INCREMENT | Appointment ID |
| event_id | INT FOREIGN KEY | Reference to events |
| requester_id | INT FOREIGN KEY | Requester attendee |
| target_id | INT FOREIGN KEY | Target attendee |
| appointment_time | DATETIME | Proposed meeting time |
| location | VARCHAR(255) | Meeting location |
| notes | TEXT | Appointment notes |
| status | ENUM('pending','accepted','rejected') | Appointment status |
| created_at | TIMESTAMP | Creation timestamp |
## Functionality Specification
### Organiser Features
1. **Authentication**: Login/logout for organizers
2. **Event Management**: Create, edit, delete events
3. **Attendee List**: View all attendees for their events
4. **Badge Printing**: Generate printable badge list (PDF-ready HTML)
5. **Attendance Stats**: See check-in counts and attendee statistics
6. **QR Code Scanning**: Mobile camera-based check-in by scanning attendee QR codes
### Attendee Features
1. **Authentication**: Register/login for attendees
2. **Event RSVP**: Register for events
3. **Profile Management**: Update profile with name, org, role, intro, photo
4. **Connections**: Send/accept/reject connection requests
5. **Appointments**: Request/accept/reject meeting appointments
### User Interactions & Flows
#### Organiser Flow
1. Login → Dashboard → Create Event → View Attendees → Print Badges
#### Attendee Flow
1. Register → Login → RSVP to Event → Manage Profile → Connect with Attendees → Request Appointments
## API Endpoints
### Auth
- `POST /api/auth/organizer/register` - Register organizer
- `POST /api/auth/organizer/login` - Login organizer
- `POST /api/auth/attendee/register` - Register attendee
- `POST /api/auth/attendee/login` - Login attendee
- `POST /api/auth/logout` - Logout
### Events
- `GET /api/events` - List public events
- `POST /api/events` - Create event (organizer)
- `GET /api/events/<id>` - Get event details
- `PUT /api/events/<id>` - Update event
- `DELETE /api/events/<id>` - Delete event
### Attendees
- `GET /api/events/<id>/attendees` - List attendees for event
- `GET /api/attendees/<id>` - Get attendee profile
- `PUT /api/attendees/<id>` - Update attendee profile
- `POST /api/attendees/<id>/photo` - Upload profile photo
### Connections
- `GET /api/connections` - List my connections
- `POST /api/connections` - Send connection request
- `PUT /api/connections/<id>` - Accept/reject connection
- `GET /api/attendees` - Search attendees
### Appointments
- `GET /api/appointments` - List my appointments
- `POST /api/appointments` - Request appointment
- `PUT /api/appointments/<id>` - Accept/reject appointment
### Organizer Tools
- `GET /api/organizer/events/<id>/badges` - Get badge printable view
- `GET /api/organizer/events/<id>/stats` - Get attendance stats
- `GET /api/organizer/events/<id>/scan` - QR code scanner page for check-in
## Security
- Password hashing with bcrypt
- Session-based authentication
- CSRF protection
- SQL injection prevention via parameterized queries
## File Structure
```
/home/paul/conference/
├── app.py # Flask application
├── config.py # Configuration
├── init_db.py # Database initialization script
├── requirements.txt # Python dependencies
├── static/
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
└── templates/
├── base.html
├── index.html
├── auth/
│ ├── login.html
│ └── register.html
├── organizer/
│ ├── dashboard.html
│ ├── create_event.html
│ ├── event_detail.html
│ ├── badges.html
│ └── scan.html
└── attendee/
├── dashboard.html
├── event.html
├── profile.html
├── connections.html
└── appointments.html
```