Files
money.sori.studio/server/api/export/transactions.csv.get.ts
2026-08-13 15:58:42 +09:00

34 lines
1.1 KiB
TypeScript

import { setHeader } from 'h3'
import { prisma } from '../../utils/db'
import { requireUser } from '../../utils/auth'
export default defineEventHandler(async (event) => {
const user = await requireUser(event)
const rows = await prisma.transaction.findMany({
where: { userId: user.id },
include: { asset: true, category: { include: { parent: true } } },
orderBy: { occurredAt: 'desc' }
})
const escape = (value: unknown) => `"${String(value ?? '').replaceAll('"', '""')}"`
const lines = [
['id', 'type', 'occurredAt', 'asset', 'category', 'amount', 'title', 'memo', 'latitude', 'longitude'].map(escape).join(','),
...rows.map(row => [
row.id,
row.type,
row.occurredAt.toISOString(),
row.asset.name,
row.category.parent ? `${row.category.parent.name} > ${row.category.name}` : row.category.name,
row.amount,
row.title,
row.memo,
row.latitude,
row.longitude
].map(escape).join(','))
]
setHeader(event, 'content-type', 'text/csv; charset=utf-8')
setHeader(event, 'content-disposition', 'attachment; filename="transactions.csv"')
return lines.join('\n')
})