Guest User

Untitled

a guest
Apr 25th, 2025
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { z } from "zod";
  2. import { S3Client } from "@aws-sdk/client-s3";
  3. import { createPresignedPost } from "@aws-sdk/s3-presigned-post";
  4. import { env } from "~/env";
  5. import { newQrn } from "~/lib/qrn";
  6.  
  7. import {
  8.   createTRPCRouter,
  9.   protectedProcedure,
  10.   publicProcedure,
  11. } from "~/server/api/trpc";
  12.  
  13. export const filesRouter = createTRPCRouter({
  14.   getUploadUrls: publicProcedure
  15.     .input(
  16.       z.object({
  17.         productId: z.string().min(1),
  18.         files: z
  19.           .object({
  20.             name: z.string(),
  21.             key: z.string().nullish(),
  22.             size: z.number(),
  23.           })
  24.           .array(),
  25.       }),
  26.     )
  27.     .query(async ({ input }) => {
  28.       const s3 = new S3Client({ region: env.AWS_REGION });
  29.       const MAX_FILE_SIZE = 8 * 50 * 1024 * 1024; // 50MB
  30.  
  31.       const presignedUrls = await Promise.allSettled(
  32.         input.files.map(async (file) => {
  33.           if (file.size > MAX_FILE_SIZE || !file.key) {
  34.             return {
  35.               name: file.name,
  36.               key: file.key ?? "",
  37.               url: null,
  38.               s3Key: null,
  39.               error: "Unknown error in file type or unknown key",
  40.             };
  41.           }
  42.  
  43.           try {
  44.             const qrn = newQrn({
  45.               identity: "qetkra",
  46.               resource: "file",
  47.               name: file.key,
  48.             });
  49.             const objectKey = input.productId + "/" + qrn;
  50.             const { url, fields } = await createPresignedPost(s3, {
  51.               Bucket: env.PRODUCT_FILES_BUCKET,
  52.               Key: objectKey,
  53.               Expires: 60 * 10, // 10 mins
  54.               Conditions: [["content-length-range", 0, MAX_FILE_SIZE]],
  55.             });
  56.             return {
  57.               name: file.name,
  58.               key: file.key,
  59.               url: url,
  60.               s3Key: objectKey,
  61.               fields: {},
  62.             };
  63.           } catch (error) {
  64.             console.log(error);
  65.  
  66.             return {
  67.               name: file.name,
  68.               key: file.key,
  69.               url: null,
  70.               s3Key: null,
  71.               error: "Error in url generation",
  72.             };
  73.           }
  74.         }),
  75.       );
  76.  
  77.       return presignedUrls;
  78.     }),
  79. });
  80.  
Advertisement
Add Comment
Please, Sign In to add comment