diff --git a/frontend/src/lib/admin.ts b/frontend/src/lib/admin.ts
index 1877456b..dd32d488 100644
--- a/frontend/src/lib/admin.ts
+++ b/frontend/src/lib/admin.ts
@@ -1,4 +1,4 @@
-import { milestoneGroups } from '$lib/stores/adminStore';
+import { milestoneGroups, userQuestions } from '$lib/stores/adminStore';
export async function refreshMilestoneGroups() {
console.log('refreshMilestoneGroups...');
@@ -54,7 +54,7 @@ export async function updateMilestoneGroup(milestoneGroup) {
console.log('updateMilestoneGroup...');
console.log(milestoneGroup);
try {
- const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/milestone-groups`, {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/milestone-groups/`, {
method: 'PUT',
credentials: 'include',
headers: {
@@ -125,3 +125,98 @@ export async function deleteMilestoneGroup(milestoneGroupId: number | null) {
export function milestoneGroupImageUrl(id: number) {
return `${import.meta.env.VITE_MONDEY_API_URL}/static/mg${id}.jpg`;
}
+
+export async function refreshUserQuestions() {
+ console.log('refreshQuestions...');
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/user-questions/`, {
+ method: 'GET',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ }
+ });
+ const json = await res.json();
+ console.log(json);
+ if (res.status === 200) {
+ userQuestions.set(json);
+ } else {
+ console.log('Failed to get UserQuestions');
+ userQuestions.set([]);
+ }
+ } catch (e) {
+ console.error(e);
+ userQuestions.set([]);
+ }
+}
+
+export async function newUserQuestion() {
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/user-questions/`, {
+ method: 'POST',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ });
+ if (res.status === 200) {
+ const newUserQuestion = await res.json();
+ console.log(newUserQuestion);
+ await refreshUserQuestions();
+ return newUserQuestion;
+ } else {
+ console.log('Failed to create new Question');
+ }
+ } catch (e) {
+ console.error(e);
+ }
+}
+
+export async function updateUserQuestion(userQuestion) {
+ console.log('updateUserQuestion...');
+ console.log(userQuestion);
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/user-questions/`, {
+ method: 'PUT',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ },
+ body: JSON.stringify(userQuestion)
+ });
+ if (res.status === 200) {
+ const updatedUserQuestion = await res.json();
+ console.log(updatedUserQuestion);
+ await refreshUserQuestions();
+ return updatedUserQuestion;
+ } else {
+ console.log('Failed to create new UserQuestion');
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ return null;
+}
+
+export async function deleteUserQuestion(id: number) {
+ try {
+ const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/admin/user-questions/${id}`, {
+ method: 'DELETE',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ }
+ });
+ if (res.status === 200) {
+ await refreshUserQuestions();
+ } else {
+ console.log('Failed to delete Question');
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ return null;
+}
diff --git a/frontend/src/lib/components/Admin/AddButton.svelte b/frontend/src/lib/components/Admin/AddButton.svelte
new file mode 100644
index 00000000..4047d2d9
--- /dev/null
+++ b/frontend/src/lib/components/Admin/AddButton.svelte
@@ -0,0 +1,12 @@
+
+
+
diff --git a/frontend/src/lib/components/Admin/DeleteButton.svelte b/frontend/src/lib/components/Admin/DeleteButton.svelte
new file mode 100644
index 00000000..ed5fdc43
--- /dev/null
+++ b/frontend/src/lib/components/Admin/DeleteButton.svelte
@@ -0,0 +1,11 @@
+
+
+
diff --git a/frontend/src/lib/components/Admin/DeleteMilestoneGroupModal.svelte b/frontend/src/lib/components/Admin/DeleteModal.svelte
similarity index 57%
rename from frontend/src/lib/components/Admin/DeleteMilestoneGroupModal.svelte
rename to frontend/src/lib/components/Admin/DeleteModal.svelte
index f678fa84..0da3ba1d 100644
--- a/frontend/src/lib/components/Admin/DeleteMilestoneGroupModal.svelte
+++ b/frontend/src/lib/components/Admin/DeleteModal.svelte
@@ -1,25 +1,21 @@
- Are you sure you want to delete this MilestoneGroup?
+ {$_('admin.delete-are-you-sure')}
-
-
+
+
diff --git a/frontend/src/lib/components/Admin/EditButton.svelte b/frontend/src/lib/components/Admin/EditButton.svelte
new file mode 100644
index 00000000..899133fa
--- /dev/null
+++ b/frontend/src/lib/components/Admin/EditButton.svelte
@@ -0,0 +1,11 @@
+
+
+
diff --git a/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte b/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte
index b9cfa6f6..166db5ce 100644
--- a/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte
+++ b/frontend/src/lib/components/Admin/EditMilestoneGroupModal.svelte
@@ -9,7 +9,7 @@
Fileupload,
Modal
} from 'flowbite-svelte';
- import { lang_id, languages } from '$lib/stores/adminStore';
+ import { languages } from '$lib/stores/adminStore';
import {
updateMilestoneGroup,
uploadMilestoneGroupImage,
diff --git a/frontend/src/lib/components/Admin/EditUserQuestionModal.svelte b/frontend/src/lib/components/Admin/EditUserQuestionModal.svelte
new file mode 100644
index 00000000..82af7f3f
--- /dev/null
+++ b/frontend/src/lib/components/Admin/EditUserQuestionModal.svelte
@@ -0,0 +1,139 @@
+
+
+
+ {#if userQuestion}
+
+
+
+
+ {#each Object.values(userQuestion.text) as text}
+
+
+ {$languages[text.lang_id]}
+ {
+ userQuestion = userQuestion;
+ }}
+ placeholder="Question"
+ />
+
+
+ {/each}
+
+
+
+
+
+ {#if userQuestion.input === 'select'}
+
+
+
+
+ name
+
+
+
+ {#each Object.values(userQuestion.text) as text}
+
+
+ {$languages[text.lang_id]}
+
+
+
+ {/each}
+
+ {/if}
+
+
+
+
+
+
+
+ {#each Object.entries($languages) as [lid, lang]}
+
+ {/each}
+
+
+
+
+
+
+
{preview_answer}
+
+
+
+
+ {/if}
+
+
+
+
+
diff --git a/frontend/src/lib/components/Admin/InputPreview.svelte b/frontend/src/lib/components/Admin/InputPreview.svelte
new file mode 100644
index 00000000..ff44fb70
--- /dev/null
+++ b/frontend/src/lib/components/Admin/InputPreview.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ {#if data.input === 'select'}
+
+ {:else}
+
+ {/if}
+
diff --git a/frontend/src/lib/components/Admin/Languages.svelte b/frontend/src/lib/components/Admin/Languages.svelte
index 56c4c37c..514f179a 100644
--- a/frontend/src/lib/components/Admin/Languages.svelte
+++ b/frontend/src/lib/components/Admin/Languages.svelte
@@ -7,23 +7,26 @@
TableHead,
TableHeadCell,
Card,
- Button,
Select
} from 'flowbite-svelte';
- import { PlusOutline } from 'flowbite-svelte-icons';
import ISO6391 from 'iso-639-1';
import { _ } from 'svelte-i18n';
import type { SelectOptionType } from 'flowbite-svelte';
import { updateLanguages } from '$lib/i18n';
import { languages } from '$lib/stores/adminStore';
+ import DeleteModal from '$lib/components/Admin/DeleteModal.svelte';
+ import AddButton from '$lib/components/Admin/AddButton.svelte';
+ import DeleteButton from '$lib/components/Admin/DeleteButton.svelte';
const langCodes = ISO6391.getAllCodes();
const langNames = ISO6391.getAllNativeNames();
- const langItems = langCodes.reduce(
- (acc, k, i) => [...acc, { value: k, name: langNames[i] }],
- [] as SelectOptionType[]
- );
+ const langItems = langCodes.map((k, i) => {
+ return { value: k, name: langNames[i] };
+ }) as SelectOptionType[];
+
let selectedLang: string = '';
+ let currentLanguageId: string = '';
+ let showDeleteModal: boolean = false;
async function newLanguage() {
try {
@@ -85,12 +88,12 @@
{ISO6391.getNativeName(lang)}
-
+ {
+ currentLanguageId = id;
+ showDeleteModal = true;
+ }}
+ />
{/each}
@@ -105,11 +108,16 @@
/>
-
+
+
+ {
+ deleteLanguage(currentLanguageId);
+ }}
+>
diff --git a/frontend/src/lib/components/Admin/MilestoneGroups.svelte b/frontend/src/lib/components/Admin/MilestoneGroups.svelte
index 69e83907..934fa251 100644
--- a/frontend/src/lib/components/Admin/MilestoneGroups.svelte
+++ b/frontend/src/lib/components/Admin/MilestoneGroups.svelte
@@ -6,22 +6,25 @@
TableBodyRow,
TableHead,
TableHeadCell,
- Card,
- Button
+ Card
} from 'flowbite-svelte';
import { _ } from 'svelte-i18n';
- import { ChevronUpOutline, ChevronDownOutline, PlusOutline } from 'flowbite-svelte-icons';
+ import { ChevronUpOutline, ChevronDownOutline } from 'flowbite-svelte-icons';
import EditMilestoneGroupModal from '$lib/components/Admin/EditMilestoneGroupModal.svelte';
- import DeleteMilestoneGroupModal from '$lib/components/Admin/DeleteMilestoneGroupModal.svelte';
+ import DeleteModal from '$lib/components/Admin/DeleteModal.svelte';
+ import AddButton from '$lib/components/Admin/AddButton.svelte';
+ import EditButton from '$lib/components/Admin/EditButton.svelte';
+ import DeleteButton from '$lib/components/Admin/DeleteButton.svelte';
import { lang_id, milestoneGroups } from '$lib/stores/adminStore';
import { refreshMilestoneGroups, newMilestoneGroup, milestoneGroupImageUrl } from '$lib/admin';
import { onMount } from 'svelte';
+ import { deleteMilestoneGroup } from '$lib/admin.js';
let currentGroup: object | null = null;
let openGroupIndex: number | null = null;
let currentGroupId: number | null = null;
let showEditGroupModal: boolean = false;
- let showDeleteGroupModal: boolean = false;
+ let showDeleteModal: boolean = false;
function toggleOpenGroupIndex(index: number) {
if (openGroupIndex == index) {
@@ -47,7 +50,7 @@
- {$_('admin.milestonegroups')}
+ {$_('admin.milestone-groups')}
{#if milestoneGroups}
@@ -88,20 +91,18 @@
{title}
-
-
+ showDeleteModal = true;
+ }}
+ />
{/each}
@@ -110,9 +111,7 @@
-
+
@@ -124,5 +123,9 @@
{/key}
-
+ {
+ deleteMilestoneGroup(currentGroupId);
+ }}
+>
diff --git a/frontend/src/lib/components/Admin/UserQuestions.svelte b/frontend/src/lib/components/Admin/UserQuestions.svelte
new file mode 100644
index 00000000..37632203
--- /dev/null
+++ b/frontend/src/lib/components/Admin/UserQuestions.svelte
@@ -0,0 +1,100 @@
+
+
+
+
+ {$_('admin.user-questions')}
+
+
+
+ Question
+ Input type
+ Options
+ Actions
+
+
+ {#each $userQuestions as userQuestion, groupIndex (userQuestion.id)}
+
+
+ {userQuestion?.text[$lang_id]?.question}
+
+
+ {userQuestion?.input}
+
+
+ {userQuestion?.text[$lang_id]?.options}
+
+
+ {
+ currentUserQuestion = $userQuestions[groupIndex];
+ showEditUserQuestionModal = true;
+ }}
+ />
+ {
+ currentUserQuestionId = userQuestion.id;
+ showDeleteModal = true;
+ }}
+ />
+
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
+{#key showEditUserQuestionModal}
+
+{/key}
+ {
+ deleteUserQuestion(currentUserQuestionId);
+ }}
+>
diff --git a/frontend/src/lib/stores/adminStore.ts b/frontend/src/lib/stores/adminStore.ts
index 1e37628b..dc540e32 100644
--- a/frontend/src/lib/stores/adminStore.ts
+++ b/frontend/src/lib/stores/adminStore.ts
@@ -4,6 +4,8 @@ export const isLoggedIn = writable(false);
export const milestoneGroups = writable([]);
+export const userQuestions = writable([]);
+
export const languages: Writable> = writable({});
export const lang_id = writable('1');
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
index dd518629..076e1493 100644
--- a/frontend/src/locales/de.json
+++ b/frontend/src/locales/de.json
@@ -25,6 +25,13 @@
},
"admin": {
"languages": "Sprachen",
- "milestonegroups": "Meilensteingruppen"
+ "milestone-groups": "Meilensteingruppen",
+ "user-questions": "Benutzerfragen",
+ "add": "Hinzufügen",
+ "edit": "Bearbeiten",
+ "delete": "Löschen",
+ "delete-are-you-sure": "Möchten Sie dies wirklich löschen?",
+ "yes-sure": "Ja, ich bin sicher",
+ "no-cancel": "Nein, abbrechen"
}
}
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index 4bda8d69..4c85ca10 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -25,6 +25,13 @@
},
"admin": {
"languages": "Languages",
- "milestonegroups": "Milestone groups"
+ "milestone-groups": "Milestone groups",
+ "user-questions": "User Questions",
+ "add": "Add",
+ "edit": "Edit",
+ "delete": "Delete",
+ "delete-are-you-sure": "Are you sure you want to delete this?",
+ "yes-sure": "Yes, I'm sure",
+ "no-cancel": "No, cancel"
}
}
diff --git a/frontend/src/routes/admin/+page.svelte b/frontend/src/routes/admin/+page.svelte
index a13edad1..2c0516e9 100644
--- a/frontend/src/routes/admin/+page.svelte
+++ b/frontend/src/routes/admin/+page.svelte
@@ -3,8 +3,12 @@
import { updateLanguages } from '$lib/i18n';
import Languages from '$lib/components/Admin/Languages.svelte';
import MilestoneGroups from '$lib/components/Admin/MilestoneGroups.svelte';
+ import Questions from '$lib/components/Admin/UserQuestions.svelte';
import Login from '$lib/components/Admin/Login.svelte';
+ import { _ } from 'svelte-i18n';
import { onMount } from 'svelte';
+ import { Tabs, TabItem } from 'flowbite-svelte';
+ import { LanguageOutline, BadgeCheckOutline, ClipboardListOutline } from 'flowbite-svelte-icons';
async function updateIsLoggedIn() {
const res = await fetch(`${import.meta.env.VITE_MONDEY_API_URL}/users/me`, {
@@ -12,7 +16,10 @@
credentials: 'include'
});
if (res.status === 200) {
- isLoggedIn.set(true);
+ const user = await res.json();
+ if (user.is_superuser) {
+ isLoggedIn.set(true);
+ }
}
}
@@ -23,11 +30,32 @@
});
-
- {#if !$isLoggedIn}
+{#if !$isLoggedIn}
+
- {:else}
-
-
- {/if}
-
+
+{:else}
+
+
+
+
+ {$_('admin.milestone-groups')}
+
+
+
+
+
+
+ {$_('admin.user-questions')}
+
+
+
+
+
+
+ {$_('admin.languages')}
+
+
+
+
+{/if}
diff --git a/mondey_backend/src/mondey_backend/main.py b/mondey_backend/src/mondey_backend/main.py
index ea93808b..25d36bf7 100644
--- a/mondey_backend/src/mondey_backend/main.py
+++ b/mondey_backend/src/mondey_backend/main.py
@@ -15,6 +15,7 @@
from .routers import auth
from .routers import milestones
from .routers import research
+from .routers import questions
from .routers import users
from .settings import app_settings
@@ -31,6 +32,7 @@ def create_app() -> FastAPI:
pathlib.Path(app_settings.STATIC_FILES_PATH).mkdir(parents=True, exist_ok=True)
app = FastAPI(lifespan=lifespan, title="MONDEY API", root_path="/api")
app.include_router(milestones.create_router())
+ app.include_router(questions.create_router())
app.include_router(admin.create_router())
app.include_router(users.create_router())
app.include_router(auth.create_router())
diff --git a/mondey_backend/src/mondey_backend/models/milestones.py b/mondey_backend/src/mondey_backend/models/milestones.py
index f9e597ae..bd15e5ce 100644
--- a/mondey_backend/src/mondey_backend/models/milestones.py
+++ b/mondey_backend/src/mondey_backend/models/milestones.py
@@ -147,8 +147,6 @@ class MilestoneImagePublic(SQLModel):
approved: bool
-Text = MilestoneText | MilestoneGroupText
-
## MilestoneAnswer
diff --git a/mondey_backend/src/mondey_backend/models/questions.py b/mondey_backend/src/mondey_backend/models/questions.py
new file mode 100644
index 00000000..e9706b00
--- /dev/null
+++ b/mondey_backend/src/mondey_backend/models/questions.py
@@ -0,0 +1,54 @@
+from __future__ import annotations
+
+from sqlalchemy.orm import Mapped
+from sqlalchemy.orm import attribute_keyed_dict
+from sqlalchemy.orm import relationship
+from sqlmodel import Field
+from sqlmodel import Relationship
+from sqlmodel import SQLModel
+
+
+class UserQuestionTextBase(SQLModel):
+ question: str = ""
+ options_json: str = ""
+
+
+class UserQuestionText(UserQuestionTextBase, table=True):
+ user_question_id: int | None = Field(
+ default=None, foreign_key="userquestion.id", primary_key=True
+ )
+ lang_id: int | None = Field(
+ default=None, foreign_key="language.id", primary_key=True
+ )
+ options: str = ""
+
+
+class UserQuestionTextPublic(UserQuestionTextBase):
+ pass
+
+
+class UserQuestion(SQLModel, table=True):
+ id: int | None = Field(default=None, primary_key=True)
+ order: int = 0
+ input: str = "text"
+ options: str = ""
+ text: Mapped[dict[int, UserQuestionText]] = Relationship(
+ sa_relationship=relationship(
+ collection_class=attribute_keyed_dict("lang_id"),
+ cascade="all, delete-orphan",
+ )
+ )
+
+
+class UserQuestionPublic(SQLModel):
+ id: int
+ input: str
+ text: dict[int, UserQuestionTextPublic] = {}
+
+
+class UserQuestionAdmin(SQLModel):
+ id: int
+ order: int
+ input: str
+ options: str
+ text: dict[int, UserQuestionText] = {}
diff --git a/mondey_backend/src/mondey_backend/routers/admin.py b/mondey_backend/src/mondey_backend/routers/admin.py
index 77b091db..5b6e3cd7 100644
--- a/mondey_backend/src/mondey_backend/routers/admin.py
+++ b/mondey_backend/src/mondey_backend/routers/admin.py
@@ -16,11 +16,15 @@
from ..models.milestones import MilestoneGroupText
from ..models.milestones import MilestoneImage
from ..models.milestones import MilestoneText
+from ..models.questions import UserQuestion
+from ..models.questions import UserQuestionAdmin
+from ..models.questions import UserQuestionText
from ..settings import app_settings
from .utils import add
from .utils import get
from .utils import update_milestone_group_text
from .utils import update_milestone_text
+from .utils import update_user_question_text
from .utils import write_file
@@ -33,7 +37,7 @@ def create_language(session: SessionDep, language: LanguageCreate):
add(session, db_language)
return db_language
- @router.delete("/languages/{language_id}", response_model=Language)
+ @router.delete("/languages/{language_id}")
def delete_language(session: SessionDep, language_id: int):
language = get(session, Language, language_id)
session.delete(language)
@@ -59,7 +63,7 @@ def create_milestone_group(session: SessionDep):
session.refresh(db_milestone_group)
return db_milestone_group
- @router.put("/milestone-groups", response_model=MilestoneGroupAdmin)
+ @router.put("/milestone-groups/", response_model=MilestoneGroupAdmin)
def update_milestone_group(
session: SessionDep,
milestone_group: MilestoneGroupAdmin,
@@ -101,7 +105,7 @@ def create_milestone(session: SessionDep, milestone_group_id: int):
session.refresh(db_milestone)
return db_milestone
- @router.put("/milestones", response_model=MilestoneAdmin)
+ @router.put("/milestones/", response_model=MilestoneAdmin)
def update_milestone(
session: SessionDep,
milestone: MilestoneAdmin,
@@ -134,4 +138,42 @@ async def upload_milestone_image(
session.refresh(milestone_image)
return milestone_image
+ @router.get("/user-questions/", response_model=list[UserQuestionAdmin])
+ def get_user_questions(session: SessionDep):
+ user_questions = session.exec(
+ select(UserQuestion).order_by(col(UserQuestion.order))
+ ).all()
+ return user_questions
+
+ @router.post("/user-questions/", response_model=UserQuestionAdmin)
+ def create_user_question(session: SessionDep):
+ user_question = UserQuestion()
+ add(session, user_question)
+ for language in session.exec(select(Language)).all():
+ session.add(
+ UserQuestionText(user_question_id=user_question.id, lang_id=language.id)
+ )
+ session.commit()
+ session.refresh(user_question)
+ return user_question
+
+ @router.put("/user-questions/", response_model=UserQuestionAdmin)
+ def update_user_question(
+ session: SessionDep,
+ user_question: UserQuestionAdmin,
+ ):
+ db_user_question = get(session, UserQuestion, user_question.id)
+ for key, value in user_question.model_dump(exclude={"text"}).items():
+ setattr(db_user_question, key, value)
+ update_user_question_text(session, user_question)
+ add(session, db_user_question)
+ return db_user_question
+
+ @router.delete("/user-questions/{user_question_id}")
+ def delete_question(session: SessionDep, user_question_id: int):
+ question = get(session, UserQuestion, user_question_id)
+ session.delete(question)
+ session.commit()
+ return {"ok": True}
+
return router
diff --git a/mondey_backend/src/mondey_backend/routers/questions.py b/mondey_backend/src/mondey_backend/routers/questions.py
new file mode 100644
index 00000000..73f9fd91
--- /dev/null
+++ b/mondey_backend/src/mondey_backend/routers/questions.py
@@ -0,0 +1,24 @@
+from __future__ import annotations
+
+from fastapi import APIRouter
+from sqlmodel import col
+from sqlmodel import select
+
+from ..dependencies import SessionDep
+from ..models.questions import UserQuestion
+from ..models.questions import UserQuestionPublic
+
+
+def create_router() -> APIRouter:
+ router = APIRouter(tags=["questions"])
+
+ @router.get("/user-questions/", response_model=list[UserQuestionPublic])
+ def get_user_questions(
+ session: SessionDep,
+ ):
+ user_questions = session.exec(
+ select(UserQuestion).order_by(col(UserQuestion.order))
+ ).all()
+ return user_questions
+
+ return router
diff --git a/mondey_backend/src/mondey_backend/routers/users.py b/mondey_backend/src/mondey_backend/routers/users.py
index e0df7fd6..e04bcf23 100644
--- a/mondey_backend/src/mondey_backend/routers/users.py
+++ b/mondey_backend/src/mondey_backend/routers/users.py
@@ -10,4 +10,5 @@
def create_router() -> APIRouter:
router = APIRouter(prefix="/users", tags=["users"])
router.include_router(fastapi_users.get_users_router(UserRead, UserUpdate))
+
return router
diff --git a/mondey_backend/src/mondey_backend/routers/utils.py b/mondey_backend/src/mondey_backend/routers/utils.py
index 81359328..1c5aee79 100644
--- a/mondey_backend/src/mondey_backend/routers/utils.py
+++ b/mondey_backend/src/mondey_backend/routers/utils.py
@@ -12,7 +12,10 @@
from ..models.milestones import MilestoneGroupAdmin
from ..models.milestones import MilestoneGroupText
from ..models.milestones import MilestoneText
-from ..models.milestones import Text
+from ..models.questions import UserQuestionAdmin
+from ..models.questions import UserQuestionText
+
+Text = MilestoneText | MilestoneGroupText | UserQuestionText
def write_file(file: UploadFile, filename: str):
@@ -66,3 +69,9 @@ def update_milestone_group_text(
_update_text(
session, MilestoneGroupText, milestone_group.text.values(), milestone_group.id
)
+
+
+def update_user_question_text(session: SessionDep, user_question: UserQuestionAdmin):
+ _update_text(
+ session, UserQuestionText, user_question.text.values(), user_question.id
+ )
diff --git a/mondey_backend/src/mondey_backend/settings.py b/mondey_backend/src/mondey_backend/settings.py
index aa9f1537..5db58b6d 100644
--- a/mondey_backend/src/mondey_backend/settings.py
+++ b/mondey_backend/src/mondey_backend/settings.py
@@ -17,7 +17,7 @@ class AppSettings(BaseSettings):
HOST: str = "localhost"
PORT: int = 8000
RELOAD: bool = True
- LOG_LEVEL: str = "info"
+ LOG_LEVEL: str = "debug"
COOKIE_SECURE: bool = False