|
1 | 1 | import { NextRequest, NextResponse } from 'next/server' |
2 | 2 | import { createClient } from '@/lib/supabase/server' |
| 3 | +import { sendEmail, getStatusUpdateEmail } from '@/lib/email/support-emails' |
3 | 4 |
|
4 | 5 | // GET single ticket |
5 | 6 | export async function GET( |
@@ -108,34 +109,79 @@ export async function PATCH( |
108 | 109 | return NextResponse.json({ error: 'Forbidden' }, { status: 403 }) |
109 | 110 | } |
110 | 111 |
|
111 | | - const { status } = await request.json() |
| 112 | + const { status: newStatus } = await request.json() |
112 | 113 |
|
113 | | - if (!status) { |
| 114 | + if (!newStatus) { |
114 | 115 | return NextResponse.json({ error: 'Status is required' }, { status: 400 }) |
115 | 116 | } |
116 | 117 |
|
117 | 118 | const validStatuses = ['open', 'in_progress', 'resolved', 'closed'] |
118 | | - if (!validStatuses.includes(status)) { |
| 119 | + if (!validStatuses.includes(newStatus)) { |
119 | 120 | return NextResponse.json({ error: 'Invalid status' }, { status: 400 }) |
120 | 121 | } |
121 | 122 |
|
| 123 | + // Get current ticket to check old status |
| 124 | + const { data: currentTicket, error: currentTicketError } = await supabase |
| 125 | + .from('support_tickets') |
| 126 | + .select('status, user_id, subject') |
| 127 | + .eq('id', id) |
| 128 | + .single() |
| 129 | + |
| 130 | + if (currentTicketError) { |
| 131 | + console.error('Error fetching current ticket:', currentTicketError) |
| 132 | + return NextResponse.json({ error: 'Ticket not found' }, { status: 404 }) |
| 133 | + } |
| 134 | + |
| 135 | + const oldStatus = currentTicket.status |
| 136 | + |
122 | 137 | // Update ticket status |
123 | | - const { data: ticket, error } = await supabase |
| 138 | + const { data: updatedTicket, error: updateError } = await supabase |
124 | 139 | .from('support_tickets') |
125 | 140 | .update({ |
126 | | - status, |
| 141 | + status: newStatus, |
127 | 142 | updated_at: new Date().toISOString() |
128 | 143 | }) |
129 | 144 | .eq('id', id) |
130 | 145 | .select() |
131 | 146 | .single() |
132 | 147 |
|
133 | | - if (error) { |
134 | | - console.error('Error updating ticket:', error) |
| 148 | + if (updateError) { |
| 149 | + console.error('Error updating ticket:', updateError) |
135 | 150 | return NextResponse.json({ error: 'Failed to update ticket' }, { status: 500 }) |
136 | 151 | } |
137 | 152 |
|
138 | | - return NextResponse.json({ ticket, success: true }) |
| 153 | + // Send email notification if status has changed |
| 154 | + if (newStatus !== oldStatus) { |
| 155 | + try { |
| 156 | + const { data: userProfile } = await supabase |
| 157 | + .from('profiles') |
| 158 | + .select('email, first_name') |
| 159 | + .eq('id', currentTicket.user_id) |
| 160 | + .single() |
| 161 | + |
| 162 | + if (userProfile?.email) { |
| 163 | + const userName = userProfile.first_name || 'User' |
| 164 | + const { subject, html } = getStatusUpdateEmail({ |
| 165 | + userName, |
| 166 | + ticketId: id, |
| 167 | + subject: currentTicket.subject, |
| 168 | + oldStatus, |
| 169 | + newStatus, |
| 170 | + }) |
| 171 | + |
| 172 | + await sendEmail({ |
| 173 | + to: userProfile.email, |
| 174 | + subject, |
| 175 | + html, |
| 176 | + }) |
| 177 | + } |
| 178 | + } catch (emailError) { |
| 179 | + console.error('Failed to send status update email:', emailError) |
| 180 | + // Do not fail the request if email fails, just log it |
| 181 | + } |
| 182 | + } |
| 183 | + |
| 184 | + return NextResponse.json({ ticket: updatedTicket, success: true }) |
139 | 185 | } catch (error) { |
140 | 186 | console.error('Error in PATCH ticket:', error) |
141 | 187 | return NextResponse.json({ error: 'Internal server error' }, { status: 500 }) |
|
0 commit comments