From 5441fa6598f9b93e2545a06f1bdc6960afe0aff6 Mon Sep 17 00:00:00 2001 From: BalajiSriraman Date: Tue, 4 Mar 2025 23:25:05 +0530 Subject: [PATCH 1/2] Refactor file and image API endpoints to consolidate file management --- .../api/{images => files}/[pathname].delete.ts | 0 .../api/{fileupload => files}/[pathname].get.ts | 0 .../server/api/{fileupload => files}/index.get.ts | 0 .../server/api/{fileupload => files}/index.post.ts | 0 apps/server/server/api/images/[pathname].get.ts | 9 --------- apps/server/server/api/images/index.get.ts | 7 ------- apps/server/server/api/images/upload.post.ts | 13 ------------- apps/server/server/routes/images/[pathname].get.ts | 9 --------- 8 files changed, 38 deletions(-) rename apps/server/server/api/{images => files}/[pathname].delete.ts (100%) rename apps/server/server/api/{fileupload => files}/[pathname].get.ts (100%) rename apps/server/server/api/{fileupload => files}/index.get.ts (100%) rename apps/server/server/api/{fileupload => files}/index.post.ts (100%) delete mode 100644 apps/server/server/api/images/[pathname].get.ts delete mode 100644 apps/server/server/api/images/index.get.ts delete mode 100644 apps/server/server/api/images/upload.post.ts delete mode 100644 apps/server/server/routes/images/[pathname].get.ts diff --git a/apps/server/server/api/images/[pathname].delete.ts b/apps/server/server/api/files/[pathname].delete.ts similarity index 100% rename from apps/server/server/api/images/[pathname].delete.ts rename to apps/server/server/api/files/[pathname].delete.ts diff --git a/apps/server/server/api/fileupload/[pathname].get.ts b/apps/server/server/api/files/[pathname].get.ts similarity index 100% rename from apps/server/server/api/fileupload/[pathname].get.ts rename to apps/server/server/api/files/[pathname].get.ts diff --git a/apps/server/server/api/fileupload/index.get.ts b/apps/server/server/api/files/index.get.ts similarity index 100% rename from apps/server/server/api/fileupload/index.get.ts rename to apps/server/server/api/files/index.get.ts diff --git a/apps/server/server/api/fileupload/index.post.ts b/apps/server/server/api/files/index.post.ts similarity index 100% rename from apps/server/server/api/fileupload/index.post.ts rename to apps/server/server/api/files/index.post.ts diff --git a/apps/server/server/api/images/[pathname].get.ts b/apps/server/server/api/images/[pathname].get.ts deleted file mode 100644 index e4b33b2..0000000 --- a/apps/server/server/api/images/[pathname].get.ts +++ /dev/null @@ -1,9 +0,0 @@ -import z from 'zod' - -export default eventHandler(async (event) => { - const { pathname } = await getValidatedRouterParams(event, z.object({ - pathname: z.string().min(1) - }).parse) - - return hubBlob().serve(event, pathname) -}) diff --git a/apps/server/server/api/images/index.get.ts b/apps/server/server/api/images/index.get.ts deleted file mode 100644 index ff34b7d..0000000 --- a/apps/server/server/api/images/index.get.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default eventHandler(async () => { - const { blobs } = await hubBlob().list({ - limit: 1000 - }) - - return blobs -}) diff --git a/apps/server/server/api/images/upload.post.ts b/apps/server/server/api/images/upload.post.ts deleted file mode 100644 index a84723b..0000000 --- a/apps/server/server/api/images/upload.post.ts +++ /dev/null @@ -1,13 +0,0 @@ -export default eventHandler(async (event) => { - // https://hub.nuxt.com/docs/storage/blob#handleupload - return hubBlob().handleUpload(event, { - multiple: false, - put: { - // addRandomSuffix: true, - }, - ensure: { - maxSize: "8MB", - // types: ['image/jpeg', 'image/png', 'image/gif', 'image/heic', 'image/webp'] - }, - }); -}); diff --git a/apps/server/server/routes/images/[pathname].get.ts b/apps/server/server/routes/images/[pathname].get.ts deleted file mode 100644 index 2590041..0000000 --- a/apps/server/server/routes/images/[pathname].get.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from 'zod' - -export default eventHandler(async (event) => { - const { pathname } = await getValidatedRouterParams(event, z.object({ - pathname: z.string().min(1) - }).parse) - - return hubBlob().serve(event, pathname) -}) From f55305ac240ad886bbde8fb7cd39211a11ee8aaf Mon Sep 17 00:00:00 2001 From: BalajiSriraman Date: Tue, 4 Mar 2025 23:27:10 +0530 Subject: [PATCH 2/2] Enhance file management and upload functionality --- apps/server/app/app.config.ts | 80 +++++----- apps/server/app/components/FileUploader.vue | 141 ++++++++++++++++++ apps/server/app/pages/index.vue | 139 +++++++++++++---- apps/server/app/pages/upload.vue | 113 +------------- apps/server/nuxt.config.ts | 2 +- .../server/server/api/files/[pathname].get.ts | 18 ++- 6 files changed, 309 insertions(+), 184 deletions(-) create mode 100644 apps/server/app/components/FileUploader.vue diff --git a/apps/server/app/app.config.ts b/apps/server/app/app.config.ts index ef9ad46..9871969 100644 --- a/apps/server/app/app.config.ts +++ b/apps/server/app/app.config.ts @@ -1,41 +1,41 @@ export default defineAppConfig({ - ui: { - primary: 'white', - gray: 'zinc', - button: { - color: { - gray: { - ghost: 'text-gray-400 bg-gray-900 ring-1 ring-gray-400 rounded-full hover:ring-gray-200 hover:text-gray-200 hover:bg-gray-900 transition-hover duration-200' - }, - green: { - ghost: 'text-green-400 bg-gray-900 ring-1 ring-green-400 rounded-full hover:ring-green-300 hover:text-green-300 hover:bg-gray-900 transition-hover duration-200' - }, - red: { - ghost: 'text-red-400 bg-gray-900 ring-1 ring-red-400 rounded-full hover:ring-red-300 hover:text-red-300 hover:bg-gray-900 transition-hover duration-200' - } - } - }, - tooltip: { - background: 'bg-gray-900', - color: 'text-gray-200', - ring: 'ring-1 ring-gray-800' - }, - slideover: { - background: '', - base: 'flex-1 flex flex-col w-full focus:outline-none', - overlay: { - background: 'bg-gray-200/75 dark:bg-gray-800/50 backdrop-blur-md' - } - }, - range: { - thumb: { - color: 'dark:text-gray-100' - }, - progress: { - color: 'dark:text-gray-100', - rounded: 'rounded-s-lg', - background: 'bg-gray-500 dark:bg-gray-100' - } - } - } -}) + // ui: { + // primary: 'white', + // gray: 'zinc', + // button: { + // color: { + // gray: { + // ghost: 'text-gray-400 bg-gray-900 ring-1 ring-gray-400 rounded-full hover:ring-gray-200 hover:text-gray-200 hover:bg-gray-900 transition-hover duration-200' + // }, + // green: { + // ghost: 'text-green-400 bg-gray-900 ring-1 ring-green-400 rounded-full hover:ring-green-300 hover:text-green-300 hover:bg-gray-900 transition-hover duration-200' + // }, + // red: { + // ghost: 'text-red-400 bg-gray-900 ring-1 ring-red-400 rounded-full hover:ring-red-300 hover:text-red-300 hover:bg-gray-900 transition-hover duration-200' + // } + // } + // }, + // tooltip: { + // background: 'bg-gray-900', + // color: 'text-gray-200', + // ring: 'ring-1 ring-gray-800' + // }, + // slideover: { + // background: '', + // base: 'flex-1 flex flex-col w-full focus:outline-none', + // overlay: { + // background: 'bg-gray-200/75 dark:bg-gray-800/50 backdrop-blur-md' + // } + // }, + // range: { + // thumb: { + // color: 'dark:text-gray-100' + // }, + // progress: { + // color: 'dark:text-gray-100', + // rounded: 'rounded-s-lg', + // background: 'bg-gray-500 dark:bg-gray-100' + // } + // } + // } +}); diff --git a/apps/server/app/components/FileUploader.vue b/apps/server/app/components/FileUploader.vue new file mode 100644 index 0000000..595d628 --- /dev/null +++ b/apps/server/app/components/FileUploader.vue @@ -0,0 +1,141 @@ + + diff --git a/apps/server/app/pages/index.vue b/apps/server/app/pages/index.vue index 5a0150d..0c6dacd 100644 --- a/apps/server/app/pages/index.vue +++ b/apps/server/app/pages/index.vue @@ -1,41 +1,81 @@ diff --git a/apps/server/nuxt.config.ts b/apps/server/nuxt.config.ts index 6169700..891a41e 100644 --- a/apps/server/nuxt.config.ts +++ b/apps/server/nuxt.config.ts @@ -12,7 +12,7 @@ export default defineNuxtConfig({ // }, // }, routeRules: { - '/api/*': { + "/api/*": { cors: true, }, }, diff --git a/apps/server/server/api/files/[pathname].get.ts b/apps/server/server/api/files/[pathname].get.ts index e4b33b2..8562a52 100644 --- a/apps/server/server/api/files/[pathname].get.ts +++ b/apps/server/server/api/files/[pathname].get.ts @@ -1,9 +1,15 @@ -import z from 'zod' +import z from "zod"; export default eventHandler(async (event) => { - const { pathname } = await getValidatedRouterParams(event, z.object({ - pathname: z.string().min(1) - }).parse) + const { pathname } = await getValidatedRouterParams( + event, + z.object({ + pathname: z.string().min(1), + }).parse + ); - return hubBlob().serve(event, pathname) -}) + // Set Content-Disposition header to trigger file download + // setHeader(event, "Content-Disposition", `inline;filename=${pathname}`); + + return hubBlob().serve(event, pathname); +});