frontend: add reports list
This commit is contained in:
parent
244c13cd84
commit
29274287a2
4 changed files with 56 additions and 4 deletions
|
@ -12,7 +12,9 @@ import (
|
|||
type Report struct {
|
||||
ID int64 `json:"id"`
|
||||
UserID xid.ID `json:"user_id"`
|
||||
UserName string `json:"user_name"`
|
||||
MemberID *xid.ID `json:"member_id"`
|
||||
MemberName *string `json:"member_name"`
|
||||
Reason string `json:"reason"`
|
||||
ReporterID xid.ID `json:"reporter_id"`
|
||||
|
||||
|
@ -25,7 +27,12 @@ type Report struct {
|
|||
const ReportPageSize = 100
|
||||
|
||||
func (db *DB) Reports(ctx context.Context, closed bool, before int) (rs []Report, err error) {
|
||||
builder := sq.Select("*").From("reports").Limit(ReportPageSize).OrderBy("id DESC")
|
||||
builder := sq.Select("*",
|
||||
"(SELECT username FROM users WHERE id = reports.user_id) AS user_name",
|
||||
"(SELECT name FROM members WHERE id = reports.member_id) AS member_name").
|
||||
From("reports").
|
||||
Limit(ReportPageSize).
|
||||
OrderBy("id DESC")
|
||||
if before != 0 {
|
||||
builder = builder.Where("id < ?", before)
|
||||
}
|
||||
|
|
|
@ -84,7 +84,9 @@ export interface Invite {
|
|||
export interface Report {
|
||||
id: string;
|
||||
user_id: string;
|
||||
user_name: string;
|
||||
member_id: string | null;
|
||||
member_name: string | null;
|
||||
reason: string;
|
||||
reporter_id: string;
|
||||
|
||||
|
|
|
@ -1,5 +1,40 @@
|
|||
<script lang="ts">
|
||||
import { DateTime } from "luxon";
|
||||
import { Button, Card, CardBody, CardFooter, CardHeader } from "sveltestrap";
|
||||
import type { PageData } from "./$types";
|
||||
|
||||
export let data: PageData;
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>Reports - pronouns.cc</title>
|
||||
</svelte:head>
|
||||
|
||||
<div class="container">
|
||||
<h1>Reports</h1>
|
||||
|
||||
<div>
|
||||
{#each data.reports as report}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<strong>#{report.id}</strong> on <a href="/@{report.user_name}">@{report.user_name}</a>
|
||||
({report.user_id}) {#if report.member_id}
|
||||
(member: <a href="/@{report.user_name}/{report.member_name}">{report.member_name}</a>,
|
||||
{report.member_id})
|
||||
{/if}
|
||||
</CardHeader>
|
||||
<CardBody>
|
||||
<blockquote class="blockquote">{report.reason}</blockquote>
|
||||
</CardBody>
|
||||
<CardFooter>
|
||||
Created {DateTime.fromISO(report.created_at)
|
||||
.toLocal()
|
||||
.toLocaleString(DateTime.DATETIME_MED)} •
|
||||
<Button outline color="warning" size="sm">Warn user</Button>
|
||||
<Button outline color="danger" size="sm">Deactivate user</Button>
|
||||
<Button outline color="secondary" size="sm">Ignore report</Button>
|
||||
</CardFooter>
|
||||
</Card>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,9 +1,17 @@
|
|||
import type { Report } from "$lib/api/entities";
|
||||
import { ErrorCode, type APIError, type Report } from "$lib/api/entities";
|
||||
import { apiFetchClient } from "$lib/api/fetch";
|
||||
import { error } from "@sveltejs/kit";
|
||||
|
||||
export const load = async () => {
|
||||
const reports = await apiFetchClient<Report[]>("/admin/reports");
|
||||
return { page: 0, isClosed: false, userId: null, reporterId: null, reports } as PageLoadData;
|
||||
try {
|
||||
const reports = await apiFetchClient<Report[]>("/admin/reports");
|
||||
return { page: 0, isClosed: false, userId: null, reporterId: null, reports } as PageLoadData;
|
||||
} catch (e) {
|
||||
if ((e as APIError).code === ErrorCode.Forbidden) {
|
||||
throw error(400, "You're not an admin");
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
interface PageLoadData {
|
||||
|
|
Loading…
Reference in a new issue