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.enum(['lock', 'unlock', 'pin', 'unpin', 'delete', 'ban', 'unban']).optional(),
34})
35
36// ---------------------------------------------------------------------------
37// Report schemas
38// ---------------------------------------------------------------------------
39
40export const createReportSchema = z.object({
41 targetUri: z.string().min(1),
42 reasonType: z.enum(['spam', 'sexual', 'harassment', 'violation', 'misleading', 'other']),
43 description: z.string().max(1000).optional(),
44})
45
46export const reportQuerySchema = z.object({
47 status: z.enum(['pending', 'resolved']).optional(),
48 cursor: z.string().optional(),
49 limit: z.coerce.number().int().min(1).max(100).default(25),
50})
51
52export const resolveReportSchema = z.object({
53 resolutionType: z.enum(['dismissed', 'warned', 'labeled', 'removed', 'banned']),
54})
55
56// ---------------------------------------------------------------------------
57// Admin moderation schemas
58// ---------------------------------------------------------------------------
59
60export const moderationThresholdsSchema = z.object({
61 autoBlockReportCount: z.number().int().min(1).max(100).optional(),
62 warnThreshold: z.number().int().min(1).max(50).optional(),
63 firstPostQueueCount: z.number().int().min(0).max(50).optional(),
64 newAccountDays: z.number().int().min(0).max(90).optional(),
65 newAccountWriteRatePerMin: z.number().int().min(1).max(30).optional(),
66 establishedWriteRatePerMin: z.number().int().min(1).max(100).optional(),
67 linkHoldEnabled: z.boolean().optional(),
68 topicCreationDelayEnabled: z.boolean().optional(),
69 burstPostCount: z.number().int().min(2).max(50).optional(),
70 burstWindowMinutes: z.number().int().min(1).max(60).optional(),
71 trustedPostThreshold: z.number().int().min(1).max(100).optional(),
72})
73
74export const reportedUsersQuerySchema = z.object({
75 limit: z.coerce.number().int().min(1).max(100).default(25),
76})
77
78// ---------------------------------------------------------------------------
79// Appeal schemas
80// ---------------------------------------------------------------------------
81
82export const appealReportSchema = z.object({
83 reason: z.string().min(1).max(1000),
84})
85
86export const myReportsQuerySchema = z.object({
87 cursor: z.string().optional(),
88 limit: z.coerce.number().int().min(1).max(100).default(25),
89})