237 lines
5.2 KiB
Markdown
237 lines
5.2 KiB
Markdown
# Space Booking System
|
|
|
|
Web application for booking offices and meeting rooms with multi-tenant support, administrative approval flow, and public booking API.
|
|
|
|
## Tech Stack
|
|
|
|
**Backend:**
|
|
- FastAPI 0.115+ (Python 3.12+)
|
|
- SQLAlchemy 2.0 (ORM)
|
|
- SQLite database
|
|
- JWT authentication
|
|
- Uvicorn (ASGI server)
|
|
|
|
**Frontend:**
|
|
- Vue.js 3.4+
|
|
- Vite 5.x (build tool)
|
|
- Pinia (state management)
|
|
- Vue Router 4.x
|
|
- TypeScript
|
|
- FullCalendar (calendar view)
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- Python 3.12+
|
|
- Node.js 18+
|
|
- npm or yarn
|
|
|
|
### Backend Setup
|
|
|
|
```bash
|
|
cd backend
|
|
|
|
# Create virtual environment
|
|
python -m venv venv
|
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Seed database with demo users
|
|
python seed_db.py
|
|
|
|
# Run development server
|
|
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
|
```
|
|
|
|
Backend will be available at: http://localhost:8000
|
|
|
|
API documentation: http://localhost:8000/docs
|
|
|
|
### Frontend Setup
|
|
|
|
```bash
|
|
cd frontend
|
|
|
|
# Install dependencies
|
|
npm install
|
|
|
|
# Run development server
|
|
npm run dev
|
|
```
|
|
|
|
Frontend will be available at: http://localhost:5173
|
|
|
|
## Demo Accounts
|
|
|
|
After seeding the database (runs automatically on container start):
|
|
|
|
| Email | Password | Role |
|
|
|-------|----------|------|
|
|
| admin@example.com | adminpassword | Superadmin |
|
|
| manager@example.com | managerpassword | Manager |
|
|
| user@example.com | userpassword | User |
|
|
|
|
## Docker Compose (local)
|
|
|
|
```bash
|
|
# Create .env from template
|
|
cp backend/.env.example backend/.env
|
|
# Edit .env with your values
|
|
|
|
# Start all services
|
|
docker compose up --build
|
|
```
|
|
|
|
Frontend: http://localhost
|
|
Backend API: http://localhost:8000/docs
|
|
|
|
## Deploy (Dokploy)
|
|
|
|
```
|
|
Dokploy UI → New Service → Docker Compose → Git: space-booking repo
|
|
```
|
|
|
|
### Environment Variables (Dokploy → Environment tab)
|
|
|
|
| Variable | Required | Example |
|
|
|----------|----------|---------|
|
|
| `SECRET_KEY` | **Yes** | `python -c "import secrets; print(secrets.token_hex(32))"` |
|
|
| `FRONTEND_URL` | **Yes** | `https://space.roa.romfast.ro` |
|
|
| `SMTP_ENABLED` | No | `true` |
|
|
| `SMTP_HOST` | No* | `smtp.example.com` |
|
|
| `SMTP_PORT` | No* | `587` |
|
|
| `SMTP_USER` | No* | `user@example.com` |
|
|
| `SMTP_PASSWORD` | No* | `secret` |
|
|
| `SMTP_FROM_ADDRESS` | No* | `rezervari@romfast.ro` |
|
|
|
|
*Required only if `SMTP_ENABLED=true`
|
|
|
|
### Auto-seed
|
|
|
|
`entrypoint.sh` runs `seed_db.py` automatically on every container start.
|
|
The script is idempotent — skips if data already exists.
|
|
|
|
## Development Commands
|
|
|
|
### Backend
|
|
|
|
```bash
|
|
cd backend
|
|
|
|
# Type checking
|
|
mypy app/
|
|
|
|
# Linting
|
|
ruff check .
|
|
|
|
# Format code
|
|
ruff format .
|
|
|
|
# Run tests
|
|
pytest
|
|
|
|
# Run with auto-reload
|
|
uvicorn app.main:app --reload
|
|
```
|
|
|
|
### Frontend
|
|
|
|
```bash
|
|
cd frontend
|
|
|
|
# Type checking
|
|
npm run typecheck
|
|
|
|
# Linting
|
|
npm run lint
|
|
|
|
# Build for production
|
|
npm run build
|
|
|
|
# Preview production build
|
|
npm run preview
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
space-booking/
|
|
├── backend/
|
|
│ ├── app/
|
|
│ │ ├── api/ # API endpoints
|
|
│ │ ├── core/ # Core utilities (config, security)
|
|
│ │ ├── db/ # Database session
|
|
│ │ ├── models/ # SQLAlchemy models
|
|
│ │ ├── schemas/ # Pydantic schemas
|
|
│ │ └── main.py # FastAPI application
|
|
│ ├── tests/ # Backend tests
|
|
│ ├── requirements.txt
|
|
│ └── seed_db.py # Database seeding script
|
|
├── frontend/
|
|
│ ├── src/
|
|
│ │ ├── assets/ # CSS and static assets
|
|
│ │ ├── components/ # Vue components
|
|
│ │ ├── router/ # Vue Router configuration
|
|
│ │ ├── services/ # API services
|
|
│ │ ├── stores/ # Pinia stores
|
|
│ │ ├── types/ # TypeScript types
|
|
│ │ ├── views/ # Page components
|
|
│ │ ├── App.vue # Root component
|
|
│ │ └── main.ts # Application entry
|
|
│ └── package.json
|
|
└── README.md
|
|
```
|
|
|
|
## Features
|
|
|
|
- [x] User authentication with JWT
|
|
- [x] Role-based access (superadmin / manager / user)
|
|
- [x] Space management (CRUD)
|
|
- [x] Property management (groupuri de spații, public/privat)
|
|
- [x] Property managers (many-to-many)
|
|
- [x] Booking calendar view (FullCalendar)
|
|
- [x] Booking request system
|
|
- [x] Admin approval workflow
|
|
- [x] Anonymous booking support (guest name/email)
|
|
- [x] Public booking API (fără autentificare)
|
|
- [x] Organizations & members
|
|
- [x] Notifications
|
|
- [x] Audit log
|
|
- [x] Reports
|
|
- [x] Booking templates
|
|
- [x] Google Calendar integration
|
|
- [x] Attachments
|
|
- [x] User profile & settings
|
|
- [x] Email verification
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication
|
|
|
|
- `POST /api/auth/login` - Login with email and password
|
|
- `POST /api/auth/register` - Register new user
|
|
|
|
### Resources
|
|
|
|
- `/api/spaces` - Space management
|
|
- `/api/properties` - Property management
|
|
- `/api/bookings` - Booking management
|
|
- `/api/organizations` - Organization management
|
|
- `/api/users` - User management
|
|
- `/api/notifications` - Notifications
|
|
- `/api/audit-log` - Audit log
|
|
- `/api/reports` - Reports
|
|
- `/api/public/*` - Public API (no auth required)
|
|
|
|
### Health
|
|
|
|
- `GET /` - API info
|
|
- `GET /health` - Health check
|
|
|
|
## License
|
|
|
|
MIT
|