Creating endpoints to persist data on server memory

This commit is contained in:
Ibitoye Rotimi Best
2021-07-13 09:43:53 +03:00
parent 7e7bd28889
commit 4a821eef98
7 changed files with 402 additions and 38 deletions
+363
View File
@@ -0,0 +1,363 @@
import { STATUS } from '../../utils/constants/answers';
import { QUESTION_TYPE } from '../../components/Question/constants';
const ROLE = {
ADMIN: 0,
TUTOR: 1,
STUDENT: 2,
};
const tutors = [
{
id: 1,
text: 'Sergey Semko',
},
{
id: 3,
text: 'Jonathan Nelson',
},
{
id: 4,
text: 'Sasha Pokidin',
},
{
id: 5,
text: 'Natasha Rudenko',
},
{
id: 6,
text: 'Yulia Marushko',
},
];
const people = [
{
name: 'Alexander Pokidin',
title: 'Senior Software Engineer',
avatar: 'https://i.pravatar.cc/150?img=1',
role: ROLE.TUTOR,
telegramLink: 'https://t.me/seed_of_abraham',
mailLink: 'mailto:[email protected]',
},
{
name: 'Andrey Filatov',
title: 'Fullstack Software Engineer',
avatar: 'https://i.pravatar.cc/150?img=2',
role: ROLE.TUTOR,
telegramLink: 'https://t.me/seed_of_abraham',
mailLink: 'mailto:[email protected]',
},
{
name: 'Sergey Semko',
title: 'Senior Software Engineer',
avatar: 'https://i.pravatar.cc/150?img=3',
role: ROLE.TUTOR,
telegramLink: 'https://t.me/seed_of_abraham',
mailLink: 'mailto:[email protected]',
},
{
name: 'Natalia Fedii',
title: 'Project Manager',
avatar: 'https://i.pravatar.cc/150?img=4',
role: ROLE.TUTOR,
telegramLink: 'https://t.me/seed_of_abraham',
mailLink: 'mailto:[email protected]',
},
];
const courses = [
{
id: 1,
title: 'React.js Fundamentals',
status: '',
},
];
// many to many: id, tutor_id, course_id
const course_tutors = [
{
id: 1,
tutor_id: 1,
course_id: 1,
},
];
// id, course_id
const lessons = [
{
id: 1,
course_id: 1,
title: 'Вступительное слово. Софт скилы',
to: '/courses/1/lessons/1',
tutor: {
userId: 1,
avatar: 'https://picsum.photos/32/32/?random',
name: 'Sergey Semko',
},
resources: [
{
label: 'lesson',
value: 1,
},
{
label: 'quiz',
value: 1,
},
{
label: 'home task',
value: 2,
},
],
date: new Date(),
isComplete: true,
},
{
id: 2,
course_id: 1,
title: 'Введение в ReactJS',
to: '/courses/1/lessons/2',
tutor: {
userId: 1,
avatar: 'https://picsum.photos/32/32/?random',
name: 'Sergey Semko',
},
resources: [
{
label: 'lesson',
value: 1,
},
{
label: 'quiz',
value: 1,
},
{
label: 'home task',
value: 2,
},
],
date: new Date(),
isComplete: false,
},
{
id: 3,
course_id: 1,
title: 'Компоненты',
to: '/courses/1/lessons/3',
tutor: {
userId: 1,
avatar: 'https://picsum.photos/32/32/?random',
name: 'Sergey Semko',
},
resources: [
{
label: 'lesson',
value: 1,
},
{
label: 'quiz',
value: 1,
},
{
label: 'home task',
value: 2,
},
],
date: new Date(),
isComplete: false,
},
{
id: 4,
course_id: 1,
title: 'Состояние компонентов и пропсы',
to: '/courses/1/lessons/4',
tutor: {
userId: 1,
avatar: 'https://picsum.photos/32/32/?random',
name: 'Sergey Semko',
},
resources: [
{
label: 'lesson',
value: 1,
},
{
label: 'quiz',
value: 1,
},
{
label: 'home task',
value: 2,
},
],
date: new Date(),
isComplete: false,
},
{
id: 5,
course_id: 1,
title: 'Жизненный цикл',
to: '/courses/1/lessons/5',
tutor: {
userId: 1,
avatar: 'https://picsum.photos/32/32/?random',
name: 'Sergey Semko',
},
resources: [
{
label: 'lesson',
value: 1,
},
{
label: 'quiz',
value: 1,
},
{
label: 'home task',
value: 2,
},
],
date: new Date(),
isComplete: false,
},
];
// id, lesson_id
const exercises = [
{
id: 1,
lesson_id: 1,
title: 'Home task 1',
description:
"You will be to answer 10 questions, it isn't timed so you can take your time to answer. You can also continue from where you left off, you don't need to worry cause everything is automatically syncronized in the cloud.",
questions: [
{
id: 'react-founder',
type: QUESTION_TYPE.CHECKBOX,
title: 'Who is the creator of React.js',
options: [
{
id: '1',
value: 'Dan Abrahmov',
},
{
id: '2',
value: 'Google',
},
{
id: '3',
value: 'Facebook',
},
{
id: '4',
value: 'Traversy Media',
},
],
answers: ['3'],
},
{
id: 'vue-founder',
type: QUESTION_TYPE.CHECKBOX,
title: 'Who is the creator of Vue.js',
code: `const name = 'Josh Perez';\nconst element = <h1>Hello, {name}</h1>;\n\nReactDOM.render(\n
element,\,
document.getElementById('root')
)
`,
options: [
{
id: '1',
value: 'Evan Vue',
},
{
id: '2',
value: 'Mark Zukerberg',
},
{
id: '3',
value: 'Prince Charles',
},
{
id: '4',
value: 'Bill Gates',
},
],
answers: ['3'],
},
{
id: 'svelte-founder',
type: QUESTION_TYPE.RADIO,
title: 'Who is the creator of Svelte.js',
options: [
{
id: '1',
value: 'Hillary Svelte',
},
{
id: '2',
value: 'Mircosoft',
},
{
id: '3',
value: 'Elevate',
},
{
id: '4',
value: 'Coding Train',
},
],
answers: ['2'],
},
{
id: 'angular-founder',
type: QUESTION_TYPE.TEXTAREA,
title: 'Who is the creator of Angular.js',
value: '',
},
],
},
];
const answers = [
{
lesson_id: 1,
exercise_id: 1,
answers: {},
scores: {},
currentQuestionIndex: 0,
isFinished: false,
progressValue: 100,
status: STATUS.PENDING,
},
];
const lessonLookup = new Map();
lessons.forEach((lesson) => {
lessonLookup.set(`${lesson.id}`, JSON.stringify(lesson));
});
export function getCourse(id) {
const people = [];
return {
people,
lessons: getLessons(id),
};
}
export function getLessons(courseId) {
return lessons.filter((lesson) => lesson.course_id === courseId);
}
export function getLesson(id) {
return lookup.get(id);
}
export function getExercises(lessonId) {
return exercises.filter((exercise) => exercise.lesson_id === lessonId);
}
export function getExercise(exerciseId) {
return {
exercise: exercises.find((exercise) => exercise.id === exerciseId),
answers: answers.find((answer) => answer.exercise_id === exerciseId),
};
}
-14
View File
@@ -1,14 +0,0 @@
const lessons = [{}];
const lookup = new Map();
lessons.forEach((lesson) => {
lookup.set(`${lesson.id}`, JSON.stringify(lesson));
});
export function getLessons() {
return lessons;
}
export function getLecture(id) {
return lookup.get(id);
}
+15
View File
@@ -0,0 +1,15 @@
import { getCourse } from './_db';
function writeJsonHead(res, statusCode) {
res.writeHead(statusCode, {
'Content-Type': 'application/json',
});
}
export function get(req, res, next) {
const { id } = req.query;
writeJsonHead(res, 200);
return res.end(JSON.stringify(getCourse(id)));
}
+7 -15
View File
@@ -1,4 +1,4 @@
import { getLecture } from './_lessons';
import { getLessons } from './_db';
function writeJsonHead(res, statusCode) {
res.writeHead(statusCode, {
@@ -7,21 +7,13 @@ function writeJsonHead(res, statusCode) {
}
export function get(req, res, next) {
// the `id` parameter is available because
// this file is called [id].json.js
const { id } = req.params;
const { id } = req.query;
if (lookup.has(id)) {
writeJsonHead(res, 200);
writeJsonHead(res, 200);
res.end(lookup.get(id));
} else {
writeJsonHead(res, 404);
res.end(
JSON.stringify({
message: `Not found`,
})
);
if (id) {
return res.end(JSON.stringify(getLesson(id)));
}
return res.end(JSON.stringify(getLessons()));
}
+4 -1
View File
@@ -1,7 +1,6 @@
<script context="module">
export async function preload({ params }) {
let [courseId, courseNavItem, lessonId] = params.id;
return { courseId, courseNavItem, lessonId };
}
</script>
@@ -68,6 +67,10 @@
<div class="absolute -left-6 -top-6 success">
<IconButton
onClick={() => (lesson.isComplete = !lesson.isComplete)}
toolTipProps={{
title: `Click to ${lesson.isComplete ? 'lock' : 'unlock'}`,
direction: 'right',
}}
>
{#if lesson.isComplete}
<CheckmarkFilled24 class="carbon-icon" />
+8 -8
View File
@@ -1,12 +1,4 @@
<script context="module">
import marked from "marked";
import Vote from "../../components/Vote/index.svelte";
import HashTags from "../../components/HashTags/index.svelte";
import TextEditor from "../../components/TextEditor/index.svelte";
import CheckmarkOutline20 from "carbon-icons-svelte/lib/CheckmarkOutline20";
let userComment = "";
export async function preload({ params }) {
// the `id` parameter is available because
// this file is called [id].svelte
@@ -22,7 +14,15 @@
</script>
<script>
import marked from 'marked';
import Vote from '../../components/Vote/index.svelte';
import HashTags from '../../components/HashTags/index.svelte';
import TextEditor from '../../components/TextEditor/index.svelte';
import CheckmarkOutline20 from 'carbon-icons-svelte/lib/CheckmarkOutline20';
export let discussion;
let userComment = '';
</script>
<svelte:head>
+5
View File
@@ -0,0 +1,5 @@
export const STATUS = {
PENDING: 0,
IN_PROGRESS: 1,
REVIEWED: 2,
};