192 lines
8.7 KiB
JavaScript
192 lines
8.7 KiB
JavaScript
// backend/models/Schemas.js
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
// MongoDB Schemas untuk BackOne Backend (READ-ONLY)
|
|
//
|
|
// PENTING: Schema ini harus sinkron dengan proxy/models/Schemas.js
|
|
// Proxy yang MENULIS data, backend yang MEMBACA data.
|
|
//
|
|
// Setiap dokumen di-tag dengan:
|
|
// agent_uuid → identifikasi Network Agent spesifik (isolasi per tenant)
|
|
// site_uuid → identifikasi site DPI (BackOne)
|
|
// timestamp → waktu data dikumpulkan
|
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
const mongoose = require('mongoose');
|
|
|
|
const baseOptions = {
|
|
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
|
|
};
|
|
|
|
// ─── Bandwidth Summary (per agent, per collection cycle) ───────────────────────
|
|
const SummarySchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true }, // null = global/all agents
|
|
site_uuid: { type: String, index: true },
|
|
bandwidth_down: Number,
|
|
bandwidth_up: Number,
|
|
active_flows: Number,
|
|
download_speed: Number,
|
|
upload_speed: Number,
|
|
total_devices: Number,
|
|
total_threats: Number,
|
|
packet_drops: Number,
|
|
peak_flow_rate: Number,
|
|
cpu_usage: Number,
|
|
memory_usage: Number,
|
|
queue_depth: Number,
|
|
}, baseOptions);
|
|
|
|
// ─── Top Applications (per agent) ─────────────────────────────────────────────
|
|
const AppStatSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
app_label: { type: String, required: true },
|
|
download: Number,
|
|
upload: Number,
|
|
flows: Number,
|
|
}, baseOptions);
|
|
|
|
// ─── Protocol Statistics (per agent) ──────────────────────────────────────────
|
|
const ProtocolStatSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
protocol_label: { type: String, required: true },
|
|
download: Number,
|
|
upload: Number,
|
|
flows: Number,
|
|
}, baseOptions);
|
|
|
|
// ─── Discovered Devices (per agent, includes IP + MAC + device info) ───────────
|
|
const DeviceStatSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
ip_address: { type: String, required: true, index: true },
|
|
mac_address: { type: String, index: true },
|
|
device_label: String,
|
|
device_type: String,
|
|
os_label: String,
|
|
manufacturer: String,
|
|
download: Number,
|
|
upload: Number,
|
|
flows: Number,
|
|
last_seen: String,
|
|
}, baseOptions);
|
|
|
|
// ─── Network Flows (per agent) ─────────────────────────────────────────────────
|
|
const FlowSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
flow_id: String,
|
|
src_ip: { type: String, index: true },
|
|
src_mac: { type: String, index: true },
|
|
dst_ip: { type: String, index: true },
|
|
dst_port: Number,
|
|
protocol: String,
|
|
app_label: String,
|
|
domain: { type: String, index: true },
|
|
download: Number,
|
|
upload: Number,
|
|
first_seen: String,
|
|
last_seen: String,
|
|
}, baseOptions);
|
|
|
|
// ─── Cyber Threats (per agent) ─────────────────────────────────────────────────
|
|
const ThreatSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
threat_type: String,
|
|
severity: String,
|
|
src_ip: String,
|
|
dst_ip: String,
|
|
dst_port: Number,
|
|
protocol: String,
|
|
description: String,
|
|
event_at: String,
|
|
flow_id: { type: String, index: true },
|
|
}, baseOptions);
|
|
|
|
// ─── App Categories (per agent) ───────────────────────────────────────────────
|
|
const AppCategoryStatSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
category_label: { type: String, required: true },
|
|
download: Number,
|
|
upload: Number,
|
|
flows: Number,
|
|
}, baseOptions);
|
|
|
|
// ─── System Events (per agent) ─────────────────────────────────────────────────
|
|
const EventSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
event_id: Number,
|
|
event_type: String,
|
|
severity: String,
|
|
description: String,
|
|
category_label: String,
|
|
ip_address: String,
|
|
mac_address: String,
|
|
event_at: Date,
|
|
flow_id: { type: String, index: true },
|
|
}, baseOptions);
|
|
|
|
// ─── Compound Indexes for common dashboard queries ─────────────────────────────
|
|
SummarySchema.index({ agent_uuid: 1, timestamp: -1 });
|
|
AppStatSchema.index({ agent_uuid: 1, timestamp: -1, download: -1 });
|
|
DeviceStatSchema.index({ agent_uuid: 1, ip_address: 1 }, { unique: true });
|
|
FlowSchema.index({ agent_uuid: 1, timestamp: -1 });
|
|
FlowSchema.index({ agent_uuid: 1, src_ip: 1, timestamp: -1 });
|
|
FlowSchema.index({ agent_uuid: 1, dst_ip: 1, timestamp: -1 });
|
|
FlowSchema.index({ site_uuid: 1, src_ip: 1, timestamp: -1 });
|
|
FlowSchema.index({ site_uuid: 1, dst_ip: 1, timestamp: -1 });
|
|
FlowSchema.index({ agent_uuid: 1, flow_id: 1 });
|
|
FlowSchema.index({ agent_uuid: 1, protocol: 1, timestamp: -1 });
|
|
FlowSchema.index({ agent_uuid: 1, domain: 1, timestamp: -1 });
|
|
FlowSchema.index({ site_uuid: 1, app_label: 1, timestamp: -1 });
|
|
FlowSchema.index({ site_uuid: 1, src_mac: 1, timestamp: -1 });
|
|
ThreatSchema.index({ agent_uuid: 1, timestamp: -1 });
|
|
AppCategoryStatSchema.index({ agent_uuid: 1, timestamp: -1 });
|
|
EventSchema.index({ agent_uuid: 1, timestamp: -1 });
|
|
|
|
// ── Per-Device Per-Application Stats (synced from proxy) ─────────────────
|
|
const DeviceAppStatSchema = new mongoose.Schema({
|
|
timestamp: { type: Date, required: true, index: true, expires: '7d' },
|
|
agent_uuid: { type: String, index: true },
|
|
site_uuid: { type: String, index: true },
|
|
ip_address: { type: String, required: true, index: true },
|
|
app_label: { type: String, required: true },
|
|
app_id: Number,
|
|
download: { type: Number, default: 0 },
|
|
upload: { type: Number, default: 0 },
|
|
flows: { type: Number, default: 0 },
|
|
last_seen: String,
|
|
}, baseOptions);
|
|
DeviceAppStatSchema.index({ agent_uuid: 1, ip_address: 1, timestamp: -1 });
|
|
DeviceAppStatSchema.index({ ip_address: 1, app_label: 1, timestamp: -1 });
|
|
DeviceAppStatSchema.index({ site_uuid: 1, app_label: 1, timestamp: -1 });
|
|
|
|
const telemetrySchemas = require('./SchemasTelemetry');
|
|
const auxSchemas = require('./SchemasAux');
|
|
|
|
module.exports = {
|
|
Summary: mongoose.model('Summary', SummarySchema),
|
|
AppStat: mongoose.model('AppStat', AppStatSchema),
|
|
ProtocolStat: mongoose.model('ProtocolStat', ProtocolStatSchema),
|
|
DeviceStat: mongoose.model('DeviceStat', DeviceStatSchema),
|
|
DeviceAppStat: mongoose.model('DeviceAppStat', DeviceAppStatSchema),
|
|
Flow: mongoose.model('Flow', FlowSchema),
|
|
Threat: mongoose.model('Threat', ThreatSchema),
|
|
AppCategoryStat: mongoose.model('AppCategoryStat', AppCategoryStatSchema),
|
|
Event: mongoose.model('Event', EventSchema),
|
|
...auxSchemas,
|
|
...telemetrySchemas
|
|
};
|
|
|