All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
270 lines
7.4 KiB
Markdown
270 lines
7.4 KiB
Markdown
# Contact Messages Management System - Complete Guide
|
|
|
|
## Overview
|
|
A complete Contact Messages management system for the Brand Master e-commerce platform that allows customers to submit contact forms and admins to manage messages from a dedicated dashboard.
|
|
|
|
## Features
|
|
|
|
### Public Contact Form
|
|
- Full name, email, phone (optional), subject, and message fields
|
|
- Frontend validation with error messages
|
|
- Required field indicators (red asterisks)
|
|
- Success confirmation after submission
|
|
- Enhanced user experience with placeholders and helpful hints
|
|
|
|
### Admin Dashboard
|
|
- Dedicated "Contact Messages" tab in Admin panel
|
|
- Unread message counter badge
|
|
- Message listing table with:
|
|
- Visual unread indicator (yellow highlight)
|
|
- Status badges (New/Read/Replied)
|
|
- Sortable by date
|
|
- Filter by status
|
|
- Message details modal with:
|
|
- Full message content display
|
|
- Status update dropdown
|
|
- Admin notes textarea
|
|
- Delete functionality
|
|
|
|
### Backend Features
|
|
- Full REST API for message management
|
|
- Admin-only endpoints with JWT authentication
|
|
- PostgreSQL database persistence
|
|
- Enhanced data model with:
|
|
- Phone number support
|
|
- Read/unread tracking
|
|
- Status management (new/read/replied)
|
|
- Admin notes capability
|
|
|
|
## Database Schema
|
|
|
|
```sql
|
|
Table: contact_message
|
|
- id: INTEGER (Primary Key)
|
|
- full_name: VARCHAR (Customer name)
|
|
- email: VARCHAR (Customer email)
|
|
- phone: VARCHAR (Optional phone number)
|
|
- subject: VARCHAR (Message subject)
|
|
- message: TEXT (Message content)
|
|
- created_at: TIMESTAMP (Submission time)
|
|
- is_read: BOOLEAN (Read status, default: false)
|
|
- status: VARCHAR (new/read/replied, default: 'new')
|
|
- admin_notes: TEXT (Internal admin notes, nullable)
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Public Endpoint
|
|
```
|
|
POST /api/contact
|
|
Body: {
|
|
"full_name": "John Doe",
|
|
"email": "john@example.com",
|
|
"phone": "+972 XX-XXX-XXXX", // Optional
|
|
"subject": "Product Inquiry",
|
|
"message": "I have a question..."
|
|
}
|
|
```
|
|
|
|
### Admin Endpoints (Requires Authentication)
|
|
```
|
|
GET /api/admin/contact-messages
|
|
Query Parameters:
|
|
- status: (optional) Filter by status (new/read/replied)
|
|
- is_read: (optional) Filter by read status (true/false)
|
|
- skip: (optional) Pagination offset (default: 0)
|
|
- limit: (optional) Page size (default: 100)
|
|
|
|
GET /api/admin/contact-messages/unread-count
|
|
Returns: { "unread_count": 5 }
|
|
|
|
GET /api/admin/contact-messages/{message_id}
|
|
Returns: Full message details
|
|
|
|
PUT /api/admin/contact-messages/{message_id}
|
|
Body: {
|
|
"is_read": true,
|
|
"status": "replied",
|
|
"admin_notes": "Called customer and resolved issue"
|
|
}
|
|
|
|
DELETE /api/admin/contact-messages/{message_id}
|
|
Returns: { "message": "Contact message deleted successfully" }
|
|
```
|
|
|
|
## Modified Files
|
|
|
|
### Backend
|
|
1. **backend/app/models/contact_message.py** - Enhanced database model
|
|
2. **backend/app/schemas/contact.py** - Updated Pydantic schemas
|
|
3. **backend/app/routers/contact.py** - Added admin endpoints
|
|
4. **backend/app/main.py** - Registered admin router
|
|
5. **backend/migrations/007_enhance_contact_messages.sql** - Database migration
|
|
|
|
### Frontend
|
|
1. **frontend/src/pages/Contact.jsx** - Enhanced form with validation
|
|
2. **frontend/src/pages/Admin.jsx** - Added Contact Messages management tab
|
|
|
|
## Deployment Steps
|
|
|
|
### Step 1: Apply Database Migration
|
|
```bash
|
|
# On Windows
|
|
cd c:\Users\dvirl\OneDrive\Desktop\gitea\brand-master
|
|
apply-migration.bat 007_enhance_contact_messages.sql
|
|
|
|
# Or on Linux/Mac
|
|
./apply-migration.sh 007_enhance_contact_messages.sql
|
|
```
|
|
|
|
### Step 2: Build and Push Docker Images
|
|
```bash
|
|
# Build backend
|
|
cd backend
|
|
docker build -t harbor.dvirlabs.com/my-apps/brand-master-backend:latest .
|
|
|
|
# Build frontend
|
|
cd ../frontend
|
|
docker build -t harbor.dvirlabs.com/my-apps/brand-master-frontend:latest .
|
|
|
|
# Push to Harbor
|
|
docker push harbor.dvirlabs.com/my-apps/brand-master-backend:latest
|
|
docker push harbor.dvirlabs.com/my-apps/brand-master-frontend:latest
|
|
```
|
|
|
|
### Step 3: Deploy to Kubernetes
|
|
```bash
|
|
cd brand-master-chart
|
|
|
|
# Upgrade Helm deployment
|
|
helm upgrade brand-master . \
|
|
--namespace my-apps \
|
|
--set backend.image.tag=latest \
|
|
--set frontend.image.tag=latest \
|
|
--wait
|
|
```
|
|
|
|
### Step 4: Verify Deployment
|
|
```bash
|
|
# Check pods are running
|
|
kubectl get pods -n my-apps | grep brand-master
|
|
|
|
# Check backend logs
|
|
kubectl logs -n my-apps deployment/brand-master-backend --tail=50
|
|
|
|
# Check frontend logs
|
|
kubectl logs -n my-apps deployment/brand-master-frontend --tail=50
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Test Public Contact Form
|
|
1. Navigate to https://brand-master.dvirlabs.com/contact
|
|
2. Fill in the form:
|
|
- Full Name: Test User
|
|
- Email: test@example.com
|
|
- Phone: +972 50-123-4567 (optional)
|
|
- Subject: Test Message
|
|
- Message: This is a test message
|
|
3. Submit and verify success message
|
|
|
|
### Test Admin Dashboard
|
|
1. Login as admin at https://brand-master.dvirlabs.com/login
|
|
2. Navigate to Admin Dashboard
|
|
3. Click "Contact Messages" tab
|
|
4. Verify:
|
|
- ✅ Test message appears in list
|
|
- ✅ Unread counter shows correct count
|
|
- ✅ Message has yellow highlight (unread)
|
|
- ✅ Status shows "NEW"
|
|
5. Click on message row to open details modal
|
|
6. Test actions:
|
|
- Change status to "Read"
|
|
- Add admin notes
|
|
- Save changes
|
|
- Verify message updated
|
|
- Test delete functionality
|
|
|
|
### Test Filters
|
|
1. Create messages with different statuses
|
|
2. Test status filter dropdown:
|
|
- All Messages
|
|
- New
|
|
- Read
|
|
- Replied
|
|
3. Verify filtering works correctly
|
|
|
|
## Security Features
|
|
- Admin endpoints protected by JWT authentication
|
|
- Only users with `is_admin=true` can access admin endpoints
|
|
- Email validation on both frontend and backend
|
|
- SQL injection protection via SQLAlchemy ORM
|
|
- XSS protection via React's built-in escaping
|
|
|
|
## Future Enhancements
|
|
- Email notifications for new messages
|
|
- Reply functionality from admin panel
|
|
- Attachment support
|
|
- Search functionality for messages
|
|
- Export messages to CSV
|
|
- Message templates for common responses
|
|
- Bulk actions (mark multiple as read, delete multiple)
|
|
|
|
## Troubleshooting
|
|
|
|
### Backend Issues
|
|
```bash
|
|
# Check backend logs
|
|
kubectl logs -n my-apps deployment/brand-master-backend --tail=100
|
|
|
|
# Common issues:
|
|
# 1. Migration not applied - Run migration script
|
|
# 2. Auth errors - Check JWT token and admin role
|
|
# 3. Database connection - Verify PostgreSQL is running
|
|
```
|
|
|
|
### Frontend Issues
|
|
```bash
|
|
# Check frontend logs
|
|
kubectl logs -n my-apps deployment/brand-master-frontend --tail=100
|
|
|
|
# Common issues:
|
|
# 1. API calls failing - Check VITE_API_URL environment variable
|
|
# 2. Auth errors - Clear browser storage and re-login
|
|
# 3. Component errors - Check browser console
|
|
```
|
|
|
|
### Database Issues
|
|
```bash
|
|
# Connect to PostgreSQL pod
|
|
kubectl exec -it -n my-apps deployment/brand-master-postgres -- psql -U brand_master -d brand_master_db
|
|
|
|
# Check if migration applied
|
|
\d contact_message
|
|
|
|
# View messages
|
|
SELECT id, full_name, email, subject, status, is_read, created_at FROM contact_message;
|
|
|
|
# Count unread messages
|
|
SELECT COUNT(*) FROM contact_message WHERE is_read = false;
|
|
```
|
|
|
|
## Performance Considerations
|
|
- Messages are fetched only when admin clicks the "Contact Messages" tab
|
|
- Unread count is fetched once on admin dashboard load
|
|
- Table supports pagination (limit parameter)
|
|
- Indexes on status, is_read, and created_at for fast filtering
|
|
- Modal opens client-side without additional API calls
|
|
|
|
## Maintenance
|
|
- Periodically review and archive old messages
|
|
- Monitor unread message count
|
|
- Review admin notes for customer service insights
|
|
- Consider data retention policies for GDPR compliance
|
|
|
|
---
|
|
|
|
**Status:** Ready for deployment
|
|
**Last Updated:** 2026-05-08
|
|
**Version:** 1.0.0
|