diff --git a/web/package.json b/web/package.json index ad99518..3252b18 100644 --- a/web/package.json +++ b/web/package.json @@ -34,8 +34,10 @@ "dependencies": { "@types/materialdb": "file:../materialdb", "materialdb": "file:../materialdb", + "monaco-editor": "^0.27.0", "reflect-metadata": "^0.1.13", "sequelize": "^6.6.5", - "sequelize-typescript": "^2.1.0" + "sequelize-typescript": "^2.1.0", + "ts-pattern": "^3.2.5" } } diff --git a/web/src/hooks/index.ts b/web/src/hooks/index.ts index 0486573..349fb2e 100644 --- a/web/src/hooks/index.ts +++ b/web/src/hooks/index.ts @@ -4,5 +4,6 @@ import { dbPromise } from "$lib/db"; export async function handle({ request, resolve }) { request.locals.db = await dbPromise; request.locals.loginStatus = checkLogin(request); + console.log("DB", request.locals.db); return resolve(request); } diff --git a/web/src/lib/MasteryDemo.svelte b/web/src/lib/MasteryDemo.svelte index a68b2ae..e03f9ff 100644 --- a/web/src/lib/MasteryDemo.svelte +++ b/web/src/lib/MasteryDemo.svelte @@ -1,16 +1,16 @@ {#if state == "loading"} diff --git a/web/src/lib/auth.ts b/web/src/lib/auth.ts index 5e34853..9a31ce2 100644 --- a/web/src/lib/auth.ts +++ b/web/src/lib/auth.ts @@ -1,7 +1,16 @@ import { User } from "$lib/db"; +import { match, select } from "ts-pattern"; + +type _LoginStatus = + | { type: "loggedIn"; } + | { type: "notLoggedIn"; } export class LoginStatus { - constructor(public isLoggedIn: boolean, public username?: string) {} + constructor( + public isLoggedIn: boolean, + public user_id?: number, + public username?: string, + ) {} } export function checkLogin(req: Request): LoginStatus { diff --git a/web/src/lib/components/Editor.svelte b/web/src/lib/components/Editor.svelte new file mode 100644 index 0000000..6397069 --- /dev/null +++ b/web/src/lib/components/Editor.svelte @@ -0,0 +1,23 @@ + + +
+ + diff --git a/web/src/lib/db/exercise.ts b/web/src/lib/db/exercise.ts new file mode 100644 index 0000000..7a22dc3 --- /dev/null +++ b/web/src/lib/db/exercise.ts @@ -0,0 +1,14 @@ +import { DataType, Unique, Column, Table, Model } from "sequelize-typescript"; + +/// An instance of an exercise, created to be solved by a specific user. +@Table +export class ExerciseInstance extends Model { + @Column(DataType.STRING) + public user_id: string; + + @Column(DataType.STRING) + public exercise_name: string; + + @Column(DataType.JSON) + public instance_props: any; +} diff --git a/web/src/lib/db/index.ts b/web/src/lib/db/index.ts index 2c5d4db..004878c 100644 --- a/web/src/lib/db/index.ts +++ b/web/src/lib/db/index.ts @@ -1,5 +1,6 @@ import { Sequelize } from "sequelize-typescript"; import { User } from "./user"; +import { ExerciseInstance } from "./exercise"; import { Page, Exercise, Grader } from "materialdb/db"; @@ -15,7 +16,7 @@ async function loadMaterialDb() { async function init(): Promise { let sequelize = new Sequelize(`sqlite:test.db`, { - models: [User], + models: [User, ExerciseInstance], }); await sequelize.sync({ force: true }); return sequelize; @@ -24,4 +25,4 @@ async function init(): Promise { export let dbPromise = init(); export let materialDb = loadMaterialDb(); -export { User }; +export { User, ExerciseInstance }; diff --git a/web/src/lib/exercise/Exercise.svelte b/web/src/lib/exercise/Exercise.svelte index 774e3a1..ad60b01 100644 --- a/web/src/lib/exercise/Exercise.svelte +++ b/web/src/lib/exercise/Exercise.svelte @@ -1,14 +1,22 @@ -{JSON.stringify(exercise)} -{exercise.style} +
+ Exercise Spec +
{JSON.stringify(exercise, null, 2)}
+
{#if !exercise} loading -{:else if exercise.style == "multipleChoice"} - +{:else if exercise.style == ExerciseStyle.MultipleChoice} + +{:else if exercise.style == ExerciseStyle.GradedProgram} + +{:else} + Sorry, no support for {exercise.style} type of questions yet! {/if} diff --git a/web/src/lib/exercise/GradedProgram/Component.svelte b/web/src/lib/exercise/GradedProgram/Component.svelte new file mode 100644 index 0000000..d495dba --- /dev/null +++ b/web/src/lib/exercise/GradedProgram/Component.svelte @@ -0,0 +1,9 @@ + + +{props} + + diff --git a/web/src/lib/exercise/GradedProgram/index.ts b/web/src/lib/exercise/GradedProgram/index.ts new file mode 100644 index 0000000..e8dbb7f --- /dev/null +++ b/web/src/lib/exercise/GradedProgram/index.ts @@ -0,0 +1,9 @@ +import { ExerciseStyle, IExercise } from ".."; +import Component from "./Component.svelte"; + +let spec: IExercise = { + style: ExerciseStyle.GradedProgram, + component: Component, +}; + +export default spec; diff --git a/web/src/lib/exercise/MultipleChoice.svelte b/web/src/lib/exercise/MultipleChoice/Component.svelte similarity index 97% rename from web/src/lib/exercise/MultipleChoice.svelte rename to web/src/lib/exercise/MultipleChoice/Component.svelte index e4d1c93..427149e 100644 --- a/web/src/lib/exercise/MultipleChoice.svelte +++ b/web/src/lib/exercise/MultipleChoice/Component.svelte @@ -1,4 +1,5 @@