From 0b72ced8d60d332b8f2889c1866ac42557edf2f6 Mon Sep 17 00:00:00 2001 From: oiov Date: Sat, 12 Jul 2025 16:31:30 +0800 Subject: [PATCH] refact file size caculate --- .../storage/admin/r2/files/configs/route.ts | 5 ++- app/api/storage/admin/r2/files/route.ts | 2 + app/api/storage/r2/files/configs/route.ts | 5 ++- app/api/storage/r2/upload/add/route.ts | 3 +- components/file/file-list.tsx | 42 +++++++++---------- components/file/index.tsx | 12 ++++-- components/ui/tooltip.tsx | 4 +- hooks/use-file-upload.ts | 2 +- lib/dto/files.ts | 7 ++-- lib/utils.ts | 20 +++++++++ .../migrations/20250705192109/migration.sql | 2 +- public/sw.js.map | 2 +- 12 files changed, 68 insertions(+), 38 deletions(-) diff --git a/app/api/storage/admin/r2/files/configs/route.ts b/app/api/storage/admin/r2/files/configs/route.ts index fa11c71..4372248 100644 --- a/app/api/storage/admin/r2/files/configs/route.ts +++ b/app/api/storage/admin/r2/files/configs/route.ts @@ -29,6 +29,9 @@ export async function GET(req: NextRequest) { channel: configs.s3_config_01.channel, }); } catch (error) { - return NextResponse.json({ error: "Error listing files" }, { status: 500 }); + return NextResponse.json( + { error: "Error listing buckets" }, + { status: 500 }, + ); } } diff --git a/app/api/storage/admin/r2/files/route.ts b/app/api/storage/admin/r2/files/route.ts index 2e3fe4a..a286d9f 100644 --- a/app/api/storage/admin/r2/files/route.ts +++ b/app/api/storage/admin/r2/files/route.ts @@ -24,6 +24,7 @@ export async function GET(req: NextRequest) { const name = url.searchParams.get("name") || ""; const fileSize = url.searchParams.get("fileSize") || ""; const mimeType = url.searchParams.get("mimeType") || ""; + const status = url.searchParams.get("status") || ""; const configs = await getMultipleConfigs(["s3_config_01"]); if (!configs.s3_config_01.enabled) { @@ -56,6 +57,7 @@ export async function GET(req: NextRequest) { platform: configs.s3_config_01.platform, name, size: Number(fileSize || 0), + status: Number(status === "0" ? 0 : 1), mimeType, }); diff --git a/app/api/storage/r2/files/configs/route.ts b/app/api/storage/r2/files/configs/route.ts index aef9bbd..3c09f49 100644 --- a/app/api/storage/r2/files/configs/route.ts +++ b/app/api/storage/r2/files/configs/route.ts @@ -23,6 +23,9 @@ export async function GET(req: NextRequest) { channel: configs.s3_config_01.channel, }); } catch (error) { - return NextResponse.json({ error: "Error listing files" }, { status: 500 }); + return NextResponse.json( + { error: "Error listing buckets" }, + { status: 500 }, + ); } } diff --git a/app/api/storage/r2/upload/add/route.ts b/app/api/storage/r2/upload/add/route.ts index bfb5768..06a0f4d 100644 --- a/app/api/storage/r2/upload/add/route.ts +++ b/app/api/storage/r2/upload/add/route.ts @@ -4,6 +4,7 @@ import { NextRequest, NextResponse } from "next/server"; import { createUserFile } from "@/lib/dto/files"; import { checkUserStatus } from "@/lib/dto/user"; import { getCurrentUser } from "@/lib/session"; +import { bytesToStorageValue } from "@/lib/utils"; export async function POST(request: NextRequest) { try { @@ -44,7 +45,7 @@ export async function POST(request: NextRequest) { channel: body.channel || "", platform: body.platform || "", providerName: body.providerName || "", - size: body.size, + size: bytesToStorageValue(body.size), bucket: body.bucket, lastModified: body.lastModified ? new Date(body.lastModified) diff --git a/components/file/file-list.tsx b/components/file/file-list.tsx index 29e93b8..abc5742 100644 --- a/components/file/file-list.tsx +++ b/components/file/file-list.tsx @@ -25,6 +25,7 @@ import { downloadFileFromUrl, formatDate, formatFileSize, + storageValueToBytes, truncateMiddle, } from "@/lib/utils"; import { ClickableTooltip } from "@/components/ui/tooltip"; @@ -47,7 +48,6 @@ import { DropdownMenuTrigger, } from "../ui/dropdown-menu"; import { Modal } from "../ui/modal"; -import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; import { Skeleton } from "../ui/skeleton"; import { Switch } from "../ui/switch"; import { TableCell, TableRow } from "../ui/table"; @@ -312,6 +312,10 @@ export default function UserFileList({ )}
{file.mimeType.startsWith("image/") && @@ -328,20 +332,13 @@ export default function UserFileList({
} > -
- {truncateMiddle(file.path)} - {file.status === 1 && ( - - )} -
+ {truncateMiddle(file.path)} + {file.status === 1 && ( + + )}
@@ -350,10 +347,11 @@ export default function UserFileList({
- {formatFileSize(file.size || 0)} + {formatFileSize(storageValueToBytes(file.size) || 0)}

{file.user.name}

@@ -361,9 +359,7 @@ export default function UserFileList({ } > -
- {file.user.name ?? file.user.email} -
+ {file.user.name ?? file.user.email}
@@ -495,6 +491,7 @@ export default function UserFileList({ {React.cloneElement(getFileIcon(file, bucketInfo), { size: 40 })}
{file.mimeType.startsWith("image/") && @@ -511,7 +508,8 @@ export default function UserFileList({ {file.path}

- Size: {formatFileSize(file.size || 0)} + Size:{" "} + {formatFileSize(storageValueToBytes(file.size) || 0)}

Type: {file.mimeType || "-"} @@ -573,9 +571,7 @@ export default function UserFileList({

} > -
- {truncateMiddle(file.path || "")} -
+ {truncateMiddle(file.path || "")}
diff --git a/components/file/index.tsx b/components/file/index.tsx index 7118cfc..da157ec 100644 --- a/components/file/index.tsx +++ b/components/file/index.tsx @@ -93,6 +93,7 @@ export default function UserFileManager({ user, action }: FileListProps) { name: "", fileSize: "", mimeType: "", + status: "1", }); // const isAdmin = action.includes("/admin"); @@ -107,7 +108,7 @@ export default function UserFileManager({ user, action }: FileListProps) { const { data: files, isLoading: isLoadingFiles } = useSWR( bucketInfo.bucket - ? `${action}/r2/files?bucket=${bucketInfo.bucket}&page=${currentPage}&pageSize=${pageSize}&name=${searchParams.name}&fileSize=${searchParams.fileSize}&mimeType=${searchParams.mimeType}` + ? `${action}/r2/files?bucket=${bucketInfo.bucket}&page=${currentPage}&pageSize=${pageSize}&name=${searchParams.name}&fileSize=${searchParams.fileSize}&mimeType=${searchParams.mimeType}&status=${searchParams.status}` : null, fetcher, { @@ -133,8 +134,9 @@ export default function UserFileManager({ user, action }: FileListProps) { }, [r2Configs]); const handleRefresh = () => { + setSelectedFiles([]); mutate( - `${action}/r2/files?bucket=${bucketInfo.bucket}&page=${currentPage}&pageSize=${pageSize}&name=${searchParams.name}&fileSize=${searchParams.fileSize}&mimeType=${searchParams.mimeType}`, + `${action}/r2/files?bucket=${bucketInfo.bucket}&page=${currentPage}&pageSize=${pageSize}&name=${searchParams.name}&fileSize=${searchParams.fileSize}&mimeType=${searchParams.mimeType}&status=${searchParams.status}`, undefined, ); }; @@ -205,11 +207,12 @@ export default function UserFileManager({ user, action }: FileListProps) { name: "", fileSize: "", mimeType: "", + status: "1", }); setCurrentPage(1); }} > - + @@ -217,6 +220,7 @@ export default function UserFileManager({ user, action }: FileListProps) { { lebal: "Name", value: "name" }, { lebal: "Size", value: "fileSize" }, { lebal: "Type", value: "mimeType" }, + { lebal: "Status", value: "status" }, ].map((item) => ( {t(item.lebal)} @@ -225,7 +229,7 @@ export default function UserFileManager({ user, action }: FileListProps) { { diff --git a/components/ui/tooltip.tsx b/components/ui/tooltip.tsx index b2676da..525c40e 100644 --- a/components/ui/tooltip.tsx +++ b/components/ui/tooltip.tsx @@ -41,7 +41,7 @@ export { TooltipArrow, }; -export const ClickableTooltip = ({ children, content }) => { +export const ClickableTooltip = ({ children, content, className = "" }) => { const [open, setOpen] = useState(false); const handleClick = (e) => { @@ -65,7 +65,7 @@ export const ClickableTooltip = ({ children, content }) => { onFocus={(e) => e.preventDefault()} // 阻止焦点事件 onBlur={(e) => e.preventDefault()} > -
+
{children}
diff --git a/hooks/use-file-upload.ts b/hooks/use-file-upload.ts index 476cecf..204f7b2 100644 --- a/hooks/use-file-upload.ts +++ b/hooks/use-file-upload.ts @@ -97,7 +97,7 @@ export function useFileUpload({ bucketInfo, userId, api }: Props) { userId, name: extractKey.fileName, originalName: extractKey.nameWithoutExtension, - mimeType: item.file.type, + mimeType: item.file.type || "-", path: item.fileName, etag, storageClass: "", diff --git a/lib/dto/files.ts b/lib/dto/files.ts index 3ae8c45..a97a8f0 100644 --- a/lib/dto/files.ts +++ b/lib/dto/files.ts @@ -1,6 +1,7 @@ import { Prisma, UserFile } from "@prisma/client"; import { prisma } from "../db"; +import { bytesToStorageValue, storageValueToBytes } from "../utils"; export interface UserFileData extends UserFile { user: { @@ -127,14 +128,14 @@ export async function getUserFiles(options: QueryUserFileOptions = {}) { const where: Prisma.UserFileWhereInput = { bucket, - ...(status && { status }), + ...(status !== undefined && { status }), ...(userId && { userId }), ...(providerName && { providerName }), ...(channel && { channel }), ...(platform && { platform }), ...(shortUrlId && { shortUrlId }), ...(name && { name: { contains: name, mode: "insensitive" } }), - ...(size && { size: { gte: size } }), + ...(size && { size: { gte: bytesToStorageValue(size) } }), ...(mimeType && { mimeType: { contains: mimeType, mode: "insensitive" }, }), @@ -164,7 +165,7 @@ export async function getUserFiles(options: QueryUserFileOptions = {}) { return { total, - totalSize: totalSize._sum.size || 0, + totalSize: storageValueToBytes(totalSize._sum.size || 0), list: files, }; } catch (error) { diff --git a/lib/utils.ts b/lib/utils.ts index 82ec090..0b2d70d 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -571,3 +571,23 @@ export function generateFileKey(fileName: string, prefix?: string): string { return `${year}/${month}/${day}/${fileName}`; } + +const SIZE_THRESHOLD = 1000; +export function bytesToStorageValue(bytes: number): number { + if (bytes < SIZE_THRESHOLD) { + return bytes; + } else { + return Math.ceil(bytes / SIZE_THRESHOLD); + } +} + +export function storageValueToBytes( + storageValue: number, + originalBytes?: number, +): number { + if (storageValue < SIZE_THRESHOLD) { + return storageValue; + } else { + return storageValue * SIZE_THRESHOLD; + } +} diff --git a/prisma/migrations/20250705192109/migration.sql b/prisma/migrations/20250705192109/migration.sql index 688c7ff..b8c6616 100644 --- a/prisma/migrations/20250705192109/migration.sql +++ b/prisma/migrations/20250705192109/migration.sql @@ -28,8 +28,8 @@ ON "user_files"("userId", "providerName", "status", "lastModified", "createdAt") ALTER TABLE "user_files" ADD CONSTRAINT "user_files_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; --- BigInt ALTER TABLE "plans" ADD COLUMN "stMaxFileSize" TEXT NOT NULL DEFAULT '26214400'; ALTER TABLE "plans" ADD COLUMN "stMaxTotalSize" TEXT NOT NULL DEFAULT '524288000'; ALTER TABLE "plans" ADD COLUMN "stMaxFileCount" INTEGER NOT NULL DEFAULT 1000; + diff --git a/public/sw.js.map b/public/sw.js.map index 87baf52..313450a 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/b156dba9393c800c625706c1b8955e7c/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/97eca98296d4019b2abb1fbd57362bc3/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file