39948-vm/README.md
2026-03-31 08:56:49 +04:00

282 lines
8.0 KiB
Markdown

# Tour Builder Platform
A web application for building and managing interactive virtual tours with drag-and-drop editing, video transitions, and PWA offline support.
## Features
- **Visual Tour Builder** - Drag-and-drop editor for creating interactive tour pages
- **Video Transitions** - Smooth video-based transitions between pages with forward/reverse playback
- **Multiple Element Types** - Navigation buttons, hotspots, galleries, tooltips, video/audio players
- **Three-Tier Publishing** - Dev → Stage → Production workflow with environment isolation
- **Asset Preloading** - Direct S3 download via presigned URLs for instant page navigation
- **PWA Offline Mode** - Tours work offline with Cache API and IndexedDB storage
- **Role-Based Access Control** - Granular permissions system
- **Team Collaboration** - Project memberships with role-based access
- **Asset Management** - Upload, optimize, and manage media assets with variants
- **Multi-Language Support** - i18n ready
## Tech Stack
| Layer | Technology |
|-------|------------|
| Frontend | Next.js 15, React 19, TypeScript, Redux Toolkit, Tailwind CSS |
| Backend | Node.js, Express, Sequelize ORM |
| Database | PostgreSQL |
| Authentication | JWT, Google OAuth, Microsoft OAuth |
| File Storage | AWS S3 / Google Cloud Storage (direct presigned URL access) |
| PWA | Serwist Service Worker, Cache API, IndexedDB (Dexie) |
## Quick Start
### Prerequisites
- Node.js 18+
- PostgreSQL 14+
- Yarn (backend) / npm (frontend)
### Database Setup (First Time)
```bash
# Create database user and database
PGPASSWORD='postgres' psql -U postgres -c "CREATE USER app_39215 WITH PASSWORD 'your-password';"
PGPASSWORD='postgres' psql -U postgres -c "CREATE DATABASE app_39215 OWNER app_39215;"
```
### Start Backend (Terminal 1)
```bash
cd backend
yarn install
export $(cat .env | xargs) && NODE_ENV=production yarn start
```
Backend runs on **http://localhost:8080**
### Start Frontend (Terminal 2)
```bash
cd frontend
npm install
npm run dev
```
Frontend runs on **http://localhost:3000**
### Default Login
After seeding, login with credentials configured in `backend/.env`:
- Email: `ADMIN_EMAIL` (default: admin@flatlogic.com)
- Password: `ADMIN_PASS` (default: 88dbeaf8)
## Project Structure
```
├── backend/ # Node.js/Express API server
│ ├── src/
│ │ ├── routes/ # REST API endpoints
│ │ ├── services/ # Business logic
│ │ ├── db/
│ │ │ ├── models/ # Sequelize models
│ │ │ ├── api/ # Database access layer
│ │ │ ├── migrations/ # Schema migrations
│ │ │ └── seeders/ # Seed data
│ │ ├── auth/ # Passport.js authentication
│ │ └── middlewares/ # Express middlewares
│ └── README.md # Backend documentation
├── frontend/ # Next.js React application
│ ├── src/
│ │ ├── pages/ # Next.js pages
│ │ ├── components/ # React components
│ │ ├── stores/ # Redux Toolkit slices
│ │ ├── hooks/ # Custom React hooks
│ │ ├── types/ # TypeScript definitions
│ │ └── lib/ # Utility libraries
│ └── README.md # Frontend documentation
└── docker/ # Docker Compose setup
├── docker-compose.yml
├── start-backend.sh
├── wait-for-it.sh
└── README.md # Docker documentation
```
## Key Workflows
### Tour Creation
1. Create a new project in the dashboard
2. Open the **Constructor** (`/constructor?projectId=...`)
3. Add pages with background images/videos
4. Place interactive elements (buttons, hotspots, etc.)
5. Configure navigation targets and transitions on elements
6. Preview in **Runtime** mode
7. Publish: Dev → Stage → Production
### Publishing Flow
Three-tier environment model with separate content per environment:
```
Dev Environment Stage Environment Production Environment
│ │ │
/constructor?projectId= /p/[projectSlug]/stage /p/[projectSlug]
(editing mode) (preview) (public access)
│ │ │
└── Save to Stage ──────►└── Publish ─────────────►│
```
| Action | Endpoint | Description |
|--------|----------|-------------|
| Save to Stage | `POST /api/publish/save-to-stage` | Copy dev pages to stage |
| Publish | `POST /api/publish` | Copy stage pages to production |
Pages have an `environment` field (`dev`, `stage`, `production`) that determines visibility.
### Element Types
| Type | Description |
|------|-------------|
| `navigation_next` | Forward navigation button |
| `navigation_prev` | Back navigation button |
| `spot` | Clickable hotspot area |
| `description` | Text description overlay |
| `tooltip` | Hover tooltip |
| `gallery` | Image gallery |
| `carousel` | Image carousel |
| `logo` | Logo element |
| `video_player` | Embedded video player |
| `audio_player` | Audio player |
| `popup` | Modal popup |
**Element Defaults:** Each element type has configurable default settings that follow a three-tier hierarchy:
- **Global** (`element_type_defaults`) - Platform-wide defaults (auto-seeded)
- **Project** (`project_element_defaults`) - Per-project overrides (auto-snapshotted on project creation)
- **Instance** (`tour_pages.ui_schema_json`) - Page-specific element values
## API Overview
Base URL: `http://localhost:8080/api`
| Endpoint | Description |
|----------|-------------|
| `POST /auth/signin/local` | Login |
| `POST /auth/signup` | Register |
| `GET /auth/me` | Current user |
| `GET /projects` | List projects |
| `POST /publish/save-to-stage` | Copy dev → stage |
| `POST /publish` | Copy stage → production |
| `GET /tour_pages` | List tour pages |
| `GET /assets` | List assets |
| `POST /file/presign` | Get S3 presigned URLs for asset download (public) |
Full API documentation: `http://localhost:8080/api-docs` (Swagger)
## Docker Setup
```bash
cd docker
chmod +x start-backend.sh wait-for-it.sh
# Start with fresh database
rm -rf data && docker-compose up
# Or keep existing data
docker-compose up
```
Access at `http://localhost:3000`
## Environment Variables
### Backend (`backend/.env`)
```env
# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME=app_39215
DB_USER=app_39215
DB_PASSWORD=your-password
# JWT
SECRET_KEY=your-secret-key
# Admin (for seeding)
ADMIN_EMAIL=admin@example.com
ADMIN_PASS=admin-password
# AWS S3 (optional)
AWS_S3_BUCKET=your-bucket
AWS_S3_REGION=us-east-1
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
# OAuth (optional)
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
MS_CLIENT_ID=...
MS_CLIENT_SECRET=...
# Email - AWS SES (optional)
EMAIL_USER=...
EMAIL_PASS=...
```
### Frontend (`frontend/.env.local`)
```env
NEXT_PUBLIC_BACK_API=http://localhost:8080/api
```
## Common Commands
### Backend
```bash
cd backend
yarn start # Start server (migrate + seed + watch)
yarn db:migrate # Run migrations
yarn db:seed # Seed data
yarn db:reset # Drop + create + migrate + seed
yarn lint # ESLint
```
### Frontend
```bash
cd frontend
npm run dev # Development server
npm run build # Production build
npm run lint # ESLint
npm run format # Prettier
```
## Troubleshooting
### Connection Refused
1. Ensure PostgreSQL is running
2. Check that port 5432 (db), 8080 (backend), 3000 (frontend) are available
3. Verify database credentials in `.env`
### Database Issues
```bash
# Reset database completely
cd backend
yarn db:reset
```
### Permission Denied
Ensure the database user has proper privileges:
```sql
GRANT ALL PRIVILEGES ON DATABASE app_39215 TO app_39215;
```
## License
Proprietary - Tour Builder Platform