From 8a7b401b6eedf454abd23756340d93bd0f370337 Mon Sep 17 00:00:00 2001 From: Zarox28 <41804375+Zarox28@users.noreply.github.com> Date: Thu, 18 Dec 2025 10:50:34 +0100 Subject: [PATCH] feat: add maximum expiration value (#934) * feat: add maximum expiration value * fix(settings) * fix: add missing migration * Update src/lib/import/version3/validateExport.ts * fix: x-zipline-deletes-at with maxExpiration config --------- Co-authored-by: dicedtomato <35403473+diced@users.noreply.github.com> --- .../migration.sql | 2 + prisma/schema.prisma | 37 +++---- .../pages/serverSettings/parts/Files.tsx | 24 ++++- .../pages/upload/UploadOptionsButton.tsx | 101 +++++++++++------- src/lib/config/read/db.ts | 1 + src/lib/config/validate.ts | 1 + src/lib/uploader/parseHeaders.ts | 12 +++ src/server/routes/api/server/public.ts | 2 + .../routes/api/server/settings/index.ts | 32 +++++- 9 files changed, 153 insertions(+), 59 deletions(-) create mode 100644 prisma/migrations/20251209070242_file_max_expiration/migration.sql diff --git a/prisma/migrations/20251209070242_file_max_expiration/migration.sql b/prisma/migrations/20251209070242_file_max_expiration/migration.sql new file mode 100644 index 00000000..c55b55da --- /dev/null +++ b/prisma/migrations/20251209070242_file_max_expiration/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "public"."Zipline" ADD COLUMN "filesMaxExpiration" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index dbfc719c..ef0312c1 100755 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { provider = "prisma-client" - output = "../src/prisma" - moduleFormat = "cjs" + output = "../src/prisma" + moduleFormat = "cjs" previewFeatures = ["queryCompiler", "driverAdapters"] } @@ -32,18 +32,19 @@ model Zipline { tasksThumbnailsInterval String @default("30m") tasksMetricsInterval String @default("30m") - filesRoute String @default("/u") - filesLength Int @default(6) - filesDefaultFormat String @default("random") - filesDisabledExtensions String[] - filesMaxFileSize String @default("100mb") - filesDefaultExpiration String? - filesAssumeMimetypes Boolean @default(false) - filesDefaultDateFormat String @default("YYYY-MM-DD_HH:mm:ss") - filesRemoveGpsMetadata Boolean @default(false) - filesRandomWordsNumAdjectives Int @default(2) - filesRandomWordsSeparator String @default("-") - filesDefaultCompressionFormat String? @default("jpg") + filesRoute String @default("/u") + filesLength Int @default(6) + filesDefaultFormat String @default("random") + filesDisabledExtensions String[] + filesMaxFileSize String @default("100mb") + filesDefaultExpiration String? + filesMaxExpiration String? + filesAssumeMimetypes Boolean @default(false) + filesDefaultDateFormat String @default("YYYY-MM-DD_HH:mm:ss") + filesRemoveGpsMetadata Boolean @default(false) + filesRandomWordsNumAdjectives Int @default(2) + filesRandomWordsSeparator String @default("-") + filesDefaultCompressionFormat String? @default("jpg") urlsRoute String @default("/go") urlsLength Int @default(6) @@ -64,7 +65,7 @@ model Zipline { featuresMetricsShowUserSpecific Boolean @default(true) featuresVersionChecking Boolean @default(true) - featuresVersionAPI String @default("https://zipline-version.diced.sh") + featuresVersionAPI String @default("https://zipline-version.diced.sh") invitesEnabled Boolean @default(true) invitesLength Int @default(6) @@ -141,7 +142,7 @@ model Zipline { pwaThemeColor String @default("#000000") pwaBackgroundColor String @default("#000000") - domains String[] @default([]) + domains String[] @default([]) } model User { @@ -295,8 +296,8 @@ model Folder { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - name String - public Boolean @default(false) + name String + public Boolean @default(false) allowUploads Boolean @default(false) files File[] diff --git a/src/components/pages/serverSettings/parts/Files.tsx b/src/components/pages/serverSettings/parts/Files.tsx index a709cf3d..e8b2ce62 100644 --- a/src/components/pages/serverSettings/parts/Files.tsx +++ b/src/components/pages/serverSettings/parts/Files.tsx @@ -30,6 +30,7 @@ export default function Files({ filesDisabledExtensions: string; filesMaxFileSize: string; filesDefaultExpiration: string | null; + filesMaxExpiration: string | null; filesAssumeMimetypes: boolean; filesDefaultDateFormat: string; filesRemoveGpsMetadata: boolean; @@ -44,6 +45,7 @@ export default function Files({ filesDisabledExtensions: '', filesMaxFileSize: '100mb', filesDefaultExpiration: '', + filesMaxExpiration: '', filesAssumeMimetypes: false, filesDefaultDateFormat: 'YYYY-MM-DD_HH:mm:ss', filesRemoveGpsMetadata: false, @@ -63,6 +65,12 @@ export default function Files({ values.filesDefaultExpiration = values.filesDefaultExpiration.trim(); } + if (values.filesMaxExpiration?.trim() === '' || !values.filesMaxExpiration) { + values.filesMaxExpiration = null; + } else { + values.filesMaxExpiration = values.filesMaxExpiration.trim(); + } + if (!values.filesDisabledExtensions) { // @ts-ignore values.filesDisabledExtensions = []; @@ -95,6 +103,7 @@ export default function Files({ filesDisabledExtensions: data.settings.filesDisabledExtensions.join(', ') ?? '', filesMaxFileSize: data.settings.filesMaxFileSize ?? '100mb', filesDefaultExpiration: data.settings.filesDefaultExpiration ?? '', + filesMaxExpiration: data.settings.filesMaxExpiration ?? '', filesAssumeMimetypes: data.settings.filesAssumeMimetypes ?? false, filesDefaultDateFormat: data.settings.filesDefaultDateFormat ?? 'YYYY-MM-DD_HH:mm:ss', filesRemoveGpsMetadata: data.settings.filesRemoveGpsMetadata ?? false, @@ -161,6 +170,13 @@ export default function Files({ {...form.getInputProps('filesMaxFileSize')} /> + +