diff --git a/package-lock.json b/package-lock.json index 511a9a9..16300d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "cmdk": "^0.2.0", + "content-disposition": "^0.5.4", "dayjs": "^1.11.10", "lucide-react": "^0.290.0", "nanoid": "^5.0.4", @@ -47,6 +48,7 @@ }, "devDependencies": { "@total-typescript/ts-reset": "^0.5.1", + "@types/content-disposition": "^0.5.8", "@types/node": "^20", "@types/pg": "^8.10.9", "@types/react": "^18", @@ -1529,6 +1531,12 @@ "integrity": "sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==", "dev": true }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2636,6 +2644,17 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5717,6 +5736,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", diff --git a/package.json b/package.json index 345e758..a793486 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "cmdk": "^0.2.0", + "content-disposition": "^0.5.4", "dayjs": "^1.11.10", "lucide-react": "^0.290.0", "nanoid": "^5.0.4", @@ -52,6 +53,7 @@ }, "devDependencies": { "@total-typescript/ts-reset": "^0.5.1", + "@types/content-disposition": "^0.5.8", "@types/node": "^20", "@types/pg": "^8.10.9", "@types/react": "^18", diff --git a/src/app/groups/[groupId]/expenses/export/json/route.ts b/src/app/groups/[groupId]/expenses/export/json/route.ts index b7009a3..0fd8ad8 100644 --- a/src/app/groups/[groupId]/expenses/export/json/route.ts +++ b/src/app/groups/[groupId]/expenses/export/json/route.ts @@ -1,4 +1,5 @@ import { getPrisma } from '@/lib/prisma' +import contentDisposition from 'content-disposition' import { NextResponse } from 'next/server' export async function GET( @@ -30,10 +31,13 @@ export async function GET( }) if (!group) return NextResponse.json({ error: 'Invalid group ID' }, { status: 404 }) + + const date = new Date().toISOString().split('T')[0] + const filename = `Spliit Export - ${group.name} - ${date}` return NextResponse.json(group, { headers: { 'content-type': 'application/json', - 'content-disposition': `attachment; filename="Spliit Export.json"`, + 'content-disposition': contentDisposition(`${filename}.json`), }, }) }