()
| 485 | } |
| 486 | |
| 487 | export async function getFlaggedPlugins() { |
| 488 | const supabase = await createClient(); |
| 489 | const severityRank = { high: 0, medium: 1, low: 2 } as const; |
| 490 | |
| 491 | const { data, error } = await supabase |
| 492 | .from("plugins") |
| 493 | .select("*, plugin_components(*)") |
| 494 | .eq("scan_status", "flagged") |
| 495 | .order("flagged_at", { ascending: false, nullsFirst: false }) |
| 496 | .limit(500); |
| 497 | |
| 498 | if (error) return { data: null as PluginRow[] | null, error }; |
| 499 | |
| 500 | const sorted = (data as PluginRow[] | null)?.slice().sort((a, b) => { |
| 501 | const aRank = a.flag_severity ? severityRank[a.flag_severity] : 3; |
| 502 | const bRank = b.flag_severity ? severityRank[b.flag_severity] : 3; |
| 503 | if (aRank !== bRank) return aRank - bRank; |
| 504 | const aTime = a.flagged_at ? new Date(a.flagged_at).getTime() : 0; |
| 505 | const bTime = b.flagged_at ? new Date(b.flagged_at).getTime() : 0; |
| 506 | return bTime - aTime; |
| 507 | }); |
| 508 | |
| 509 | return { data: sorted ?? null, error: null }; |
| 510 | } |
| 511 | |
| 512 | export async function getPendingVerificationRequests() { |
| 513 | const supabase = await createClient(); |
no test coverage detected