Barazo AppView backend barazo.forum
at main 89 lines 3.2 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.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})