Skip to main content

Route Handlers

Route Handlers in JetShip provide a way to create custom API endpoints using Next.js App Router. This guide explains how to effectively implement and use route handlers in your JetShip application.

Overview

Route Handlers allow you to:

  • Create custom API endpoints
  • Handle webhooks
  • Process form submissions
  • Manage authentication flows
  • Serve dynamic data

Basic Implementation

Create a route handler by adding a route.ts file in your app directory:

// app/api/hello/route.ts
import { NextResponse } from 'next/server'

export async function GET(request: Request) {
return NextResponse.json({ message: 'Hello from JetShip!' })
}

HTTP Methods

JetShip route handlers support all standard HTTP methods:

import { NextResponse } from 'next/server'

export async function GET(request: Request) {
// Handle GET requests
}

export async function POST(request: Request) {
// Handle POST requests
}

export async function PUT(request: Request) {
// Handle PUT requests
}

export async function DELETE(request: Request) {
// Handle DELETE requests
}

export async function PATCH(request: Request) {
// Handle PATCH requests
}

Request Handling

URL Parameters

Access URL parameters and search params:

export async function GET(request: Request, { params }: { params: { id: string } }) {
const { searchParams } = new URL(request.url)
const query = searchParams.get('query')

return NextResponse.json({ id: params.id, query })
}

Webhook Handlers

Example of a webhook handler for payment providers:

// app/api/webhook/route.ts
import { headers } from 'next/headers'
import { NextResponse } from 'next/server'
import { createServiceRoleClient } from '@repo/supabase/server'

export async function POST(request: Request) {
try {
const body = await request.json()
const headersList = headers()
const signature = headersList.get('stripe-signature')

// Verify webhook signature
if (!signature) {
return NextResponse.json({ error: 'No signature provided' }, { status: 401 })
}

// Process webhook event
const supabase = createServiceRoleClient()
await processWebhookEvent(body, supabase)

return NextResponse.json({ received: true })
} catch (error) {
console.error('Webhook error:', error)

return NextResponse.json({ error: 'Webhook handler failed' }, { status: 400 })
}
}

Response Handling

JSON Responses

export async function GET() {
return NextResponse.json({
data: {
/* your data */
},
message: 'Success'
})
}

Redirects

export async function POST() {
return NextResponse.redirect(new URL('/success', request.url))
}

Custom Headers

export async function GET() {
return new NextResponse('Hello', {
status: 200,
headers: {
'Content-Type': 'text/plain',
'Cache-Control': 'no-cache, no-store'
}
})
}