Barazo AppView backend
barazo.forum
1import { z } from 'zod'
2
3// ---------------------------------------------------------------------------
4// Moderation action schemas
5// ---------------------------------------------------------------------------
6
7export const lockTopicSchema = z.object({
8 reason: z.string().max(500).optional(),
9})
10
11export const pinTopicSchema = z.object({
12 reason: z.string().max(500).optional(),
13 scope: z.enum(['category', 'forum']).default('category'),
14})
15
16export const modDeleteSchema = z.object({
17 reason: z.string().min(1).max(500),
18})
19
20export const banUserSchema = z.object({
21 did: z.string().min(1),
22 reason: z.string().min(1).max(500),
23})
24
25export const unbanUserSchema = z.object({
26 did: z.string().min(1),
27 reason: z.string().max(500).optional(),
28})
29
30export const moderationLogQuerySchema = z.object({
31 cursor: z.string().optional(),
32 limit: z.coerce.number().int().min(1).max(100).default(25),
33 action: z
34 .enum([
35 'lock',
36 'unlock',
37 'pin',
38 'unpin',
39 'delete',
40 'ban',
41 'unban',
42 'note_created',
43 'note_deleted',
44 'warning_issued',
45 'notice_added',
46 'notice_removed',
47 ])
48 .optional(),
49})
50
51// ---------------------------------------------------------------------------
52// Report schemas
53// ---------------------------------------------------------------------------
54
55export const createReportSchema = z.object({
56 targetUri: z.string().min(1),
57 reasonType: z.enum(['spam', 'sexual', 'harassment', 'violation', 'misleading', 'other']),
58 description: z.string().max(1000).optional(),
59})
60
61export const reportQuerySchema = z.object({
62 status: z.enum(['pending', 'resolved']).optional(),
63 cursor: z.string().optional(),
64 limit: z.coerce.number().int().min(1).max(100).default(25),
65})
66
67export const resolveReportSchema = z.object({
68 resolutionType: z.enum(['dismissed', 'warned', 'labeled', 'removed', 'banned']),
69})
70
71// ---------------------------------------------------------------------------
72// Admin moderation schemas
73// ---------------------------------------------------------------------------
74
75export const moderationThresholdsSchema = z.object({
76 autoBlockReportCount: z.number().int().min(1).max(100).optional(),
77 warnThreshold: z.number().int().min(1).max(50).optional(),
78 firstPostQueueCount: z.number().int().min(0).max(50).optional(),
79 newAccountDays: z.number().int().min(0).max(90).optional(),
80 newAccountWriteRatePerMin: z.number().int().min(1).max(30).optional(),
81 establishedWriteRatePerMin: z.number().int().min(1).max(100).optional(),
82 linkHoldEnabled: z.boolean().optional(),
83 topicCreationDelayEnabled: z.boolean().optional(),
84 burstPostCount: z.number().int().min(2).max(50).optional(),
85 burstWindowMinutes: z.number().int().min(1).max(60).optional(),
86 trustedPostThreshold: z.number().int().min(1).max(100).optional(),
87})
88
89export const reportedUsersQuerySchema = z.object({
90 limit: z.coerce.number().int().min(1).max(100).default(25),
91})
92
93// ---------------------------------------------------------------------------
94// Appeal schemas
95// ---------------------------------------------------------------------------
96
97export const appealReportSchema = z.object({
98 reason: z.string().min(1).max(1000),
99})
100
101export const myReportsQuerySchema = z.object({
102 cursor: z.string().optional(),
103 limit: z.coerce.number().int().min(1).max(100).default(25),
104})