mirror of https://github.com/TZGyn/shortener
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
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 }
|
|
},
|
|
}
|