1- "use server" ;
2-
1+ import { z } from "zod" ;
32import { getVercelEnv } from "@/utils/vercel" ;
43
5- interface FeedbackData {
6- rating : number ;
7- feedback : string ;
4+ type SupportFeedbackInput = {
85 ticketId : string ;
6+ rating : number ;
7+ feedback ?: string ;
98 teamId ?: string ;
10- }
9+ } ;
10+
11+ const SupportFeedbackSchema = z . object ( {
12+ ticketId : z . string ( ) . min ( 1 , "Missing ticketId" ) ,
13+ rating : z . number ( ) . int ( ) . min ( 1 ) . max ( 5 ) ,
14+ feedback : z . string ( ) . trim ( ) . max ( 1000 ) . optional ( ) . default ( "" ) ,
15+ teamId : z . string ( ) . optional ( ) ,
16+ } ) ;
1117
1218export async function submitSupportFeedback (
13- data : FeedbackData ,
19+ data : SupportFeedbackInput ,
1420) : Promise < { success : true } | { error : string } > {
21+ "use server" ;
22+
23+ const parsed = SupportFeedbackSchema . safeParse ( data ) ;
24+ if ( ! parsed . success ) {
25+ return { error : parsed . error . issues . map ( ( i ) => i . message ) . join ( ", " ) } ;
26+ }
27+ const input = parsed . data ;
28+
1529 try {
1630 const apiKey = process . env . NEXT_PUBLIC_DASHBOARD_CLIENT_ID ;
1731 if ( ! apiKey ) {
@@ -31,9 +45,9 @@ export async function submitSupportFeedback(
3145 "x-service-api-key" : apiKey ,
3246 } ,
3347 body : JSON . stringify ( {
34- rating : data . rating ,
35- feedback : data . feedback ,
36- ticket_id : data . ticketId ,
48+ rating : input . rating ,
49+ feedback : input . feedback ,
50+ ticket_id : input . ticketId ,
3751 } ) ,
3852 } ) ;
3953
@@ -46,8 +60,8 @@ export async function submitSupportFeedback(
4660 console . debug (
4761 "CSAT endpoint not available; treating as success in preview/dev" ,
4862 {
49- rating : data . rating ,
50- ticket_id : data . ticketId ,
63+ rating : input . rating ,
64+ ticket_id : input . ticketId ,
5165 vercel_env : vercelEnv ,
5266 } ,
5367 ) ;
0 commit comments