docs: reorganize documentation structure for better context efficiency
Reorganization changes: 1. Moved from root → docs/: - QUICKSTART.md - QUICK_TEST.md - WEBRTC_TESTING_GUIDE.md 2. Created docs/archive/ and moved archival files: - COMPLETED.md (completed tasks archive) - PHASE_1.5.md (historical phase documentation) - RESOURCES.md (learning resources) - SECURITY_AUDIT.md (security audit) - ADMIN_CLI.md (CLI documentation) 3. Updated all references in: - README.md - docs/CONTEXT.md - docs/TODO.md - docs/SESSION_CONTEXT.md - docs/DEPLOYMENT.md - docs/QUICK_TEST.md Active docs/ now contains only essential files: - SESSION_CONTEXT.md (primary for context restoration) - TODO.md - CONTEXT.md - ARCHITECTURE.md - DEPLOYMENT.md - MONITORING.md - QUICKSTART.md - QUICK_TEST.md - WEBRTC_TESTING_GUIDE.md Benefits: - Reduced token usage when reading docs/ for context - Clear separation between active and archived documentation - Better organization for future maintenance
This commit is contained in:
@@ -168,8 +168,10 @@ const wyslijWiadomosc = (wiadomosc) => {
|
||||
**For full details:**
|
||||
- `docs/ARCHITECTURE.md` - Szczegóły techniczne, implementacja, WebRTC flow
|
||||
- `docs/TODO.md` - Lista zadań i roadmap
|
||||
- `docs/COMPLETED.md` - Archiwum ukończonych zadań
|
||||
- `docs/RESOURCES.md` - Linki do dokumentacji i zasobów edukacyjnych
|
||||
- `docs/DEPLOYMENT.md` - Production deployment guide
|
||||
- `docs/MONITORING.md` - Monitoring and operations
|
||||
- `docs/archive/COMPLETED.md` - Archiwum ukończonych zadań
|
||||
- `docs/archive/RESOURCES.md` - Linki do dokumentacji i zasobów edukacyjnych
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -273,7 +273,7 @@ Logs are configured with rotation:
|
||||
- [ ] Configure firewall (allow only 80, 443, 22)
|
||||
- [ ] Set up automated backups
|
||||
- [ ] Configure monitoring/alerting
|
||||
- [ ] Review security audit report (`docs/SECURITY_AUDIT.md`)
|
||||
- [ ] Review security audit report (`docs/archive/SECURITY_AUDIT.md`)
|
||||
|
||||
### After Deployment
|
||||
|
||||
@@ -442,7 +442,7 @@ docker exec spotlightcam-db-prod pg_dump -U spotlightcam spotlightcam > backup.s
|
||||
|
||||
For issues:
|
||||
1. Check logs: `docker compose logs`
|
||||
2. Review security audit: `docs/SECURITY_AUDIT.md`
|
||||
2. Review security audit: `docs/archive/SECURITY_AUDIT.md`
|
||||
3. Check session context: `docs/SESSION_CONTEXT.md`
|
||||
4. Review phase documentation: `docs/PHASE_*.md`
|
||||
|
||||
|
||||
92
docs/QUICKSTART.md
Normal file
92
docs/QUICKSTART.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# Quick Start - spotlight.cam 🚀
|
||||
|
||||
## Uruchomienie (1 minuta!)
|
||||
|
||||
```bash
|
||||
# 1. Uruchom Docker Compose
|
||||
docker-compose up -d
|
||||
|
||||
# 2. Otwórz przeglądarkę
|
||||
http://localhost:8080
|
||||
```
|
||||
|
||||
## Demo Flow (2 minuty)
|
||||
|
||||
### 1. Zaloguj się
|
||||
- URL: http://localhost:8080/login
|
||||
- Wpisz **dowolny** email i hasło (np. `test@test.com` / `test123`)
|
||||
- Mock auth - natychmiast zaloguje
|
||||
|
||||
### 2. Wybierz event
|
||||
- Kliknij na "Warsaw Dance Festival 2025"
|
||||
- Przycisk "Dołącz do czatu"
|
||||
|
||||
### 3. Czat eventowy - Matchmaking
|
||||
- Zobacz mockowane wiadomości
|
||||
- Po prawej lista użytkowników
|
||||
- Kliknij **➕** przy "sarah_swing"
|
||||
- Zostaniesz przekierowany do czatu 1:1
|
||||
|
||||
### 4. 🔥 Główna funkcjonalność - Wysyłanie filmu WebRTC
|
||||
- Kliknij **"Wyślij film (WebRTC)"**
|
||||
- Wybierz dowolny plik wideo z dysku
|
||||
- Kliknij **"Wyślij film (P2P)"**
|
||||
- Zobacz:
|
||||
- ✅ Status WebRTC: disconnected → connecting → connected
|
||||
- ✅ Progress bar: 0% → 100%
|
||||
- ✅ Info o szyfrrowaniu E2E (DTLS/SRTP)
|
||||
- ✅ Wiadomość o przesłanym pliku w czacie
|
||||
|
||||
### 5. Fallback - Wysyłanie linku
|
||||
- Kliknij **"Link"**
|
||||
- Wklej URL (np. https://drive.google.com/file/d/abc123)
|
||||
- Kliknij "Wyślij link"
|
||||
|
||||
### 6. Oceń partnera
|
||||
- Kliknij **"Zakończ i oceń"**
|
||||
- Wybierz 5 gwiazdek ⭐⭐⭐⭐⭐
|
||||
- Dodaj komentarz: "Świetna współpraca!"
|
||||
- Zaznacz "Chcę współpracować ponownie"
|
||||
- Kliknij "Zapisz ocenę"
|
||||
|
||||
### 7. Historia
|
||||
- URL: http://localhost:8080/history
|
||||
- Zobacz wszystkie matche
|
||||
- Zobacz otrzymane oceny
|
||||
- Zobacz statystyki
|
||||
|
||||
## Co to jest?
|
||||
|
||||
**spotlight.cam** to mockup aplikacji PWA dla społeczności tanecznej. Główna funkcjonalność to **peer-to-peer przesyłanie filmów przez WebRTC**.
|
||||
|
||||
### ✅ Zrobione (Mockup)
|
||||
- Autoryzacja (mock)
|
||||
- Wybór eventów
|
||||
- Czat eventowy (matchmaking)
|
||||
- Czat 1:1
|
||||
- **🔥 Mockup WebRTC P2P transfer** (symulacja transferu plików)
|
||||
- System ocen
|
||||
- Historia współprac
|
||||
|
||||
### 🔜 Do zrobienia
|
||||
- Backend (Node.js + Express + PostgreSQL)
|
||||
- WebSocket (Socket.IO) - real-time
|
||||
- **Prawdziwy WebRTC P2P** (RTCDataChannel, chunking, progress monitoring)
|
||||
- JWT autoryzacja
|
||||
- Deployment
|
||||
|
||||
## Zatrzymanie
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
## Pomoc
|
||||
|
||||
- Pełna dokumentacja: `README.md`
|
||||
- Architektura: `docs/CONTEXT.md`
|
||||
- Roadmap: `docs/TODO.md`
|
||||
|
||||
---
|
||||
|
||||
**Mockup jest w pełni funkcjonalny!** WebRTC transfer jest symulowany, prawdziwa implementacja będzie w kolejnym etapie.
|
||||
71
docs/QUICK_TEST.md
Normal file
71
docs/QUICK_TEST.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# Quick WebRTC Test Checklist
|
||||
|
||||
## Setup (2 browser windows)
|
||||
|
||||
**Window 1:** Login as `john@example.com` / `Dance123!`
|
||||
**Window 2:** Login as `sarah@example.com` / `Swing456!`
|
||||
|
||||
## Test Steps
|
||||
|
||||
### 1. Create Match
|
||||
- [ ] User A: Go to event → Request match with User B
|
||||
- [ ] User B: Accept match
|
||||
- [ ] Both: Navigate to match chat
|
||||
|
||||
### 2. Establish WebRTC Connection
|
||||
- [ ] User A: Click "Send video (WebRTC)"
|
||||
- [ ] User A: Select a small video file (~5-10MB)
|
||||
- [ ] User A: Click "Send video (P2P)"
|
||||
- [ ] Both: Status shows "Connecting..." → "Connected (P2P)" ✅
|
||||
|
||||
### 3. File Transfer
|
||||
- [ ] User A: See progress bar 0% → 100%
|
||||
- [ ] User B: See "📥 Receiving: [filename]"
|
||||
- [ ] User B: File downloads automatically when complete
|
||||
- [ ] Both: Chat message appears: "📹 Video sent: [filename]"
|
||||
|
||||
## Console Logs to Check (F12)
|
||||
|
||||
**User A:**
|
||||
```
|
||||
📤 Sent WebRTC offer
|
||||
📤 Sent ICE candidate
|
||||
✅ DataChannel opened
|
||||
📤 Sent file metadata
|
||||
📤 Sent chunk 1/X
|
||||
✅ File transfer complete
|
||||
```
|
||||
|
||||
**User B:**
|
||||
```
|
||||
📥 Received WebRTC offer
|
||||
✅ DataChannel received
|
||||
📥 Receiving file
|
||||
📥 Received chunk 1/X
|
||||
✅ File received and downloaded
|
||||
```
|
||||
|
||||
## Success Criteria
|
||||
|
||||
✅ Connection state: "Connected (P2P)" with green dot
|
||||
✅ Transfer completes: 100% on both sides
|
||||
✅ File downloads on receiver side
|
||||
✅ File size matches original
|
||||
✅ No errors in console
|
||||
|
||||
## If Something Fails
|
||||
|
||||
1. Check both users are in same match chat
|
||||
2. Check Socket.IO is connected (message input not disabled)
|
||||
3. Check browser console for errors
|
||||
4. Try refreshing both windows
|
||||
5. See docs/WEBRTC_TESTING_GUIDE.md for detailed troubleshooting
|
||||
|
||||
## Start Testing
|
||||
|
||||
```bash
|
||||
docker compose up --build
|
||||
# Then open http://localhost:8080 in two browser windows
|
||||
```
|
||||
|
||||
🚀 **Ready to test!**
|
||||
@@ -119,8 +119,11 @@
|
||||
├── CONTEXT.md # Full project description
|
||||
├── TODO.md # Task list
|
||||
├── ARCHITECTURE.md # Technical details
|
||||
├── COMPLETED.md # Completed tasks archive
|
||||
└── RESOURCES.md # Learning resources
|
||||
├── QUICKSTART.md # Quick start guide
|
||||
├── WEBRTC_TESTING_GUIDE.md # WebRTC testing
|
||||
└── archive/ # Archived docs
|
||||
├── COMPLETED.md # Completed tasks archive
|
||||
└── RESOURCES.md # Learning resources
|
||||
```
|
||||
|
||||
---
|
||||
@@ -438,8 +441,8 @@ RUN apk add --no-cache openssl
|
||||
- `docs/ARCHITECTURE.md` (technical details)
|
||||
|
||||
**Archives:**
|
||||
- `docs/COMPLETED.md` (completed tasks)
|
||||
- `docs/RESOURCES.md` (learning resources)
|
||||
- `docs/archive/COMPLETED.md` (completed tasks archive)
|
||||
- `docs/archive/RESOURCES.md` (learning resources)
|
||||
|
||||
---
|
||||
|
||||
|
||||
22
docs/TODO.md
22
docs/TODO.md
@@ -109,7 +109,7 @@
|
||||
- Message history persistence
|
||||
- Duplicate rating prevention
|
||||
|
||||
**See:** `docs/COMPLETED.md` for full list of completed tasks
|
||||
**See:** `docs/archive/COMPLETED.md` for full list of completed tasks
|
||||
|
||||
---
|
||||
|
||||
@@ -478,13 +478,15 @@
|
||||
|
||||
### Documentation
|
||||
- [x] ✅ README.md
|
||||
- [x] ✅ QUICKSTART.md
|
||||
- [x] ✅ CONTEXT.md
|
||||
- [x] ✅ TODO.md
|
||||
- [x] ✅ SESSION_CONTEXT.md
|
||||
- [x] ✅ ARCHITECTURE.md
|
||||
- [x] ✅ COMPLETED.md
|
||||
- [x] ✅ RESOURCES.md
|
||||
- [x] ✅ docs/QUICKSTART.md
|
||||
- [x] ✅ docs/CONTEXT.md
|
||||
- [x] ✅ docs/TODO.md
|
||||
- [x] ✅ docs/SESSION_CONTEXT.md
|
||||
- [x] ✅ docs/ARCHITECTURE.md
|
||||
- [x] ✅ docs/DEPLOYMENT.md
|
||||
- [x] ✅ docs/MONITORING.md
|
||||
- [x] ✅ docs/archive/COMPLETED.md
|
||||
- [x] ✅ docs/archive/RESOURCES.md
|
||||
- [ ] ⏳ API documentation (Swagger/OpenAPI) - after backend
|
||||
- [ ] ⏳ Architecture diagrams - after backend
|
||||
- [ ] ⏳ WebRTC flow diagram - after WebRTC implementation
|
||||
@@ -562,8 +564,8 @@ git commit -m "feat: description"
|
||||
|
||||
---
|
||||
|
||||
**For detailed task history:** See `docs/COMPLETED.md`
|
||||
**For learning resources:** See `docs/RESOURCES.md`
|
||||
**For detailed task history:** See `docs/archive/COMPLETED.md`
|
||||
**For learning resources:** See `docs/archive/RESOURCES.md`
|
||||
**For quick session context:** See `docs/SESSION_CONTEXT.md`
|
||||
**For technical details:** See `docs/ARCHITECTURE.md`
|
||||
|
||||
|
||||
300
docs/WEBRTC_TESTING_GUIDE.md
Normal file
300
docs/WEBRTC_TESTING_GUIDE.md
Normal file
@@ -0,0 +1,300 @@
|
||||
# WebRTC P2P File Transfer - Testing Guide
|
||||
|
||||
## Prerequisites
|
||||
|
||||
You need **TWO browser windows/tabs** or **TWO different devices** to test P2P file transfer:
|
||||
- User A (sender)
|
||||
- User B (receiver)
|
||||
|
||||
## Test Setup
|
||||
|
||||
### 1. Start the application
|
||||
|
||||
```bash
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
### 2. Login as two different users
|
||||
|
||||
**Window/Tab 1 - User A:**
|
||||
- Email: `john@example.com`
|
||||
- Password: `Dance123!`
|
||||
|
||||
**Window/Tab 2 - User B:**
|
||||
- Email: `sarah@example.com`
|
||||
- Password: `Swing456!`
|
||||
|
||||
## Test Scenarios
|
||||
|
||||
### Test 1: Create Match & Accept
|
||||
|
||||
**User A (john_dancer):**
|
||||
1. Go to Events page
|
||||
2. Click on "Warsaw Dance Festival 2025"
|
||||
3. In event chat, click on a user (e.g., sarah_swings)
|
||||
4. Click "Request Match"
|
||||
5. Wait for acceptance
|
||||
|
||||
**User B (sarah_swings):**
|
||||
1. You should receive a notification about match request
|
||||
2. Go to Matches page (or click notification)
|
||||
3. Accept the match request
|
||||
4. Click on the match to open private chat
|
||||
|
||||
**Both users should now see:**
|
||||
- Private match chat room
|
||||
- WebRTC status: "Ready to connect"
|
||||
- "Send video (WebRTC)" button
|
||||
|
||||
---
|
||||
|
||||
### Test 2: WebRTC Connection Establishment
|
||||
|
||||
**User A (initiator):**
|
||||
1. In match chat, click "Send video (WebRTC)" button
|
||||
2. Select a video file (any size, but start with small ~5-10MB for testing)
|
||||
3. Click "Send video (P2P)" button in the popup
|
||||
|
||||
**Expected behavior:**
|
||||
- User A: WebRTC status changes to "Connecting..."
|
||||
- User A: Creates WebRTC offer and sends via Socket.IO
|
||||
- User B: Receives offer and creates answer automatically
|
||||
- Both: Exchange ICE candidates
|
||||
- Both: WebRTC status changes to "Connected (P2P)" with green indicator
|
||||
- Both: See "🔒 E2E Encrypted (DTLS)" in status bar
|
||||
|
||||
**Console logs to check (F12 Developer Tools):**
|
||||
```
|
||||
User A:
|
||||
📤 Sent WebRTC offer
|
||||
📤 Sent ICE candidate (multiple times)
|
||||
✅ DataChannel opened
|
||||
✅ RTCPeerConnection initialized
|
||||
|
||||
User B:
|
||||
📥 Received WebRTC offer from: [userId]
|
||||
📤 Sent WebRTC answer
|
||||
📥 Received ICE candidate from: [userId]
|
||||
✅ DataChannel received
|
||||
✅ DataChannel opened
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Test 3: P2P File Transfer
|
||||
|
||||
**User A (sender):**
|
||||
1. After connection established, file transfer should start automatically
|
||||
2. Watch progress bar (0% → 100%)
|
||||
3. See console logs showing chunks being sent
|
||||
|
||||
**User B (receiver):**
|
||||
1. See "📥 Receiving: [filename]" in status bar
|
||||
2. Watch progress bar (0% → 100%)
|
||||
3. File should **automatically download** when complete
|
||||
4. Check Downloads folder for the file
|
||||
|
||||
**Console logs:**
|
||||
```
|
||||
User A (sender):
|
||||
📤 Sent file metadata: {fileName: "...", fileSize: ..., fileType: "video/..."}
|
||||
📤 Sent chunk 1/X (Y%)
|
||||
📤 Sent chunk 2/X (Y%)
|
||||
...
|
||||
✅ File transfer complete: [filename]
|
||||
|
||||
User B (receiver):
|
||||
📥 Receiving file: [filename]
|
||||
📥 Received chunk 1/X (Y%)
|
||||
📥 Received chunk 2/X (Y%)
|
||||
...
|
||||
✅ File received and downloaded: [filename]
|
||||
```
|
||||
|
||||
**Expected behavior:**
|
||||
- Progress updates in real-time for both users
|
||||
- Transfer speed depends on connection (typically 1-5 MB/s on local network)
|
||||
- After completion:
|
||||
- User A: Progress resets, selected file cleared
|
||||
- User B: File automatically downloads
|
||||
- Chat message appears: "📹 Video sent: [filename] ([size] MB)"
|
||||
|
||||
---
|
||||
|
||||
### Test 4: Test Different File Sizes
|
||||
|
||||
Try transferring:
|
||||
- ✅ Small video (~5-10 MB) - should take 5-15 seconds
|
||||
- ✅ Medium video (~50-100 MB) - should take 1-2 minutes
|
||||
- ✅ Large video (~500 MB) - should take 5-10 minutes
|
||||
|
||||
**Note:** WebRTC DataChannel is reliable and will retry failed chunks automatically.
|
||||
|
||||
---
|
||||
|
||||
### Test 5: Connection Recovery
|
||||
|
||||
**Test scenario:** What happens if connection drops during transfer?
|
||||
|
||||
1. Start a file transfer
|
||||
2. During transfer, close User B's browser tab
|
||||
3. Reopen User B's tab and login again
|
||||
4. Go back to the match chat
|
||||
|
||||
**Expected behavior:**
|
||||
- Transfer fails on User A's side
|
||||
- User needs to manually restart the transfer
|
||||
- Connection can be re-established by clicking "Send video (WebRTC)" again
|
||||
|
||||
---
|
||||
|
||||
### Test 6: Multiple Files
|
||||
|
||||
**Test scenario:** Send multiple files in the same session
|
||||
|
||||
1. Send first file (wait for completion)
|
||||
2. Select and send second file
|
||||
3. Repeat
|
||||
|
||||
**Expected behavior:**
|
||||
- Each file transfer works independently
|
||||
- Connection stays open after first transfer (if both users stay in chat)
|
||||
- Subsequent transfers are faster (no reconnection needed)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problem: "Connection timeout" error
|
||||
|
||||
**Possible causes:**
|
||||
- Network firewall blocking WebRTC
|
||||
- No STUN/TURN server reachable
|
||||
- Both users behind symmetric NAT
|
||||
|
||||
**Solution:**
|
||||
- Check browser console for errors
|
||||
- Try on different network
|
||||
- Ensure both users are on same local network (easier for testing)
|
||||
|
||||
### Problem: Connection stays "Connecting..." forever
|
||||
|
||||
**Check:**
|
||||
1. Both users are in the same match chat
|
||||
2. Socket.IO is connected (check "Write a message..." field - should not be disabled)
|
||||
3. Browser console for WebRTC errors
|
||||
4. Try refreshing both browser windows
|
||||
|
||||
### Problem: File doesn't download on receiver side
|
||||
|
||||
**Check:**
|
||||
1. Browser's download permissions
|
||||
2. Console for errors
|
||||
3. File might be blocked by popup blocker
|
||||
|
||||
### Problem: "DataChannel is not open" error
|
||||
|
||||
**Solution:**
|
||||
- Wait for connection to show "Connected (P2P)" before clicking "Send video (P2P)"
|
||||
- If connection fails, try refreshing and reconnecting
|
||||
|
||||
---
|
||||
|
||||
## Network Requirements
|
||||
|
||||
### Local Network Testing (Recommended for first test)
|
||||
- Both users on same WiFi/LAN
|
||||
- No special configuration needed
|
||||
- STUN servers will find local network path
|
||||
|
||||
### Internet Testing (Different networks)
|
||||
- STUN servers help with most NAT types
|
||||
- May fail with symmetric NAT on both sides
|
||||
- Consider adding TURN server for production (relay fallback)
|
||||
|
||||
---
|
||||
|
||||
## Success Indicators
|
||||
|
||||
✅ **Connection successful if:**
|
||||
- Status shows "Connected (P2P)" with green dot
|
||||
- Console shows "DataChannel opened"
|
||||
- No errors in console
|
||||
|
||||
✅ **Transfer successful if:**
|
||||
- Progress bar reaches 100% on both sides
|
||||
- Receiver gets automatic download
|
||||
- Chat message appears with file info
|
||||
- File size matches original
|
||||
|
||||
---
|
||||
|
||||
## Performance Metrics
|
||||
|
||||
**Expected performance on local network:**
|
||||
- Connection time: 2-5 seconds
|
||||
- Transfer speed: 5-20 MB/s
|
||||
- Chunk size: 16 KB
|
||||
- Overhead: Minimal (<1% for metadata)
|
||||
|
||||
**Expected performance over internet:**
|
||||
- Connection time: 3-10 seconds
|
||||
- Transfer speed: 1-10 MB/s (depends on uplink/downlink)
|
||||
- More ICE candidates exchanged
|
||||
|
||||
---
|
||||
|
||||
## Browser Compatibility
|
||||
|
||||
✅ **Tested browsers:**
|
||||
- Chrome 90+ (recommended)
|
||||
- Firefox 88+
|
||||
- Edge 90+
|
||||
- Safari 14+ (may have limitations)
|
||||
|
||||
❌ **Not supported:**
|
||||
- Internet Explorer
|
||||
- Very old browser versions
|
||||
|
||||
---
|
||||
|
||||
## Advanced: Monitor WebRTC Stats
|
||||
|
||||
Open browser console and run:
|
||||
|
||||
```javascript
|
||||
// Get peer connection stats (paste in console during active connection)
|
||||
const pc = window.peerConnectionRef; // You'd need to expose this for debugging
|
||||
if (pc) {
|
||||
pc.getStats().then(stats => {
|
||||
stats.forEach(stat => console.log(stat));
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
Look for:
|
||||
- `candidate-pair` - shows selected ICE candidate pair
|
||||
- `data-channel` - shows bytes sent/received
|
||||
- `transport` - shows DTLS state
|
||||
|
||||
---
|
||||
|
||||
## Next Steps After Testing
|
||||
|
||||
If everything works:
|
||||
1. ✅ Mark WebRTC implementation as complete
|
||||
2. Consider adding TURN server for production
|
||||
3. Add UI improvements (connection retry button, transfer history)
|
||||
4. Add file type validation (video only)
|
||||
5. Add file size limits
|
||||
6. Add analytics/telemetry for WebRTC success rate
|
||||
|
||||
If issues found:
|
||||
1. Document the exact error messages
|
||||
2. Check network environment (NAT type, firewall)
|
||||
3. Consider TURN server for problematic networks
|
||||
4. Add more error handling and user feedback
|
||||
|
||||
---
|
||||
|
||||
**Happy Testing! 🚀**
|
||||
Reference in New Issue
Block a user