From da8500c01ba6f713c87823b9b502cfbcec4b40db Mon Sep 17 00:00:00 2001 From: Jun-te kim Date: Tue, 12 Aug 2025 16:30:25 +0000 Subject: [PATCH] add uri --- .../retrofit-energy-assessments-dev/route.ts | 45 +++++++++++++++++++ .../[propertyId]/documents/UploadModal.tsx | 19 ++++---- 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/app/api/upload/retrofit-energy-assessments-dev/route.ts diff --git a/src/app/api/upload/retrofit-energy-assessments-dev/route.ts b/src/app/api/upload/retrofit-energy-assessments-dev/route.ts new file mode 100644 index 00000000..bd5e69d2 --- /dev/null +++ b/src/app/api/upload/retrofit-energy-assessments-dev/route.ts @@ -0,0 +1,45 @@ +import { NextRequest, NextResponse } from "next/server"; +import { z } from "zod"; +import { createS3Client, presignGetUrl } from "@/app/utils/s3"; + +const Schema = z.object({ + path: z.string(), + expiresInSeconds: z.number().int().positive().default(300), + responseContentType: z.string().optional(), + responseContentDisposition: z.string().optional(), // e.g., 'attachment; filename="file.csv"' +}); + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const { path, expiresInSeconds, responseContentType, responseContentDisposition } = + Schema.parse(body); + + // Retrofit s3 bucket connection + let bucket = process.env.RETROFIT_ENERGY_ASSESSMENTS_BUCKET + if (!bucket) { + return NextResponse.json({ msg: "RETROFIT_ENERGY_ASSESSMENTS_BUCKET is not set" }, { status: 400 }); + } + + const s3 = createS3Client({ + region: process.env.PRESIGN_AWS_REGION, + accessKeyId: process.env.RETROFIT_ENERGY_ASSESSMENTS_AWS_ACCESS_KEY, + secretAccessKey: process.env.RETROFIT_ENERGY_ASSESSMENTS_AWS_ACCESS_KEY, + }); + + const url = await presignGetUrl(s3, { + bucket, + key: path, + expiresInSeconds, + responseContentType, + responseContentDisposition, + }); + + return NextResponse.json({ url }); + } catch (err) { + console.error(err); + return err instanceof z.ZodError + ? NextResponse.json({ msg: "Invalid input", issues: err.issues }, { status: 400 }) + : NextResponse.json({ msg: "Internal server error" }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/portfolio/[slug]/building-passport/[propertyId]/documents/UploadModal.tsx b/src/app/portfolio/[slug]/building-passport/[propertyId]/documents/UploadModal.tsx index 9b4b5156..ba10c97b 100644 --- a/src/app/portfolio/[slug]/building-passport/[propertyId]/documents/UploadModal.tsx +++ b/src/app/portfolio/[slug]/building-passport/[propertyId]/documents/UploadModal.tsx @@ -25,19 +25,20 @@ const titles: Record = { }; async function generatePresignedUrls({ - key, - bucket, + path, contentType, expiresInSeconds, }: { - key: string; - bucket: string; + path: string; contentType: string; expiresInSeconds: number; }) { - const body = JSON.stringify({ key, bucket, contentType, expiresInSeconds }); - console.log("bucket is ", bucket); - const presignedResponse = await fetch("/api/upload/s3_bucket_presigned_url", { + const body = JSON.stringify({ + path: path, + responseContentType: contentType, + expiresInSeconds: expiresInSeconds + }); + const presignedResponse = await fetch("/api/upload/retrofit-energy-assessments-dev", { method: "POST", body, }); @@ -62,9 +63,7 @@ export const UploadModal = ({ console.log("Get Presigned url in a specific bucket location") const { url } = await generatePresignedUrls({ - key: "foo/test/trololol", // path in bucket - bucket: process.env.RETROFIT_ENERGY_ASSESSMENTS_BUCKET || "back up", //s3 bucket location - // bucket: "retrofit-energy-assessments-dev", //s3 bucket location + path: "foo/test/trololol", // path in bucket contentType: "application/pdf", expiresInSeconds: 5 * 60, });