Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import { z } from "zod";
- import { S3Client } from "@aws-sdk/client-s3";
- import { createPresignedPost } from "@aws-sdk/s3-presigned-post";
- import { env } from "~/env";
- import { newQrn } from "~/lib/qrn";
- import {
- createTRPCRouter,
- protectedProcedure,
- publicProcedure,
- } from "~/server/api/trpc";
- export const filesRouter = createTRPCRouter({
- getUploadUrls: publicProcedure
- .input(
- z.object({
- productId: z.string().min(1),
- files: z
- .object({
- name: z.string(),
- key: z.string().nullish(),
- size: z.number(),
- })
- .array(),
- }),
- )
- .query(async ({ input }) => {
- const s3 = new S3Client({ region: env.AWS_REGION });
- const MAX_FILE_SIZE = 8 * 50 * 1024 * 1024; // 50MB
- const presignedUrls = await Promise.allSettled(
- input.files.map(async (file) => {
- if (file.size > MAX_FILE_SIZE || !file.key) {
- return {
- name: file.name,
- key: file.key ?? "",
- url: null,
- s3Key: null,
- error: "Unknown error in file type or unknown key",
- };
- }
- try {
- const qrn = newQrn({
- identity: "qetkra",
- resource: "file",
- name: file.key,
- });
- const objectKey = input.productId + "/" + qrn;
- const { url, fields } = await createPresignedPost(s3, {
- Bucket: env.PRODUCT_FILES_BUCKET,
- Key: objectKey,
- Expires: 60 * 10, // 10 mins
- Conditions: [["content-length-range", 0, MAX_FILE_SIZE]],
- });
- return {
- name: file.name,
- key: file.key,
- url: url,
- s3Key: objectKey,
- fields: {},
- };
- } catch (error) {
- console.log(error);
- return {
- name: file.name,
- key: file.key,
- url: null,
- s3Key: null,
- error: "Error in url generation",
- };
- }
- }),
- );
- return presignedUrls;
- }),
- });
Advertisement
Add Comment
Please, Sign In to add comment