259 lines
7.3 KiB
Markdown
259 lines
7.3 KiB
Markdown
# Real-time Notification System
|
|
|
|
## Overview
|
|
|
|
The notification system provides real-time and email notifications for task management events using Socket.io and Nodemailer.
|
|
|
|
## Features
|
|
|
|
### Real-time Notifications (Socket.io)
|
|
- Instant push notifications to connected clients
|
|
- User-specific notification channels
|
|
- Support for multiple device connections per user
|
|
- Notification acknowledgment and read status tracking
|
|
|
|
### Email Notifications (Nodemailer)
|
|
- Configurable email delivery (instant, hourly, daily, weekly digests)
|
|
- HTML email templates with priority indicators
|
|
- Email queuing with retry mechanism using Bull queue
|
|
- SMTP configuration support
|
|
|
|
### Notification Types
|
|
- `TASK_ASSIGNED` - When a task is assigned to a user
|
|
- `TASK_UPDATED` - When task details are modified
|
|
- `TASK_COMPLETED` - When a task is marked as done
|
|
- `TASK_OVERDUE` - When a task passes its due date
|
|
- `COMMENT_ADDED` - When someone comments on a task
|
|
- `MENTION` - When a user is mentioned
|
|
- `STATUS_CHANGED` - When task status changes
|
|
- `DEADLINE_APPROACHING` - Reminder for upcoming deadlines
|
|
- `WORKFLOW_TRIGGERED` - When workflow events occur
|
|
- `COLLABORATION_INVITE` - When invited to collaborate
|
|
|
|
### Priority Levels
|
|
- `URGENT` - Red indicator, immediate attention required
|
|
- `HIGH` - Yellow indicator, high priority
|
|
- `MEDIUM` - Blue indicator, normal priority
|
|
- `LOW` - Gray indicator, low priority
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
```env
|
|
# Socket.io Configuration
|
|
PORT=3000
|
|
CORS_ORIGIN=http://localhost:3000
|
|
|
|
# Email Configuration (Optional)
|
|
SMTP_HOST=smtp.gmail.com
|
|
SMTP_PORT=587
|
|
SMTP_SECURE=false
|
|
SMTP_USER=your-email@gmail.com
|
|
SMTP_PASS=your-app-password
|
|
SMTP_FROM=noreply@taskmanagement.com
|
|
|
|
# Redis Configuration (for email queue)
|
|
REDIS_HOST=localhost
|
|
REDIS_PORT=6379
|
|
|
|
# JWT Configuration
|
|
JWT_SECRET=your-secret-key
|
|
|
|
# Directus Configuration
|
|
DIRECTUS_URL=http://localhost:8055
|
|
DIRECTUS_EMAIL=admin@example.com
|
|
DIRECTUS_PASSWORD=admin-password
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### REST API
|
|
|
|
#### Get Notifications
|
|
```
|
|
GET /api/notifications
|
|
Query params: page, limit, unreadOnly
|
|
```
|
|
|
|
#### Mark as Read
|
|
```
|
|
PUT /api/notifications/:notificationId/read
|
|
```
|
|
|
|
#### Mark All as Read
|
|
```
|
|
PUT /api/notifications/read-all
|
|
```
|
|
|
|
#### Get Preferences
|
|
```
|
|
GET /api/notifications/preferences
|
|
```
|
|
|
|
#### Update Preferences
|
|
```
|
|
PUT /api/notifications/preferences
|
|
Body: { email: {...}, realtime: {...}, doNotDisturb: {...} }
|
|
```
|
|
|
|
#### Subscribe to Types
|
|
```
|
|
POST /api/notifications/subscribe
|
|
Body: { types: ['task_assigned', 'mention'] }
|
|
```
|
|
|
|
#### Unsubscribe from Types
|
|
```
|
|
POST /api/notifications/unsubscribe
|
|
Body: { types: ['task_overdue'] }
|
|
```
|
|
|
|
### Socket.io Events
|
|
|
|
#### Client → Server Events
|
|
- `notification:markRead` - Mark single notification as read
|
|
- `notification:markAllRead` - Mark all notifications as read
|
|
- `notification:updatePreferences` - Update user preferences
|
|
- `notification:subscribe` - Subscribe to notification types
|
|
- `notification:unsubscribe` - Unsubscribe from notification types
|
|
|
|
#### Server → Client Events
|
|
- `notification:new` - New notification received
|
|
- `notification:read` - Notification marked as read
|
|
- `notifications:allRead` - All notifications marked as read
|
|
- `notifications:pending` - Batch of pending notifications
|
|
- `preferences:updated` - Preferences updated successfully
|
|
|
|
## Testing
|
|
|
|
### 1. Start the Server
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
### 2. Open Test Client
|
|
Open `src/notifications/test-client.html` in a browser
|
|
|
|
### 3. Generate JWT Token
|
|
```javascript
|
|
// Generate test JWT token
|
|
const jwt = require('jsonwebtoken');
|
|
const token = jwt.sign(
|
|
{ userId: 'test-user-id' },
|
|
'your-secret-key',
|
|
{ expiresIn: '1h' }
|
|
);
|
|
console.log(token);
|
|
```
|
|
|
|
### 4. Connect and Test
|
|
1. Enter the JWT token in the test client
|
|
2. Click "Connect"
|
|
3. Send test notifications
|
|
4. Verify real-time delivery
|
|
|
|
### 5. Test with Node.js Client
|
|
```bash
|
|
node test-notification.js
|
|
```
|
|
|
|
## Integration with Task System
|
|
|
|
The notification system automatically sends notifications when:
|
|
|
|
1. **Task Assignment**: Users receive notifications when assigned to tasks
|
|
2. **Status Changes**: Notifications on task status transitions
|
|
3. **Due Date Alerts**: Automatic reminders for approaching deadlines
|
|
4. **Comments**: Notifications when comments are added to tasks
|
|
5. **Mentions**: Direct notifications when mentioned in tasks/comments
|
|
|
|
### Example Integration
|
|
|
|
```typescript
|
|
// In task assignment service
|
|
await notificationService.sendNotification(assigneeId, {
|
|
type: NotificationType.TASK_ASSIGNED,
|
|
priority: NotificationPriority.HIGH,
|
|
title: 'New Task Assigned',
|
|
message: `You have been assigned to: ${task.title}`,
|
|
actionUrl: `/tasks/${taskId}`,
|
|
actions: [{
|
|
label: 'View Task',
|
|
action: 'view_task',
|
|
url: `/tasks/${taskId}`
|
|
}]
|
|
});
|
|
```
|
|
|
|
## User Preferences
|
|
|
|
Users can configure:
|
|
|
|
### Email Preferences
|
|
- Enable/disable email notifications
|
|
- Set delivery frequency (instant, hourly, daily, weekly)
|
|
- Select notification types to receive via email
|
|
|
|
### Real-time Preferences
|
|
- Enable/disable real-time notifications
|
|
- Select notification types for real-time delivery
|
|
- Enable/disable sound alerts
|
|
- Enable/disable desktop notifications
|
|
|
|
### Do Not Disturb
|
|
- Enable DND mode
|
|
- Set DND schedule (start/end times)
|
|
- Configure timezone for DND
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
|
|
│ Client │────▶│ Socket.io │────▶│ Notification│
|
|
│ (Browser) │ │ Server │ │ Service │
|
|
└─────────────┘ └──────────────┘ └─────────────┘
|
|
│ │
|
|
▼ ▼
|
|
┌──────────────┐ ┌─────────────┐
|
|
│ Express │ │ Email │
|
|
│ REST API │ │ Queue │
|
|
└──────────────┘ └─────────────┘
|
|
│ │
|
|
▼ ▼
|
|
┌──────────────┐ ┌─────────────┐
|
|
│ Directus │ │ SMTP │
|
|
│ Database │ │ Server │
|
|
└──────────────┘ └─────────────┘
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Socket.io Connection Issues
|
|
- Verify JWT token is valid
|
|
- Check CORS configuration
|
|
- Ensure server is running on correct port
|
|
- Check firewall/proxy settings
|
|
|
|
### Email Delivery Issues
|
|
- Verify SMTP credentials
|
|
- Check spam folder
|
|
- Ensure Redis is running for queue
|
|
- Review email queue logs
|
|
|
|
### Notification Not Received
|
|
- Check user preferences
|
|
- Verify user is not in DND mode
|
|
- Check notification type subscriptions
|
|
- Review server logs for errors
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] Push notifications (FCM/APNs)
|
|
- [ ] SMS notifications (Twilio)
|
|
- [ ] Slack/Teams integration
|
|
- [ ] Custom notification templates
|
|
- [ ] Notification scheduling
|
|
- [ ] Advanced filtering and search
|
|
- [ ] Notification analytics
|
|
- [ ] Bulk notification management |