diff --git a/svelte/src/admin_panel/AbuseReport.svelte b/svelte/src/admin_panel/AbuseReport.svelte index 06129e9..8dde3f7 100644 --- a/svelte/src/admin_panel/AbuseReport.svelte +++ b/svelte/src/admin_panel/AbuseReport.svelte @@ -5,28 +5,14 @@ import { createEventDispatcher } from "svelte"; let dispatch = createEventDispatcher() export let report +export let ip_report_count let preview = false +$: can_grant = report.status !== "granted" +$: can_reject = report.status !== "rejected" + let set_status = async (action, report_type) => { - const form = new FormData() - form.append("action", action) - if (action === "grant") { - form.append("type", report_type) - } - - try { - const resp = await fetch( - window.api_endpoint+"/admin/abuse_report/"+report.id, - { method: "POST", body: form } - ); - if(resp.status >= 400) { - throw new Error(resp.text()) - } - - dispatch("refresh"); - } catch (err) { - alert(err); - } + dispatch("resolve_report", {action: action, report_type: report_type}) } @@ -56,12 +42,16 @@ let set_status = async (action, report_type) => { - - + {#if can_grant} + + {/if} + {#if can_reject} + + {/if}
@@ -87,6 +77,7 @@ let set_status = async (action, report_type) => { IP Type Status + Reports from this IP {#each report.reports as user_report} @@ -94,6 +85,19 @@ let set_status = async (action, report_type) => { {user_report.ip_address} {user_report.type} {user_report.status} + {ip_report_count[user_report.ip_address]} + + {#if can_grant} + + {/if} + {#if can_reject} + + {/if} + {/each} diff --git a/svelte/src/admin_panel/AbuseReports.svelte b/svelte/src/admin_panel/AbuseReports.svelte index 9ca6a8a..6245b09 100644 --- a/svelte/src/admin_panel/AbuseReports.svelte +++ b/svelte/src/admin_panel/AbuseReports.svelte @@ -11,22 +11,12 @@ let endPicker let tab = "pending" -let refresh_timeout = null -const resolve_report = (remove = -1) => { - if (remove >= 0) { - console.debug("removing item", remove) - reports.splice(remove, 1) - reports = reports - } - - // If a refresh is already scheduled we remove it and schedule a new one - clearTimeout(refresh_timeout) - refresh_timeout = setTimeout(get_reports, 5000) -} - const get_reports = async () => { loading = true; + // Remove refresh timeout if there is one + clearTimeout(refresh_timeout) + try { const resp = await fetch( window.api_endpoint+ @@ -75,6 +65,8 @@ const get_reports = async () => { } }) }) + + count_ip_reports() } catch (err) { alert(err); } finally { @@ -82,6 +74,74 @@ const get_reports = async () => { } }; +let ip_report_count = {} +const count_ip_reports = () => { + ip_report_count = {} + reports.forEach(v => { + // Count the number of pending reports per IP address + v.reports.forEach(v => { + if (ip_report_count[v.ip_address] === undefined) { + ip_report_count[v.ip_address] = 0 + } + ip_report_count[v.ip_address]++ + }) + }) +} + +const resolve_report = async (report_id, action, report_type) => { + const form = new FormData() + form.append("action", action) + if (action === "grant") { + form.append("type", report_type) + } + + try { + const resp = await fetch( + window.api_endpoint+"/admin/abuse_report/"+report_id, + { method: "POST", body: form } + ); + if(resp.status >= 400) { + throw new Error(resp.text()) + } + + remove_report(report_id) + } catch (err) { + alert(err); + } +} + +const resolve_by_ip = (ip = "", action = "grant") => { + // Find which files were reported by this IP address + reports.forEach(report => { + report.reports.forEach(v => { + if (v.ip_address === ip) { + // We found a file which was reported by the same IP address + resolve_report(report.id, action, v.type) + } + }) + }) +} + +let refresh_timeout = null +const remove_report = (id = "") => { + // Find the report with our ID and remove it from the array + for (let i = 0; i < reports.length; i++) { + if (reports[i].id === id) { + console.debug("removing item", id) + reports.splice(i, 1) + reports = reports + + // Update the report counts per IP address + count_ip_reports() + break + } + } + + // If a refresh is already scheduled we remove it and schedule a new one + clearTimeout(refresh_timeout) + refresh_timeout = setTimeout(get_reports, 5000) +} + onMount(() => { let start = new Date() start.setDate(start.getDate() - 28) @@ -122,8 +182,13 @@ onMount(() => {
- {#each reports as report, i (report.id)} - resolve_report(i)}/> + {#each reports as report (report.id)} + resolve_report(report.id, e.detail.action, e.detail.report_type)} + on:resolve_by_ip={e => resolve_by_ip(e.detail.ip, e.detail.action)} + /> {/each}