@@ -9,6 +9,7 @@ import { DialogContent, DialogFooter, DialogTitle } from "~/components/ui/dialog
99import { Dialog } from "~/components/ui/dialog" ;
1010import { useState , useEffect } from "react" ;
1111import type { OutletContext } from "./user.detail" ;
12+ import { createProtectedAction } from "~/lib/secureRoute" ;
1213
1314const banSchema = z . object ( {
1415 banReason : z . string ( ) . min ( 1 , "Ban reason is required" ) . max ( 500 , "Ban reason is too long" ) ,
@@ -26,42 +27,47 @@ const banSchema = z.object({
2627 ) ,
2728} ) ;
2829
29- export async function action ( { request, params } : { request : Request ; params : { id : string } } ) {
30- try {
31- const formData = await request . formData ( ) ;
32- const banData = {
33- banReason : formData . get ( "banReason" ) as string ,
34- banExpires : formData . get ( "banExpires" ) as string ,
35- } ;
30+ export const action = createProtectedAction ( {
31+ paramValidation : z . object ( {
32+ id : z . string ( ) ,
33+ } ) ,
34+ function : async ( { request, params } ) => {
35+ try {
36+ const formData = await request . formData ( ) ;
37+ const banData = {
38+ banReason : formData . get ( "banReason" ) as string ,
39+ banExpires : formData . get ( "banExpires" ) as string ,
40+ } ;
3641
37- const validatedData = banSchema . parse ( banData ) ;
42+ const validatedData = banSchema . parse ( banData ) ;
3843
39- // Calculate ban duration in seconds
40- const banExpiresIn = validatedData . banExpires
41- ? Math . floor ( ( new Date ( validatedData . banExpires ) . getTime ( ) - Date . now ( ) ) / 1000 )
42- : undefined ;
44+ // Calculate ban duration in seconds
45+ const banExpiresIn = validatedData . banExpires
46+ ? Math . floor ( ( new Date ( validatedData . banExpires ) . getTime ( ) - Date . now ( ) ) / 1000 )
47+ : undefined ;
4348
44- await auth . api . banUser ( {
45- headers : request . headers ,
46- body : {
47- userId : params . id ,
48- banReason : validatedData . banReason ,
49- banExpiresIn,
50- } ,
51- } ) ;
49+ await auth . api . banUser ( {
50+ headers : request . headers ,
51+ body : {
52+ userId : params . id ,
53+ banReason : validatedData . banReason ,
54+ banExpiresIn,
55+ } ,
56+ } ) ;
5257
53- return { success : true , message : "User banned successfully" } ;
54- } catch ( error ) {
55- if ( error instanceof z . ZodError ) {
56- return {
57- success : false ,
58- error : "Validation failed" ,
59- fieldErrors : error . flatten ( ) . fieldErrors ,
60- } ;
58+ return { success : true , message : "User banned successfully" } ;
59+ } catch ( error ) {
60+ if ( error instanceof z . ZodError ) {
61+ return {
62+ success : false ,
63+ error : "Validation failed" ,
64+ fieldErrors : error . flatten ( ) . fieldErrors ,
65+ } ;
66+ }
67+ return { success : false , error : "Failed to ban user" } ;
6168 }
62- return { success : false , error : "Failed to ban user" } ;
63- }
64- }
69+ } ,
70+ } ) ;
6571
6672export default function UserBanPage ( ) {
6773 const { user } = useOutletContext < OutletContext > ( ) ;
0 commit comments