Sink/server/api/link/create.post.ts
ccbikai 8d1bf6a451 feat: improve case-sensitive slug handling
Refactors URL slug case sensitivity implementation:
- Moves case conversion to creation time instead of lookup
- Updates middleware to handle case sensitivity more efficiently
- Adds configuration docs for case sensitivity and list query limits
- Simplifies nanoid implementation to always use lowercase

This change improves performance and consistency in URL handling while maintaining backwards compatibility with existing links.
2024-12-25 12:15:00 +08:00

37 lines
961 B
TypeScript

import { LinkSchema } from '@/schemas/link'
export default eventHandler(async (event) => {
const link = await readValidatedBody(event, LinkSchema.parse)
const { caseSensitive } = useRuntimeConfig(event)
if (!caseSensitive) {
link.slug = link.slug.toLowerCase()
}
const { cloudflare } = event.context
const { KV } = cloudflare.env
const existingLink = await KV.get(`link:${link.slug}`)
if (existingLink) {
throw createError({
status: 409, // Conflict
statusText: 'Link already exists',
})
}
else {
const expiration = getExpiration(event, link.expiration)
await KV.put(`link:${link.slug}`, JSON.stringify(link), {
expiration,
metadata: {
expiration,
url: link.url,
comment: link.comment,
},
})
setResponseStatus(event, 201)
const shortLink = `${getRequestProtocol(event)}://${getRequestHost(event)}/${link.slug}`
return { link, shortLink }
}
})