You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
3.1 KiB
TypeScript

import type { PageServerLoad } from './$types'
import { fail, setError, superValidate } from 'sveltekit-superforms'
import { zod } from 'sveltekit-superforms/adapters'
import { formSchema } from './schema'
import type { Actions } from './$types'
import { db } from '$lib/db'
import { redirect } from '@sveltejs/kit'
import { shortener } from '$lib/db/schema'
import { eq } from 'drizzle-orm'
export const load = (async (event) => {
const user = event.locals.user
const { id } = event.params
const shortener = await db.query.shortener.findFirst({
columns: {
code: true,
projectId: true,
ios: true,
ios_link: true,
android: true,
android_link: true,
link: true,
active: true,
},
where: (shortener, { eq, and }) =>
and(eq(shortener.code, id), eq(shortener.userId, user.id)),
})
if (!shortener) {
redirect(300, `/links`)
}
const projects = await db.query.project.findMany({
where: (project, { eq }) => eq(project.userId, user.id),
})
let selectedCategory = undefined
if (shortener.projectId) {
const project = projects.find(
(project) => project.id === shortener.projectId,
)
if (project) {
selectedCategory = { value: project.uuid, label: project.name }
}
}
return {
projects,
selectedCategory,
form: await superValidate(
{
...shortener,
project: selectedCategory?.value || undefined,
},
zod(formSchema),
),
}
}) satisfies PageServerLoad
export const actions: Actions = {
default: async (event) => {
const form = await superValidate(event, zod(formSchema))
if (!form.valid) {
return fail(400, {
form,
})
}
if (form.data.link.startsWith('http://')) {
return setError(form, 'link', 'Link must be HTTPS')
}
if (
form.data.ios_link &&
form.data.ios_link.startsWith('http://')
) {
return setError(form, 'ios_link', 'Link must be HTTPS')
}
if (
form.data.android_link &&
form.data.android_link.startsWith('http://')
) {
return setError(form, 'android_link', 'Link must be HTTPS')
}
const user = event.locals.user
let project = undefined
const selected_project = form.data.project
if (selected_project) {
project = await db.query.project.findFirst({
where: (project, { eq, and }) =>
and(
eq(project.userId, user.id),
eq(project.uuid, selected_project),
),
})
}
let ios_link = ''
if (form.data.ios_link) {
if (form.data.ios_link.startsWith('https://')) {
ios_link = form.data.ios_link
} else {
ios_link = `https://${form.data.ios_link}`
}
}
let android_link = ''
if (form.data.android_link) {
if (form.data.android_link.startsWith('https://')) {
android_link = form.data.android_link
} else {
android_link = `https://${form.data.android_link}`
}
}
await db
.update(shortener)
.set({
link: form.data.link.startsWith('https://')
? form.data.link
: `https://${form.data.link}`,
projectId: project ? project.id : null,
userId: user.id,
ios: form.data.ios,
ios_link: ios_link,
android: form.data.android,
android_link: android_link,
})
.where(eq(shortener.code, event.params.id))
return { form }
},
}