Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(forms) #24

Merged
merged 12 commits into from
Sep 13, 2024
Merged
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ node_modules
# Output
.output
.vercel
.wrangler
/.svelte-kit
/dist
/build
Expand Down
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,8 @@
"vite": "^5.0.3",
"vitest": "^2.0.0"
},
"type": "module"
"type": "module",
"dependencies": {
"@auth/sveltekit": "^1.4.2"
}
}
86 changes: 86 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ body {
width: 100vw;
min-height: 100vh;
margin: 0;
overflow-x: hidden;
}

#SVELTEUI_PROVIDER {
Expand Down
10 changes: 9 additions & 1 deletion src/app.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,15 @@ declare global {
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
interface Platform {
env: {
FORMS_DB: D1Database;
};
context: {
waitUntil(promise: Promise<any>): void;
};
caches: CacheStorage & { default: Cache };
}
}
}

Expand Down
1 change: 1 addition & 0 deletions src/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>RustLangES Dashboard</title>
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
Expand Down
6 changes: 6 additions & 0 deletions src/auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { SvelteKitAuth } from "@auth/sveltekit"
import GitHub from "@auth/sveltekit/providers/github"

export const { handle, signIn, signOut } = SvelteKitAuth({
providers: [GitHub],
})
7 changes: 7 additions & 0 deletions src/hooks.server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { sequence } from "@sveltejs/kit/hooks";

import { prepareStylesSSR } from "@svelteuidev/core";

import { handle as authHandle } from "./auth";

export const handle = sequence(authHandle, prepareStylesSSR);
41 changes: 41 additions & 0 deletions src/lib/forms/models.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
export interface Form {
id: number;
title: string;
description: string;
edition: string;

/** 0 = false, 1 = true. D1 Things */
multiple_times: number;

/** 0 = false, 1 = true. D1 Things */
require_login: number;

/** 0 = false, 1 = true. D1 Things */
deleted: number;

/** Created datetime in seconds */
created_at: number;
}

type Step<Type extends string, Data extends object> = {
id: number;
title: string;
description: string;
type: Type;
data: Data;
};

export type Question = QuestionText | QuestionQuestionText | QuestionOptions;

export type QuestionText = Step<'text', {}>;

export type QuestionQuestionText = Step<'questionText', { required?: boolean }>;

export type QuestionOptions = Step<
'options',
{
canMultiple: boolean;
required: boolean;
options: Array<string>;
}
>;
39 changes: 39 additions & 0 deletions src/lib/forms/service/stores/form.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { writable } from 'svelte/store';
import type { Form, Question } from '../../models';

export const form = writable<Form>();
export const questions = writable<Question[]>([]);

export async function loadDetails(
platform: Readonly<App.Platform> | undefined,
type_form: string
): Promise<{ form: Form; questions: Question }> {
const form_res = await platform!.env.FORMS_DB.prepare('SELECT * FROM Form WHERE id = ?')
.bind(type_form)
.run();

const questions_res = await platform!.env.FORMS_DB.prepare(
'SELECT * FROM Question WHERE form_id = ?'
)
.bind(type_form)
.run();

const formData = form_res.results[0];
const questionsData = questions_res.results;

form.set(formData);
questions.set(questionsData);

return { form: formData, questions: questionsData };
}

export function receiveDetails(data: unknown) {
if (typeof data === 'object' && data !== null) {
if ('form' in data) {
form.set(data.form as Form);
}
if ('questions' in data) {
questions.set(data.questions as Question[]);
}
}
}
20 changes: 20 additions & 0 deletions src/lib/forms/service/stores/forms.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { writable } from 'svelte/store';
import type { Form } from '../../models';

export const forms = writable<Form[]>([]);

export async function loadFormsFromDB(
platform: Readonly<App.Platform> | undefined
): Promise<Form[]> {
const forms_res = await platform!.env.FORMS_DB.prepare('SELECT * FROM Form').run();

forms.set(forms_res.results);

return forms_res.results;
}

export function receiveForms(data: unknown) {
if (typeof data === 'object' && data !== null && 'forms' in data) {
forms.set(data.forms as Form[]);
}
}
25 changes: 25 additions & 0 deletions src/lib/forms/service/stores/question.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { writable } from 'svelte/store';
import type { Question } from '../../models';

export const question = writable<Question>();

export async function loadQuestionFromDB(
platform: Readonly<App.Platform> | undefined,
params: number
): Promise<Question> {
const question_res = await platform!.env.FORMS_DB.prepare('SELECT * FROM Question WHERE id = ?')
.bind(params)
.run();

question.set(question_res.results[0]);

return question_res.results[0];
}

export function receiveQuestion(data: unknown) {
if (typeof data === 'object' && data !== null && 'question' in data) {
question.set(data.question as Question);
} else {
console.error('Invalid data format in receiveQuestion:', data);
}
}
Loading
Loading