Enhance detection filtering and increase result limits
Update API endpoints and storage logic to support filtering detections by anomaly type, minimum/maximum risk score, and to increase the default limit of returned detections. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528 Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Event-Id: 2236a0ee-4ac6-4527-bd70-449e36f71c7e Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/1zhedLT
This commit is contained in:
parent
163776497f
commit
d9aa466758
@ -63,8 +63,17 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|||||||
// Detections
|
// Detections
|
||||||
app.get("/api/detections", async (req, res) => {
|
app.get("/api/detections", async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const limit = parseInt(req.query.limit as string) || 100;
|
const limit = req.query.limit ? parseInt(req.query.limit as string) : 500;
|
||||||
const detections = await storage.getAllDetections(limit);
|
const anomalyType = req.query.anomalyType as string | undefined;
|
||||||
|
const minScore = req.query.minScore ? parseFloat(req.query.minScore as string) : undefined;
|
||||||
|
const maxScore = req.query.maxScore ? parseFloat(req.query.maxScore as string) : undefined;
|
||||||
|
|
||||||
|
const detections = await storage.getAllDetections({
|
||||||
|
limit,
|
||||||
|
anomalyType,
|
||||||
|
minScore,
|
||||||
|
maxScore
|
||||||
|
});
|
||||||
res.json(detections);
|
res.json(detections);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[DB ERROR] Failed to fetch detections:', error);
|
console.error('[DB ERROR] Failed to fetch detections:', error);
|
||||||
@ -181,7 +190,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|||||||
app.get("/api/stats", async (req, res) => {
|
app.get("/api/stats", async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const routers = await storage.getAllRouters();
|
const routers = await storage.getAllRouters();
|
||||||
const detections = await storage.getAllDetections(1000);
|
const detections = await storage.getAllDetections({ limit: 1000 });
|
||||||
const recentLogs = await storage.getRecentLogs(1000);
|
const recentLogs = await storage.getRecentLogs(1000);
|
||||||
const whitelist = await storage.getAllWhitelist();
|
const whitelist = await storage.getAllWhitelist();
|
||||||
const latestTraining = await storage.getLatestTraining();
|
const latestTraining = await storage.getLatestTraining();
|
||||||
|
|||||||
@ -35,7 +35,12 @@ export interface IStorage {
|
|||||||
getLogsForTraining(limit: number, minTimestamp?: Date): Promise<NetworkLog[]>;
|
getLogsForTraining(limit: number, minTimestamp?: Date): Promise<NetworkLog[]>;
|
||||||
|
|
||||||
// Detections
|
// Detections
|
||||||
getAllDetections(limit: number): Promise<Detection[]>;
|
getAllDetections(options: {
|
||||||
|
limit?: number;
|
||||||
|
anomalyType?: string;
|
||||||
|
minScore?: number;
|
||||||
|
maxScore?: number;
|
||||||
|
}): Promise<Detection[]>;
|
||||||
getDetectionByIp(sourceIp: string): Promise<Detection | undefined>;
|
getDetectionByIp(sourceIp: string): Promise<Detection | undefined>;
|
||||||
createDetection(detection: InsertDetection): Promise<Detection>;
|
createDetection(detection: InsertDetection): Promise<Detection>;
|
||||||
updateDetection(id: string, detection: Partial<InsertDetection>): Promise<Detection | undefined>;
|
updateDetection(id: string, detection: Partial<InsertDetection>): Promise<Detection | undefined>;
|
||||||
@ -140,12 +145,40 @@ export class DatabaseStorage implements IStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Detections
|
// Detections
|
||||||
async getAllDetections(limit: number): Promise<Detection[]> {
|
async getAllDetections(options: {
|
||||||
return await db
|
limit?: number;
|
||||||
|
anomalyType?: string;
|
||||||
|
minScore?: number;
|
||||||
|
maxScore?: number;
|
||||||
|
}): Promise<Detection[]> {
|
||||||
|
const { limit = 500, anomalyType, minScore, maxScore } = options;
|
||||||
|
|
||||||
|
// Build WHERE conditions
|
||||||
|
const conditions = [];
|
||||||
|
|
||||||
|
if (anomalyType) {
|
||||||
|
conditions.push(eq(detections.anomalyType, anomalyType));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minScore !== undefined) {
|
||||||
|
conditions.push(gte(detections.riskScore, minScore.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxScore !== undefined) {
|
||||||
|
conditions.push(sql`${detections.riskScore}::numeric <= ${maxScore}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = db
|
||||||
.select()
|
.select()
|
||||||
.from(detections)
|
.from(detections)
|
||||||
.orderBy(desc(detections.detectedAt))
|
.orderBy(desc(detections.detectedAt))
|
||||||
.limit(limit);
|
.limit(limit);
|
||||||
|
|
||||||
|
if (conditions.length > 0) {
|
||||||
|
return await query.where(and(...conditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
return await query;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDetectionByIp(sourceIp: string): Promise<Detection | undefined> {
|
async getDetectionByIp(sourceIp: string): Promise<Detection | undefined> {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user