36 lines
1.0 KiB
TypeScript
36 lines
1.0 KiB
TypeScript
import { randomBytes } from 'node:crypto'
|
|
import { addDays } from 'date-fns'
|
|
import { readBody, createError } from 'h3'
|
|
import { prisma } from '../../utils/db'
|
|
import { requireUser } from '../../utils/auth'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event)
|
|
const body = await readBody<{ name?: string; days?: number }>(event)
|
|
const days = Number(body.days || 7)
|
|
|
|
if (!Number.isFinite(days) || days < 1 || days > 365) {
|
|
throw createError({ statusCode: 400, statusMessage: 'Invalid expiration days' })
|
|
}
|
|
|
|
const link = await prisma.shareLink.create({
|
|
data: {
|
|
userId: user.id,
|
|
token: randomBytes(24).toString('base64url'),
|
|
name: body.name?.trim().slice(0, 40) || '공유 링크',
|
|
expiresAt: addDays(new Date(), days)
|
|
}
|
|
})
|
|
|
|
return {
|
|
id: link.id,
|
|
name: link.name,
|
|
token: link.token,
|
|
expiresAt: link.expiresAt,
|
|
revokedAt: link.revokedAt,
|
|
lastViewedAt: link.lastViewedAt,
|
|
createdAt: link.createdAt,
|
|
active: true
|
|
}
|
|
})
|