mirror of
https://github.com/simstudioai/sim.git
synced 2026-04-06 03:00:16 -04:00
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { randomUUID } from 'crypto'
|
|
import { createLogger } from '@sim/logger'
|
|
import { type NextRequest, NextResponse } from 'next/server'
|
|
import { z } from 'zod'
|
|
import { createRdsClient, executeInsert } from '@/app/api/tools/rds/utils'
|
|
|
|
const logger = createLogger('RDSInsertAPI')
|
|
|
|
const InsertSchema = z.object({
|
|
region: z.string().min(1, 'AWS region is required'),
|
|
accessKeyId: z.string().min(1, 'AWS access key ID is required'),
|
|
secretAccessKey: z.string().min(1, 'AWS secret access key is required'),
|
|
resourceArn: z.string().min(1, 'Resource ARN is required'),
|
|
secretArn: z.string().min(1, 'Secret ARN is required'),
|
|
database: z.string().optional(),
|
|
table: z.string().min(1, 'Table name is required'),
|
|
data: z.record(z.unknown()).refine((obj) => Object.keys(obj).length > 0, {
|
|
message: 'Data object must have at least one field',
|
|
}),
|
|
})
|
|
|
|
export async function POST(request: NextRequest) {
|
|
const requestId = randomUUID().slice(0, 8)
|
|
|
|
try {
|
|
const body = await request.json()
|
|
const params = InsertSchema.parse(body)
|
|
|
|
logger.info(`[${requestId}] Inserting into RDS table ${params.table} in ${params.database}`)
|
|
|
|
const client = createRdsClient({
|
|
region: params.region,
|
|
accessKeyId: params.accessKeyId,
|
|
secretAccessKey: params.secretAccessKey,
|
|
resourceArn: params.resourceArn,
|
|
secretArn: params.secretArn,
|
|
database: params.database,
|
|
})
|
|
|
|
try {
|
|
const result = await executeInsert(
|
|
client,
|
|
params.resourceArn,
|
|
params.secretArn,
|
|
params.database,
|
|
params.table,
|
|
params.data
|
|
)
|
|
|
|
logger.info(`[${requestId}] Insert executed successfully, affected ${result.rowCount} rows`)
|
|
|
|
return NextResponse.json({
|
|
message: `Insert executed successfully. ${result.rowCount} row(s) inserted.`,
|
|
rows: result.rows,
|
|
rowCount: result.rowCount,
|
|
})
|
|
} finally {
|
|
client.destroy()
|
|
}
|
|
} catch (error) {
|
|
if (error instanceof z.ZodError) {
|
|
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
|
|
return NextResponse.json(
|
|
{ error: 'Invalid request data', details: error.errors },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'
|
|
logger.error(`[${requestId}] RDS insert failed:`, error)
|
|
|
|
return NextResponse.json({ error: `RDS insert failed: ${errorMessage}` }, { status: 500 })
|
|
}
|
|
}
|