diff --git a/apps/portal/package.json b/apps/portal/package.json index de2e83a0..88ad7dfd 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -34,7 +34,6 @@ "react-pdf": "^5.7.2", "react-query": "^3.39.2", "superjson": "^1.10.0", - "uuid": "^9.0.0", "zod": "^3.18.0" }, "devDependencies": { @@ -45,7 +44,6 @@ "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", "@types/react-pdf": "^5.7.2", - "@types/uuid": "^8.3.4", "autoprefixer": "^10.4.12", "postcss": "^8.4.16", "prettier-plugin-tailwindcss": "^0.1.13", diff --git a/apps/portal/src/pages/api/file-storage.ts b/apps/portal/src/pages/api/file-storage.ts index 66888e1a..36750cfe 100644 --- a/apps/portal/src/pages/api/file-storage.ts +++ b/apps/portal/src/pages/api/file-storage.ts @@ -1,11 +1,13 @@ import axios from 'axios'; -import { formidable } from 'formidable'; +import formidable from 'formidable'; +import * as fs from 'fs'; import type { NextApiRequest, NextApiResponse } from 'next'; -import { v4 as uuidv4 } from 'uuid'; import { env } from '~/env/server.mjs'; +import { supabase } from '~/utils/supabase'; const BASE_URL = `${env.SUPABASE_URL}/storage/v1/object`; +const BASE_FILE_URL = `${BASE_URL}/public`; export const config = { api: { @@ -17,33 +19,26 @@ export default async function handler( req: NextApiRequest, res: NextApiResponse, ) { - const headers = { - 'Content-Type': 'multipart/form-data', - apiKey: env.SUPABASE_ANON_KEY, - authorization: 'Bearer ' + env.SUPABASE_ANON_KEY, - }; - if (req.method === 'POST') { try { - const form = formidable({ multiples: false }); + const form = formidable({ keepExtensions: true }); form.parse(req, async (err, fields, files) => { if (err) { throw err; } - const { file } = files; - const actualFile = file instanceof Array ? file[0] : file; - const filePath = `${uuidv4()}-${actualFile.originalFilename}`; + const { key } = fields; + const { file } = files; + + const parsedFile: formidable.File = + file instanceof Array ? file[0] : file; + const filePath = `${Date.now()}-${parsedFile.originalFilename}`; + const convertedFile = fs.readFileSync(parsedFile.filepath); + + supabase.storage.from(key as string).upload(filePath, convertedFile); - const data = await axios.post( - `${BASE_URL}/${key}/${filePath}`, - actualFile, - { - headers, - }, - ); return res.status(200).json({ - url: data.data.key, + url: `${BASE_FILE_URL}/${key}/${filePath}`, }); }); } catch (error: unknown) { diff --git a/apps/portal/src/pages/resumes/submit.tsx b/apps/portal/src/pages/resumes/submit.tsx index affb06e1..dd22c7da 100644 --- a/apps/portal/src/pages/resumes/submit.tsx +++ b/apps/portal/src/pages/resumes/submit.tsx @@ -71,7 +71,7 @@ export default function SubmitResumeForm() { ...data, url, }); - // Router.push('/resumes'); + router.push('/resumes'); reset(); }; diff --git a/apps/portal/src/utils/supabase.ts b/apps/portal/src/utils/supabase.ts new file mode 100644 index 00000000..69dd33a4 --- /dev/null +++ b/apps/portal/src/utils/supabase.ts @@ -0,0 +1,9 @@ +import { createClient } from '@supabase/supabase-js'; + +import { env } from '~/env/server.mjs'; + +const { SUPABASE_URL } = env; +const { SUPABASE_ANON_KEY } = env; + +// Create a single supabase client for interacting with your database +export const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);