Barazo AppView backend barazo.forum
at main 104 lines 3.4 kB view raw
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})