Sink/server/api/link/upsert.post.ts
anirut.k c1ac0bf9f3 feat: implement link upsert API endpoint
- Adds a new API endpoint for creating and retrieving links
- Validates link data using LinkSchema
- Supports case sensitivity for link slugs
- Handles existing links by returning the short link and status
- Creates new links with expiration metadata in Cloudflare KV store
2025-03-21 13:45:41 +07:00

38 lines
1.1 KiB
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
// Check if link exists
const existingLink = await KV.get(`link:${link.slug}`, { type: 'json' })
if (existingLink) {
// If link exists, return it along with the short link
const shortLink = `${getRequestProtocol(event)}://${getRequestHost(event)}/${link.slug}`
return { link: existingLink, shortLink, status: 'existing' }
}
// If link doesn't exist, create it
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, status: 'created' }
})