124 lines
2.9 KiB
TypeScript
124 lines
2.9 KiB
TypeScript
"use server"
|
|
|
|
import { revalidatePath } from "next/cache"
|
|
import { getSession } from "../auth/session"
|
|
import { insertUrl } from "../db/urls"
|
|
import { deleteUrl as deleteUrlDb, updateUrl as updateUrlDb } from "../db/urls"
|
|
import { advancedUrlSchema, editUrlSchema, urlFormSchema } from "../schema/url"
|
|
import { getWebsiteTitle } from "../websiteTitle"
|
|
|
|
type Response = {
|
|
error: boolean
|
|
message: string
|
|
}
|
|
|
|
export async function addUrl(unsafeData: unknown): Promise<Response> {
|
|
const { session } = await getSession()
|
|
|
|
if (!session) {
|
|
return {
|
|
error: true,
|
|
message: "You must be logged in to create a short link."
|
|
}
|
|
}
|
|
|
|
const { error, data } = urlFormSchema.safeParse(unsafeData)
|
|
|
|
if (error) {
|
|
return {
|
|
error: true,
|
|
message: "Error parsing form data."
|
|
}
|
|
}
|
|
|
|
await insertUrl({
|
|
...data,
|
|
slug: data.slug.length === 0 ? undefined : data.slug,
|
|
title: await getWebsiteTitle(data.url)
|
|
})
|
|
|
|
revalidatePath("/admin/dashboard")
|
|
|
|
return {
|
|
error: false,
|
|
message: "Short link created successfully!"
|
|
}
|
|
}
|
|
|
|
export async function createAdvanceUrl(unsafeData: unknown): Promise<Response> {
|
|
const { session } = await getSession()
|
|
|
|
if (!session) {
|
|
return {
|
|
error: true,
|
|
message: "You must be logged in to create a short link."
|
|
}
|
|
}
|
|
|
|
const { error, data } = advancedUrlSchema.safeParse(unsafeData)
|
|
|
|
if (error) {
|
|
return {
|
|
error: true,
|
|
message: "Error parsing form data."
|
|
}
|
|
}
|
|
|
|
await insertUrl({
|
|
...data,
|
|
slug: data.slug ? data.slug.trim() : undefined,
|
|
title: data.title?.length === 0 ? await getWebsiteTitle(data.url) : data.title,
|
|
maxVisits: data.maxVisits ? data.maxVisits : null
|
|
})
|
|
|
|
return {
|
|
error: false,
|
|
message: "Short link created successfully!"
|
|
}
|
|
}
|
|
|
|
export async function updateUrl(id: string, unsafeData: unknown): Promise<Response> {
|
|
const { session } = await getSession()
|
|
|
|
if (!session) {
|
|
return {
|
|
error: true,
|
|
message: "You must be logged in to update a short link."
|
|
}
|
|
}
|
|
|
|
const { error, data } = editUrlSchema.safeParse(unsafeData)
|
|
|
|
if (error) {
|
|
return {
|
|
error: true,
|
|
message: "Error parsing form data."
|
|
}
|
|
}
|
|
|
|
await updateUrlDb(id, data)
|
|
|
|
return {
|
|
error: false,
|
|
message: "Short link updated successfully!"
|
|
}
|
|
}
|
|
|
|
export async function deleteUrl(id: string): Promise<Response> {
|
|
const { session } = await getSession()
|
|
|
|
if (!session) {
|
|
return {
|
|
error: true,
|
|
message: "You must be logged in to create a short link."
|
|
}
|
|
}
|
|
|
|
await deleteUrlDb(id)
|
|
|
|
return {
|
|
error: false,
|
|
message: "Short link deleted successfully!"
|
|
}
|
|
}
|