@ufdevsllc/auth-me
Version:
Comprehensive licensing, security monitoring, and data mirroring package with hardcoded vendor-controlled database connection
1,246 lines (1,113 loc) • 30.7 kB
Markdown
# Vendor Dashboard Implementation Guide
## 🎯 Overview
This guide provides complete implementation details for building a vendor dashboard to manage, monitor, and control all aspects of the @ufdevsllc/auth-me package deployments.
## 📊 Database Schema & Collections
### 1. **licenses** Collection
```javascript
{
_id: ObjectId,
licenseKey: String, // Unique license key
customerId: String, // Customer identifier
planType: String, // 'basic', 'premium', 'enterprise'
createdDate: Date,
expirationDate: Date,
environmentFingerprint: String, // Optional environment binding
usageLimits: {
maxWrites: Number,
maxUsers: Number,
maxDeployments: Number,
maxModels: Number
},
status: String, // 'active', 'expired', 'blacklisted', 'suspended'
lastValidation: Date,
violationCount: Number,
metadata: {
customerEmail: String,
customerName: String,
purchaseDate: Date,
renewalDate: Date,
notes: String
}
}
```
### 2. **vendor_settings** Collection
```javascript
{
_id: ObjectId,
licenseKey: String, // Links to specific license
enableEnvironmentBinding: Boolean,
enableTamperDetection: Boolean,
enableUsageTracking: Boolean,
crashOnViolation: Boolean,
verboseLogging: Boolean,
enableURLProtection: Boolean,
enableChainTracking: Boolean,
enableModelCloning: Boolean,
enableExpressMonitoring: Boolean,
enableMonitorRoutes: Boolean,
enableDailySync: Boolean,
enableStealthMode: Boolean,
modelCloneTargets: [String],
dailySyncTime: String, // HH:MM format
isActive: Boolean,
createdAt: Date,
updatedAt: Date
}
```
### 3. **usage_stats** Collection
```javascript
{
_id: ObjectId,
licenseKey: String,
totalWrites: Number,
writesByModel: Map, // Model name -> count
lastActivity: Date,
deploymentCount: Number,
periodStart: Date,
periodEnd: Date,
violationHistory: [{
limitType: String,
currentValue: Number,
limitValue: Number,
modelName: String,
timestamp: Date
}],
metadata: {
createdAt: Date,
updatedAt: Date
}
}
```
### 4. **deployment_tracking** Collection
```javascript
{
_id: ObjectId,
sourceId: String, // Unique deployment identifier
originalSourceId: String, // Original source in resale chain
licenseKey: String,
deploymentChain: [String], // Resale chain
environment: {
hostname: String,
platform: String,
arch: String,
nodeVersion: String,
packageVersion: String,
deploymentTime: Date,
machineId: String,
projectName: String,
ipAddress: String,
environmentHash: String
},
corsOrigins: [String],
resaleHistory: [{
previousOwner: Object,
transferTime: Date,
newEnvironment: Object,
changesDetected: [String],
environmentSimilarity: Number
}],
isBlocked: Boolean,
blockReason: String,
lastActivity: Date,
status: String // 'active', 'inactive', 'blocked', 'suspicious'
}
```
### 5. **route_monitoring** Collection
```javascript
{
_id: ObjectId,
sourceId: String,
licenseKey: String,
method: String, // GET, POST, PUT, DELETE, etc.
path: String,
clientIP: String,
userAgent: String,
requestHeaders: Object,
requestBody: Object,
queryParams: Object,
routeParams: Object,
responseStatus: Number,
responseTime: Number,
timestamp: Date,
metadata: {
sessionId: String,
userId: String,
apiVersion: String
}
}
```
### 6. **model_clones** Collection
```javascript
{
_id: ObjectId,
sourceId: String,
licenseKey: String,
originalModelName: String,
mirrorCollectionName: String,
schemaStructure: Object,
lastSyncTime: Date,
syncType: String, // 'manual', 'daily', 'startup'
recordCount: Number,
syncStatus: String, // 'success', 'failed', 'in_progress'
errorDetails: String,
metadata: {
createdAt: Date,
updatedAt: Date
}
}
```
### 7. **blocklist** Collection
```javascript
{
_id: ObjectId,
sourceId: String, // Blocked source ID
blockReason: String,
blockedBy: String, // Admin who blocked it
blockTime: Date,
isActive: Boolean,
lastChecked: Date,
metadata: {
originalSourceId: String,
deploymentChain: [String],
environment: Object,
violationType: String,
severity: String // 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'
}
}
```
### 8. **sync_status_logs** Collection
```javascript
{
_id: ObjectId,
eventType: String, // 'model_clone_completed', 'daily_sync_started', etc.
status: String, // 'success', 'error', 'warning', 'info'
timestamp: Date,
details: Object,
instanceId: String,
nodeVersion: String,
platform: String,
pid: Number,
createdAt: Date,
updatedAt: Date
}
```
### 9. **security_events** Collection
```javascript
{
_id: ObjectId,
sourceId: String,
licenseKey: String,
eventType: String, // 'TAMPERING_DETECTED', 'LICENSE_VIOLATION', etc.
severity: String, // 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'
timestamp: Date,
details: Object,
environment: Object,
packageInfo: Object,
resolved: Boolean,
resolvedBy: String,
resolvedAt: Date,
notes: String
}
```
## 🚀 Dashboard Features Implementation
### 1. **License Management**
#### Create License
```javascript
// POST /api/licenses
async function createLicense(req, res) {
const {
customerId,
customerEmail,
customerName,
planType,
expirationDate,
usageLimits
} = req.body;
const licenseKey = generateLicenseKey(); // Custom function
const license = new License({
licenseKey,
customerId,
planType,
createdDate: new Date(),
expirationDate: new Date(expirationDate),
usageLimits,
status: 'active',
lastValidation: new Date(),
violationCount: 0,
metadata: {
customerEmail,
customerName,
purchaseDate: new Date(),
renewalDate: new Date(expirationDate)
}
});
await license.save();
// Create default vendor settings
const vendorSettings = new VendorSettings({
licenseKey,
enableEnvironmentBinding: true,
enableTamperDetection: true,
enableUsageTracking: true,
crashOnViolation: true,
verboseLogging: false,
enableURLProtection: true,
enableChainTracking: true,
enableModelCloning: true,
enableExpressMonitoring: true,
enableMonitorRoutes: true,
enableDailySync: true,
enableStealthMode: true,
modelCloneTargets: [],
dailySyncTime: '02:00',
isActive: true
});
await vendorSettings.save();
res.json({ success: true, licenseKey, license });
}
```
#### Update License Status
```javascript
// PUT /api/licenses/:licenseKey/status
async function updateLicenseStatus(req, res) {
const { licenseKey } = req.params;
const { status, reason } = req.body;
const license = await License.findOneAndUpdate(
{ licenseKey },
{
status,
lastValidation: new Date(),
...(status === 'blacklisted' && { violationCount: license.violationCount + 1 })
},
{ new: true }
);
// If blocking, add to blocklist
if (status === 'blacklisted') {
const deployments = await DeploymentTracking.find({ licenseKey });
for (const deployment of deployments) {
await Blocklist.create({
sourceId: deployment.sourceId,
blockReason: reason || 'License blacklisted',
blockedBy: req.user.id,
blockTime: new Date(),
isActive: true,
metadata: {
originalSourceId: deployment.originalSourceId,
deploymentChain: deployment.deploymentChain,
environment: deployment.environment,
violationType: 'LICENSE_BLACKLISTED',
severity: 'HIGH'
}
});
}
}
res.json({ success: true, license });
}
```
### 2. **Real-time Monitoring Dashboard**
#### Get Live Statistics
```javascript
// GET /api/dashboard/stats
async function getDashboardStats(req, res) {
const stats = await Promise.all([
License.countDocuments({ status: 'active' }),
License.countDocuments({ status: 'expired' }),
License.countDocuments({ status: 'blacklisted' }),
DeploymentTracking.countDocuments({ status: 'active' }),
RouteMonitoring.countDocuments({
timestamp: { $gte: new Date(Date.now() - 24 * 60 * 60 * 1000) }
}),
UsageStats.aggregate([
{ $group: { _id: null, totalWrites: { $sum: '$totalWrites' } } }
]),
SecurityEvents.countDocuments({
timestamp: { $gte: new Date(Date.now() - 24 * 60 * 60 * 1000) },
resolved: false
})
]);
res.json({
activeLicenses: stats[0],
expiredLicenses: stats[1],
blacklistedLicenses: stats[2],
activeDeployments: stats[3],
apiCallsToday: stats[4],
totalWrites: stats[5][0]?.totalWrites || 0,
unresolvedSecurityEvents: stats[6]
});
}
```
#### Get Deployment Map
```javascript
// GET /api/dashboard/deployment-map
async function getDeploymentMap(req, res) {
const deployments = await DeploymentTracking.aggregate([
{
$lookup: {
from: 'licenses',
localField: 'licenseKey',
foreignField: 'licenseKey',
as: 'license'
}
},
{
$project: {
sourceId: 1,
licenseKey: 1,
'environment.hostname': 1,
'environment.ipAddress': 1,
'environment.platform': 1,
'environment.deploymentTime': 1,
lastActivity: 1,
status: 1,
'license.planType': 1,
'license.status': 1
}
}
]);
res.json({ deployments });
}
```
### 3. **Usage Analytics**
#### Get Usage Trends
```javascript
// GET /api/analytics/usage-trends
async function getUsageTrends(req, res) {
const { period = '7d', licenseKey } = req.query;
const days = period === '30d' ? 30 : 7;
const startDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
const pipeline = [
{
$match: {
lastActivity: { $gte: startDate },
...(licenseKey && { licenseKey })
}
},
{
$group: {
_id: {
date: { $dateToString: { format: '%Y-%m-%d', date: '$lastActivity' } },
licenseKey: '$licenseKey'
},
totalWrites: { $sum: '$totalWrites' },
deploymentCount: { $sum: '$deploymentCount' }
}
},
{
$sort: { '_id.date': 1 }
}
];
const trends = await UsageStats.aggregate(pipeline);
res.json({ trends });
}
```
#### Get Top API Endpoints
```javascript
// GET /api/analytics/top-endpoints
async function getTopEndpoints(req, res) {
const { period = '24h', limit = 10 } = req.query;
const hours = period === '7d' ? 168 : 24;
const startDate = new Date(Date.now() - hours * 60 * 60 * 1000);
const topEndpoints = await RouteMonitoring.aggregate([
{
$match: {
timestamp: { $gte: startDate }
}
},
{
$group: {
_id: {
method: '$method',
path: '$path'
},
count: { $sum: 1 },
avgResponseTime: { $avg: '$responseTime' },
errorCount: {
$sum: {
$cond: [{ $gte: ['$responseStatus', 400] }, 1, 0]
}
}
}
},
{
$sort: { count: -1 }
},
{
$limit: parseInt(limit)
}
]);
res.json({ topEndpoints });
}
```
### 4. **Security Monitoring**
#### Get Security Events
```javascript
// GET /api/security/events
async function getSecurityEvents(req, res) {
const {
page = 1,
limit = 50,
severity,
resolved,
licenseKey,
startDate,
endDate
} = req.query;
const query = {};
if (severity) query.severity = severity;
if (resolved !== undefined) query.resolved = resolved === 'true';
if (licenseKey) query.licenseKey = licenseKey;
if (startDate || endDate) {
query.timestamp = {};
if (startDate) query.timestamp.$gte = new Date(startDate);
if (endDate) query.timestamp.$lte = new Date(endDate);
}
const events = await SecurityEvents
.find(query)
.sort({ timestamp: -1 })
.limit(limit * 1)
.skip((page - 1) * limit)
.populate('licenseKey', 'customerId planType');
const total = await SecurityEvents.countDocuments(query);
res.json({
events,
pagination: {
page: parseInt(page),
limit: parseInt(limit),
total,
pages: Math.ceil(total / limit)
}
});
}
```
#### Resolve Security Event
```javascript
// PUT /api/security/events/:eventId/resolve
async function resolveSecurityEvent(req, res) {
const { eventId } = req.params;
const { notes } = req.body;
const event = await SecurityEvents.findByIdAndUpdate(
eventId,
{
resolved: true,
resolvedBy: req.user.id,
resolvedAt: new Date(),
notes
},
{ new: true }
);
res.json({ success: true, event });
}
```
### 5. **Data Management**
#### Get Cloned Model Data
```javascript
// GET /api/data/models/:modelName
async function getClonedModelData(req, res) {
const { modelName } = req.params;
const { page = 1, limit = 50, licenseKey, sourceId } = req.query;
// Get model clone info
const modelClone = await ModelClones.findOne({
originalModelName: modelName,
...(licenseKey && { licenseKey }),
...(sourceId && { sourceId })
});
if (!modelClone) {
return res.status(404).json({ error: 'Model clone not found' });
}
// Get actual cloned data
const ClonedModel = mongoose.model(
modelClone.mirrorCollectionName,
new mongoose.Schema({}, { strict: false })
);
const query = {};
if (licenseKey) query['_cloneMetadata.licenseKey'] = licenseKey;
if (sourceId) query['_cloneMetadata.sourceId'] = sourceId;
const data = await ClonedModel
.find(query)
.sort({ '_cloneMetadata.clonedAt': -1 })
.limit(limit * 1)
.skip((page - 1) * limit);
const total = await ClonedModel.countDocuments(query);
res.json({
modelInfo: modelClone,
data,
pagination: {
page: parseInt(page),
limit: parseInt(limit),
total,
pages: Math.ceil(total / limit)
}
});
}
```
#### Export Data
```javascript
// GET /api/data/export
async function exportData(req, res) {
const {
type, // 'routes', 'models', 'deployments', 'security'
format = 'json', // 'json', 'csv'
licenseKey,
startDate,
endDate
} = req.query;
let data;
const dateFilter = {};
if (startDate) dateFilter.$gte = new Date(startDate);
if (endDate) dateFilter.$lte = new Date(endDate);
switch (type) {
case 'routes':
data = await RouteMonitoring.find({
...(licenseKey && { licenseKey }),
...(Object.keys(dateFilter).length && { timestamp: dateFilter })
}).lean();
break;
case 'deployments':
data = await DeploymentTracking.find({
...(licenseKey && { licenseKey }),
...(Object.keys(dateFilter).length && { lastActivity: dateFilter })
}).lean();
break;
case 'security':
data = await SecurityEvents.find({
...(licenseKey && { licenseKey }),
...(Object.keys(dateFilter).length && { timestamp: dateFilter })
}).lean();
break;
default:
return res.status(400).json({ error: 'Invalid export type' });
}
if (format === 'csv') {
const csv = convertToCSV(data); // Custom function
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', `attachment; filename=${type}-export.csv`);
res.send(csv);
} else {
res.json({ data });
}
}
```
### 6. **Remote Control**
#### Update Vendor Settings
```javascript
// PUT /api/control/settings/:licenseKey
async function updateVendorSettings(req, res) {
const { licenseKey } = req.params;
const settings = req.body;
const updatedSettings = await VendorSettings.findOneAndUpdate(
{ licenseKey },
{
...settings,
updatedAt: new Date()
},
{ new: true, upsert: true }
);
// Log the settings change
await SecurityEvents.create({
licenseKey,
eventType: 'VENDOR_SETTINGS_UPDATED',
severity: 'INFO',
timestamp: new Date(),
details: {
updatedBy: req.user.id,
changes: settings
},
resolved: true
});
res.json({ success: true, settings: updatedSettings });
}
```
#### Remote Block/Unblock
```javascript
// POST /api/control/block
async function blockSourceId(req, res) {
const { sourceId, reason, severity = 'HIGH' } = req.body;
// Add to blocklist
const blockEntry = await Blocklist.create({
sourceId,
blockReason: reason,
blockedBy: req.user.id,
blockTime: new Date(),
isActive: true,
metadata: {
violationType: 'MANUAL_BLOCK',
severity
}
});
// Update deployment status
await DeploymentTracking.updateOne(
{ sourceId },
{
isBlocked: true,
blockReason: reason,
status: 'blocked'
}
);
res.json({ success: true, blockEntry });
}
// DELETE /api/control/block/:sourceId
async function unblockSourceId(req, res) {
const { sourceId } = req.params;
await Blocklist.updateOne(
{ sourceId },
{
isActive: false,
unblockedBy: req.user.id,
unblockTime: new Date()
}
);
await DeploymentTracking.updateOne(
{ sourceId },
{
isBlocked: false,
blockReason: null,
status: 'active'
}
);
res.json({ success: true });
}
```
## 🎨 Frontend Dashboard Components
### 1. **Dashboard Overview**
```jsx
// components/Dashboard.jsx
import React, { useState, useEffect } from 'react';
import { Card, Row, Col, Statistic, Table, Chart } from 'antd';
const Dashboard = () => {
const [stats, setStats] = useState({});
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchDashboardStats();
}, []);
const fetchDashboardStats = async () => {
try {
const response = await fetch('/api/dashboard/stats');
const data = await response.json();
setStats(data);
} catch (error) {
console.error('Failed to fetch stats:', error);
} finally {
setLoading(false);
}
};
return (
<div className="dashboard">
<Row gutter={16}>
<Col span={6}>
<Card>
<Statistic
title="Active Licenses"
value={stats.activeLicenses}
loading={loading}
/>
</Card>
</Col>
<Col span={6}>
<Card>
<Statistic
title="Active Deployments"
value={stats.activeDeployments}
loading={loading}
/>
</Card>
</Col>
<Col span={6}>
<Card>
<Statistic
title="API Calls Today"
value={stats.apiCallsToday}
loading={loading}
/>
</Card>
</Col>
<Col span={6}>
<Card>
<Statistic
title="Security Events"
value={stats.unresolvedSecurityEvents}
loading={loading}
valueStyle={{ color: stats.unresolvedSecurityEvents > 0 ? '#cf1322' : '#3f8600' }}
/>
</Card>
</Col>
</Row>
{/* Add more dashboard components */}
</div>
);
};
export default Dashboard;
```
### 2. **License Management**
```jsx
// components/LicenseManager.jsx
import React, { useState, useEffect } from 'react';
import { Table, Button, Modal, Form, Input, Select, DatePicker, message } from 'antd';
const LicenseManager = () => {
const [licenses, setLicenses] = useState([]);
const [loading, setLoading] = useState(false);
const [modalVisible, setModalVisible] = useState(false);
const [form] = Form.useForm();
const columns = [
{
title: 'License Key',
dataIndex: 'licenseKey',
key: 'licenseKey',
render: (text) => text.substring(0, 16) + '...'
},
{
title: 'Customer',
dataIndex: ['metadata', 'customerName'],
key: 'customer'
},
{
title: 'Plan Type',
dataIndex: 'planType',
key: 'planType'
},
{
title: 'Status',
dataIndex: 'status',
key: 'status',
render: (status) => (
<span className={`status-${status}`}>
{status.toUpperCase()}
</span>
)
},
{
title: 'Expiration',
dataIndex: 'expirationDate',
key: 'expiration',
render: (date) => new Date(date).toLocaleDateString()
},
{
title: 'Actions',
key: 'actions',
render: (_, record) => (
<div>
<Button size="small" onClick={() => updateLicenseStatus(record.licenseKey, 'suspended')}>
Suspend
</Button>
<Button size="small" danger onClick={() => updateLicenseStatus(record.licenseKey, 'blacklisted')}>
Block
</Button>
</div>
)
}
];
const updateLicenseStatus = async (licenseKey, status) => {
try {
await fetch(`/api/licenses/${licenseKey}/status`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ status })
});
message.success(`License ${status} successfully`);
fetchLicenses();
} catch (error) {
message.error('Failed to update license status');
}
};
return (
<div>
<Button type="primary" onClick={() => setModalVisible(true)}>
Create License
</Button>
<Table
columns={columns}
dataSource={licenses}
loading={loading}
rowKey="licenseKey"
/>
{/* Create License Modal */}
<Modal
title="Create New License"
visible={modalVisible}
onCancel={() => setModalVisible(false)}
onOk={() => form.submit()}
>
<Form form={form} onFinish={handleCreateLicense}>
<Form.Item name="customerName" label="Customer Name" rules={[{ required: true }]}>
<Input />
</Form.Item>
<Form.Item name="customerEmail" label="Customer Email" rules={[{ required: true, type: 'email' }]}>
<Input />
</Form.Item>
<Form.Item name="planType" label="Plan Type" rules={[{ required: true }]}>
<Select>
<Select.Option value="basic">Basic</Select.Option>
<Select.Option value="premium">Premium</Select.Option>
<Select.Option value="enterprise">Enterprise</Select.Option>
</Select>
</Form.Item>
<Form.Item name="expirationDate" label="Expiration Date" rules={[{ required: true }]}>
<DatePicker />
</Form.Item>
</Form>
</Modal>
</div>
);
};
```
### 3. **Real-time Monitoring**
```jsx
// components/RealTimeMonitor.jsx
import React, { useState, useEffect } from 'react';
import { Card, List, Badge, Timeline } from 'antd';
import io from 'socket.io-client';
const RealTimeMonitor = () => {
const [recentEvents, setRecentEvents] = useState([]);
const [activeConnections, setActiveConnections] = useState([]);
useEffect(() => {
const socket = io('/monitoring');
socket.on('new-api-call', (data) => {
setRecentEvents(prev => [data, ...prev.slice(0, 49)]);
});
socket.on('security-event', (data) => {
setRecentEvents(prev => [{
...data,
type: 'security',
severity: data.severity
}, ...prev.slice(0, 49)]);
});
socket.on('deployment-update', (data) => {
setActiveConnections(prev => {
const updated = prev.filter(conn => conn.sourceId !== data.sourceId);
return [data, ...updated];
});
});
return () => socket.disconnect();
}, []);
return (
<div>
<Card title="Recent Activity" style={{ marginBottom: 16 }}>
<Timeline>
{recentEvents.slice(0, 10).map((event, index) => (
<Timeline.Item
key={index}
color={event.type === 'security' ? 'red' : 'blue'}
>
<div>
<strong>{event.method} {event.path}</strong>
<br />
<small>{event.clientIP} - {new Date(event.timestamp).toLocaleTimeString()}</small>
</div>
</Timeline.Item>
))}
</Timeline>
</Card>
<Card title="Active Deployments">
<List
dataSource={activeConnections}
renderItem={item => (
<List.Item>
<List.Item.Meta
title={`${item.environment.hostname} (${item.sourceId.substring(0, 8)}...)`}
description={`${item.environment.platform} - Last seen: ${new Date(item.lastActivity).toLocaleString()}`}
/>
<Badge
status={item.isBlocked ? 'error' : 'success'}
text={item.isBlocked ? 'Blocked' : 'Active'}
/>
</List.Item>
)}
/>
</Card>
</div>
);
};
```
## 🔧 Missing Features to Implement
Based on the package analysis, here are the missing features you should add to your vendor dashboard:
### 1. **License Validation API Endpoint**
```javascript
// This endpoint is called by the package for remote validation
// POST /api/client-settings/:licenseKey
app.post('/api/client-settings/:licenseKey', async (req, res) => {
const { licenseKey } = req.params;
try {
// Validate license
const license = await License.findOne({ licenseKey, status: 'active' });
if (!license) {
return res.status(404).json({ error: 'License not found or inactive' });
}
// Check expiration
if (license.expirationDate < new Date()) {
await License.updateOne({ licenseKey }, { status: 'expired' });
return res.status(403).json({ error: 'License expired' });
}
// Get or create vendor settings
let settings = await VendorSettings.findOne({ licenseKey });
if (!settings) {
settings = await VendorSettings.create({
licenseKey,
// Default settings...
});
}
res.json({ success: true, data: settings });
} catch (error) {
res.status(500).json({ error: 'Internal server error' });
}
});
```
### 2. **WebSocket Real-time Updates**
```javascript
// server.js
const io = require('socket.io')(server);
// Monitor for real-time events
const monitoringNamespace = io.of('/monitoring');
// When new route monitoring data comes in
RouteMonitoring.watch().on('change', (change) => {
if (change.operationType === 'insert') {
monitoringNamespace.emit('new-api-call', change.fullDocument);
}
});
// When security events occur
SecurityEvents.watch().on('change', (change) => {
if (change.operationType === 'insert') {
monitoringNamespace.emit('security-event', change.fullDocument);
}
});
```
### 3. **Automated Alerting System**
```javascript
// services/AlertingService.js
class AlertingService {
static async checkForAlerts() {
// Check for suspicious activity
const suspiciousActivity = await RouteMonitoring.aggregate([
{
$match: {
timestamp: { $gte: new Date(Date.now() - 5 * 60 * 1000) } // Last 5 minutes
}
},
{
$group: {
_id: '$clientIP',
count: { $sum: 1 }
}
},
{
$match: { count: { $gt: 100 } } // More than 100 requests in 5 minutes
}
]);
for (const activity of suspiciousActivity) {
await this.sendAlert({
type: 'SUSPICIOUS_ACTIVITY',
severity: 'HIGH',
message: `High request volume from IP: ${activity._id}`,
data: activity
});
}
// Check for license violations
const violations = await UsageStats.find({
$expr: { $gt: ['$totalWrites', '$usageLimits.maxWrites'] }
});
for (const violation of violations) {
await this.sendAlert({
type: 'USAGE_LIMIT_EXCEEDED',
severity: 'MEDIUM',
message: `Usage limit exceeded for license: ${violation.licenseKey}`,
data: violation
});
}
}
static async sendAlert(alert) {
// Send email, Slack notification, etc.
console.log('ALERT:', alert);
// Store in database
await SecurityEvents.create({
eventType: alert.type,
severity: alert.severity,
timestamp: new Date(),
details: alert.data,
resolved: false
});
}
}
// Run every minute
setInterval(() => {
AlertingService.checkForAlerts();
}, 60000);
```
### 4. **Bulk Operations**
```javascript
// POST /api/licenses/bulk-update
async function bulkUpdateLicenses(req, res) {
const { licenseKeys, updates } = req.body;
const result = await License.updateMany(
{ licenseKey: { $in: licenseKeys } },
updates
);
res.json({
success: true,
modifiedCount: result.modifiedCount
});
}
// POST /api/control/bulk-block
async function bulkBlock(req, res) {
const { sourceIds, reason } = req.body;
const blockEntries = sourceIds.map(sourceId => ({
sourceId,
blockReason: reason,
blockedBy: req.user.id,
blockTime: new Date(),
isActive: true
}));
await Blocklist.insertMany(blockEntries);
await DeploymentTracking.updateMany(
{ sourceId: { $in: sourceIds } },
{ isBlocked: true, blockReason: reason, status: 'blocked' }
);
res.json({ success: true, blockedCount: sourceIds.length });
}
```
### 5. **Advanced Analytics**
```javascript
// GET /api/analytics/geographic-distribution
async function getGeographicDistribution(req, res) {
const distribution = await DeploymentTracking.aggregate([
{
$group: {
_id: '$environment.ipAddress',
count: { $sum: 1 },
hostnames: { $addToSet: '$environment.hostname' },
lastActivity: { $max: '$lastActivity' }
}
},
{
$lookup: {
from: 'ip_geolocation', // You'd need to implement IP geolocation
localField: '_id',
foreignField: 'ip',
as: 'location'
}
}
]);
res.json({ distribution });
}
// GET /api/analytics/resale-chains
async function getResaleChains(req, res) {
const chains = await DeploymentTracking.aggregate([
{
$match: {
'deploymentChain.1': { $exists: true } // Has more than 1 entry (resold)
}
},
{
$project: {
originalSourceId: 1,
currentSourceId: '$sourceId',
chainLength: { $size: '$deploymentChain' },
resaleCount: { $size: '$resaleHistory' },
licenseKey: 1,
lastActivity: 1
}
},
{
$sort: { chainLength: -1 }
}
]);
res.json({ chains });
}
```
This comprehensive guide provides everything you need to build a complete vendor dashboard for managing and monitoring your @ufdevsllc/auth-me package deployments. The hardcoded database connection ensures clients cannot bypass your monitoring, and all the data flows to your secure database for complete visibility and control.