Skip to main content
Glama
+server.js4.33 kB
import { json } from '@sveltejs/kit'; import sqlite3 from 'sqlite3'; import { open } from 'sqlite'; import crypto from 'crypto'; const DB_PATH = '../data/workflow.db'; async function getDatabase() { return await open({ filename: DB_PATH, driver: sqlite3.Database }); } /** @type {import('./$types').RequestHandler} */ export async function GET({ url }) { try { const db = await getDatabase(); // Get query parameters for filtering const enabled = url.searchParams.get('enabled'); const severity = url.searchParams.get('severity'); const rule_type = url.searchParams.get('rule_type'); const environment_id = url.searchParams.get('environment_id'); const sort_by = url.searchParams.get('sort_by') || 'created_desc'; let query = 'SELECT * FROM alert_rules WHERE 1=1'; const params = []; if (enabled !== null) { query += ' AND enabled = ?'; params.push(enabled === 'true' ? 1 : 0); } if (severity) { query += ' AND severity = ?'; params.push(severity); } if (rule_type) { query += ' AND rule_type = ?'; params.push(rule_type); } if (environment_id) { query += ' AND environment_id = ?'; params.push(environment_id); } // Add sorting switch (sort_by) { case 'created_asc': query += ' ORDER BY created_at ASC'; break; case 'name_asc': query += ' ORDER BY name ASC'; break; case 'name_desc': query += ' ORDER BY name DESC'; break; case 'severity_desc': query += ' ORDER BY CASE severity WHEN "critical" THEN 1 WHEN "high" THEN 2 WHEN "medium" THEN 3 WHEN "low" THEN 4 END'; break; case 'updated_desc': query += ' ORDER BY updated_at DESC'; break; default: // created_desc query += ' ORDER BY created_at DESC'; } const alertRules = await db.all(query, params); // Get summary statistics const summary = await db.get(` SELECT COUNT(*) as total_rules, COUNT(CASE WHEN enabled = 1 THEN 1 END) as enabled_rules, COUNT(CASE WHEN enabled = 0 THEN 1 END) as disabled_rules, COUNT(CASE WHEN severity = 'critical' AND enabled = 1 THEN 1 END) as critical_active, COUNT(CASE WHEN severity = 'high' AND enabled = 1 THEN 1 END) as high_active, COUNT(CASE WHEN severity = 'medium' AND enabled = 1 THEN 1 END) as medium_active, COUNT(CASE WHEN severity = 'low' AND enabled = 1 THEN 1 END) as low_active FROM alert_rules `); await db.close(); return json({ alert_rules: alertRules, summary: summary }); } catch (error) { console.error('Error fetching alert rules:', error); return json({ alert_rules: [], summary: { total_rules: 0, enabled_rules: 0, disabled_rules: 0, critical_active: 0, high_active: 0, medium_active: 0, low_active: 0 } }, { status: 500 }); } } /** @type {import './$types').RequestHandler} */ export async function POST({ request }) { try { const ruleData = await request.json(); const db = await getDatabase(); const ruleId = crypto.randomUUID(); await db.run(` INSERT INTO alert_rules ( id, name, description, rule_type, condition_expression, severity, environment_id, threshold_value, notification_channels, enabled, tags, created_at, updated_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) `, [ ruleId, ruleData.name, ruleData.description || null, ruleData.rule_type || 'threshold', ruleData.condition_expression, ruleData.severity || 'medium', ruleData.environment_id || null, ruleData.threshold_value || null, JSON.stringify(ruleData.notification_channels || []), ruleData.enabled !== undefined ? (ruleData.enabled ? 1 : 0) : 1, JSON.stringify(ruleData.tags || []) ]); const alertRule = await db.get('SELECT * FROM alert_rules WHERE id = ?', [ruleId]); await db.close(); return json(alertRule, { status: 201 }); } catch (error) { console.error('Error creating alert rule:', error); return json({ error: 'Failed to create alert rule' }, { status: 500 }); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/foswmine/workflow-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server