diff --git a/frontend/src/routes/(app)/links/(components)/form.svelte b/frontend/src/routes/(app)/links/(components)/form.svelte index f00bb8f..1ab8000 100644 --- a/frontend/src/routes/(app)/links/(components)/form.svelte +++ b/frontend/src/routes/(app)/links/(components)/form.svelte @@ -75,21 +75,21 @@ -
+
Preview
-
-
+
+
{#if isPreviewLoading} -
+
{:else if previewData} + class="h-64 w-full object-cover" />
+ class="bg-secondary absolute bottom-2 left-2 rounded-lg px-2"> {previewData.title}
{/if} @@ -145,13 +145,40 @@ Shortener Project + + + + Custom Code + + + {#if $formData.custom_code_enable} + + + + + Custom Code For The Shortener + + + {/if} + class="flex items-center gap-2 space-y-0"> - iOS Link + iOS Link {#if $formData.ios} @@ -173,10 +200,10 @@ + class="flex items-center gap-2 space-y-0"> - Android Link + Android Link {#if $formData.android} @@ -198,7 +225,7 @@ + class="flex items-center gap-2 space-y-0"> Active diff --git a/frontend/src/routes/(app)/links/+page.server.ts b/frontend/src/routes/(app)/links/+page.server.ts index 3239398..48c7578 100644 --- a/frontend/src/routes/(app)/links/+page.server.ts +++ b/frontend/src/routes/(app)/links/+page.server.ts @@ -154,6 +154,24 @@ export const actions: Actions = { return setError(form, 'android_link', 'Link must be HTTPS') } + if (form.data.custom_code_enable) { + if (!form.data.custom_code) { + return setError( + form, + 'custom_code', + 'Please Enter Custom Code', + ) + } + const customCodeExist = await db.query.shortener.findFirst({ + where: (shortener, { eq }) => + eq(shortener.code, form.data.custom_code), + }) + + if (customCodeExist) { + return setError(form, 'custom_code', 'Duplicated Custom Code') + } + } + const user = event.locals.user let project = undefined const selected_project = form.data.project @@ -187,7 +205,9 @@ export const actions: Actions = { } } - const code = nanoid(8) + const code = form.data.custom_code_enable + ? form.data.custom_code + : nanoid(8) await db.insert(shortener).values({ link: form.data.link.startsWith('https://') ? form.data.link diff --git a/frontend/src/routes/(app)/links/[id]/edit/(components)/form.svelte b/frontend/src/routes/(app)/links/[id]/edit/(components)/form.svelte index 8fc1c39..c1278e4 100644 --- a/frontend/src/routes/(app)/links/[id]/edit/(components)/form.svelte +++ b/frontend/src/routes/(app)/links/[id]/edit/(components)/form.svelte @@ -62,21 +62,21 @@ }) -
+
Preview
-
-
+
+
{#if isPreviewLoading} -
+
{:else if previewData} + class="h-64 w-full object-cover" />
+ class="bg-secondary absolute bottom-2 left-2 rounded-lg px-2"> {previewData.title}
{/if} @@ -132,13 +132,37 @@ Shortener Project + + + + Custom Code + + + {#if $formData.custom_code_enable} + + + + + Custom Code For The Shortener + + + {/if} + class="flex items-center gap-2 space-y-0"> - iOS Link + iOS Link {#if $formData.ios} @@ -156,10 +180,10 @@ + class="flex items-center gap-2 space-y-0"> - Android Link + Android Link {#if $formData.android} @@ -180,7 +204,7 @@ + class="flex items-center gap-2 space-y-0"> Active diff --git a/frontend/src/routes/(app)/links/[id]/edit/+page.server.ts b/frontend/src/routes/(app)/links/[id]/edit/+page.server.ts index 47dca54..e0b1dd4 100644 --- a/frontend/src/routes/(app)/links/[id]/edit/+page.server.ts +++ b/frontend/src/routes/(app)/links/[id]/edit/+page.server.ts @@ -52,6 +52,8 @@ export const load = (async (event) => { form: await superValidate( { ...shortener, + custom_code_enable: true, + custom_code: shortener.code, project: selectedCategory?.value || undefined, }, zod(formSchema), @@ -86,6 +88,27 @@ export const actions: Actions = { return setError(form, 'android_link', 'Link must be HTTPS') } + if (form.data.custom_code_enable) { + if (!form.data.custom_code) { + return setError( + form, + 'custom_code', + 'Please Enter Custom Code', + ) + } + const customCodeExist = await db.query.shortener.findFirst({ + where: (shortener, { eq, and, ne }) => + and( + eq(shortener.code, form.data.custom_code), + ne(shortener.code, event.params.id), + ), + }) + + if (customCodeExist) { + return setError(form, 'custom_code', 'Duplicated Custom Code') + } + } + const user = event.locals.user let project = undefined @@ -128,6 +151,9 @@ export const actions: Actions = { : `https://${form.data.link}`, projectId: project ? project.id : null, userId: user.id, + code: form.data.custom_code_enable + ? form.data.custom_code + : undefined, ios: form.data.ios, ios_link: ios_link, android: form.data.android, diff --git a/frontend/src/routes/(app)/links/[id]/edit/schema.ts b/frontend/src/routes/(app)/links/[id]/edit/schema.ts index 6916e90..c5ebe17 100644 --- a/frontend/src/routes/(app)/links/[id]/edit/schema.ts +++ b/frontend/src/routes/(app)/links/[id]/edit/schema.ts @@ -8,6 +8,8 @@ export const formSchema = z.object({ ios_link: z.string().nullable(), android: z.boolean(), android_link: z.string().nullable(), + custom_code_enable: z.boolean(), + custom_code: z.string(), }) export type FormSchema = typeof formSchema diff --git a/frontend/src/routes/(app)/links/schema.ts b/frontend/src/routes/(app)/links/schema.ts index 1577273..02c0c2e 100644 --- a/frontend/src/routes/(app)/links/schema.ts +++ b/frontend/src/routes/(app)/links/schema.ts @@ -8,6 +8,8 @@ export const formSchema = z.object({ ios_link: z.string(), android: z.boolean(), android_link: z.string(), + custom_code_enable: z.boolean(), + custom_code: z.string(), }) export type FormSchema = typeof formSchema diff --git a/frontend/src/routes/(app)/projects/[id]/(components)/form.svelte b/frontend/src/routes/(app)/projects/[id]/(components)/form.svelte index ab635ff..a1ecc84 100644 --- a/frontend/src/routes/(app)/projects/[id]/(components)/form.svelte +++ b/frontend/src/routes/(app)/projects/[id]/(components)/form.svelte @@ -71,21 +71,21 @@ -
+
Preview
-
-
+
+
{#if isPreviewLoading} -
+
{:else if previewData} + class="h-64 w-full object-cover" />
+ class="bg-secondary absolute bottom-2 left-2 rounded-lg px-2"> {previewData.title}
{/if} @@ -109,13 +109,40 @@ Shortener link + + + + Custom Code + + + {#if $formData.custom_code_enable} + + + + + Custom Code For The Shortener + + + {/if} + class="flex items-center gap-2 space-y-0"> - iOS Link + iOS Link {#if $formData.ios} @@ -137,10 +164,10 @@ + class="flex items-center gap-2 space-y-0"> - Android Link + Android Link {#if $formData.android} @@ -162,7 +189,7 @@ + class="flex items-center gap-2 space-y-0"> Active diff --git a/frontend/src/routes/(app)/projects/[id]/+page.server.ts b/frontend/src/routes/(app)/projects/[id]/+page.server.ts index 7465a56..f70f449 100644 --- a/frontend/src/routes/(app)/projects/[id]/+page.server.ts +++ b/frontend/src/routes/(app)/projects/[id]/+page.server.ts @@ -126,6 +126,24 @@ export const actions: Actions = { return setError(form, 'android_link', 'Link must be HTTPS') } + if (form.data.custom_code_enable) { + if (!form.data.custom_code) { + return setError( + form, + 'custom_code', + 'Please Enter Custom Code', + ) + } + const customCodeExist = await db.query.shortener.findFirst({ + where: (shortener, { eq }) => + eq(shortener.code, form.data.custom_code), + }) + + if (customCodeExist) { + return setError(form, 'custom_code', 'Duplicated Custom Code') + } + } + const { id } = event.params const user = event.locals.user const project = await db.query.project.findFirst({ @@ -159,7 +177,9 @@ export const actions: Actions = { } } - const code = nanoid(8) + const code = form.data.custom_code_enable + ? form.data.custom_code + : nanoid(8) await db.insert(shortener).values({ link: form.data.link.startsWith('https://') ? form.data.link diff --git a/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/(components)/form.svelte b/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/(components)/form.svelte index de5364c..7dc08c6 100644 --- a/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/(components)/form.svelte +++ b/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/(components)/form.svelte @@ -59,21 +59,21 @@ }) -
+
Preview
-
-
+
+
{#if isPreviewLoading} -
+
{:else if previewData} + class="h-64 w-full object-cover" />
+ class="bg-secondary absolute bottom-2 left-2 rounded-lg px-2"> {previewData.title}
{/if} @@ -97,13 +97,37 @@ Shortener link + + + + Custom Code + + + {#if $formData.custom_code_enable} + + + + + Custom Code For The Shortener + + + {/if} + class="flex items-center gap-2 space-y-0"> - iOS Link + iOS Link {#if $formData.ios} @@ -121,10 +145,10 @@ + class="flex items-center gap-2 space-y-0"> - Android Link + Android Link {#if $formData.android} @@ -145,7 +169,7 @@ + class="flex items-center gap-2 space-y-0"> Active diff --git a/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/+page.server.ts b/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/+page.server.ts index f0050f2..839cbee 100644 --- a/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/+page.server.ts +++ b/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/+page.server.ts @@ -35,7 +35,14 @@ export const load = (async (event) => { return { shortener, - form: await superValidate({ ...shortener }, zod(formSchema)), + form: await superValidate( + { + ...shortener, + custom_code_enable: true, + custom_code: shortener.code, + }, + zod(formSchema), + ), } }) satisfies PageServerLoad @@ -66,6 +73,27 @@ export const actions: Actions = { return setError(form, 'android_link', 'Link must be HTTPS') } + if (form.data.custom_code_enable) { + if (!form.data.custom_code) { + return setError( + form, + 'custom_code', + 'Please Enter Custom Code', + ) + } + const customCodeExist = await db.query.shortener.findFirst({ + where: (shortener, { eq, and, ne }) => + and( + eq(shortener.code, form.data.custom_code), + ne(shortener.code, event.params.linkid), + ), + }) + + if (customCodeExist) { + return setError(form, 'custom_code', 'Duplicated Custom Code') + } + } + const { id } = event.params const user = event.locals.user const project = await db.query.project.findFirst({ @@ -107,6 +135,9 @@ export const actions: Actions = { : `https://${form.data.link}`, projectId: project.id, userId: user.id, + code: form.data.custom_code_enable + ? form.data.custom_code + : undefined, ios: form.data.ios, ios_link: ios_link, android: form.data.android, diff --git a/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/schema.ts b/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/schema.ts index ee8b232..90670b2 100644 --- a/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/schema.ts +++ b/frontend/src/routes/(app)/projects/[id]/links/[linkid]/edit/schema.ts @@ -7,6 +7,8 @@ export const formSchema = z.object({ ios_link: z.string().nullable(), android: z.boolean(), android_link: z.string().nullable(), + custom_code_enable: z.boolean(), + custom_code: z.string(), }) export type FormSchema = typeof formSchema diff --git a/frontend/src/routes/(app)/projects/[id]/schema.ts b/frontend/src/routes/(app)/projects/[id]/schema.ts index 48e5a97..c5903dc 100644 --- a/frontend/src/routes/(app)/projects/[id]/schema.ts +++ b/frontend/src/routes/(app)/projects/[id]/schema.ts @@ -7,6 +7,8 @@ export const formSchema = z.object({ ios_link: z.string(), android: z.boolean(), android_link: z.string(), + custom_code_enable: z.boolean(), + custom_code: z.string(), }) export type FormSchema = typeof formSchema