feat: implement pbUpsert helper for streamlined database operations and update related functions
This commit is contained in:
@@ -1,5 +1,15 @@
|
||||
import { pb } from './pb';
|
||||
|
||||
// Upsert helper: update existing record if found, otherwise create.
|
||||
async function pbUpsert(collection, filter, updateData, createData) {
|
||||
try {
|
||||
const r = await pb.collection(collection).getFirstListItem(filter);
|
||||
return pb.collection(collection).update(r.id, updateData);
|
||||
} catch {
|
||||
return pb.collection(collection).create(createData);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Topics ──────────────────────────────────────────────────────────────────
|
||||
|
||||
export async function getTopics() {
|
||||
@@ -72,13 +82,8 @@ export async function getContent(topicId) {
|
||||
} catch { return null; }
|
||||
}
|
||||
|
||||
export async function setContent(topicId, data) {
|
||||
try {
|
||||
const r = await pb.collection('content').getFirstListItem(`topic_id="${topicId}"`);
|
||||
return pb.collection('content').update(r.id, { data });
|
||||
} catch {
|
||||
return pb.collection('content').create({ topic_id: topicId, data });
|
||||
}
|
||||
export function setContent(topicId, data) {
|
||||
return pbUpsert('content', `topic_id="${topicId}"`, { data }, { topic_id: topicId, data });
|
||||
}
|
||||
|
||||
export async function deleteContent(topicId) {
|
||||
@@ -102,13 +107,8 @@ export async function getQuizBank(topicId) {
|
||||
} catch { return []; }
|
||||
}
|
||||
|
||||
export async function setQuizBank(topicId, questions) {
|
||||
try {
|
||||
const r = await pb.collection('quiz_banks').getFirstListItem(`topic_id="${topicId}"`);
|
||||
return pb.collection('quiz_banks').update(r.id, { questions });
|
||||
} catch {
|
||||
return pb.collection('quiz_banks').create({ topic_id: topicId, questions });
|
||||
}
|
||||
export function setQuizBank(topicId, questions) {
|
||||
return pbUpsert('quiz_banks', `topic_id="${topicId}"`, { questions }, { topic_id: topicId, questions });
|
||||
}
|
||||
|
||||
export async function deleteQuestionFromBank(topicId, questionId) {
|
||||
@@ -186,17 +186,10 @@ export async function getCachedQuiz(userId, weekNumber) {
|
||||
} catch { return null; }
|
||||
}
|
||||
|
||||
export async function setCachedQuiz(userId, weekNumber, quiz) {
|
||||
try {
|
||||
const r = await pb.collection('quiz_cache').getFirstListItem(
|
||||
`user_id="${userId}" && week_number=${weekNumber}`
|
||||
);
|
||||
return pb.collection('quiz_cache').update(r.id, { questions: quiz.questions, meta: quiz.meta });
|
||||
} catch {
|
||||
return pb.collection('quiz_cache').create({
|
||||
user_id: userId, week_number: weekNumber, questions: quiz.questions, meta: quiz.meta,
|
||||
});
|
||||
}
|
||||
export function setCachedQuiz(userId, weekNumber, quiz) {
|
||||
const data = { questions: quiz.questions, meta: quiz.meta };
|
||||
return pbUpsert('quiz_cache', `user_id="${userId}" && week_number=${weekNumber}`,
|
||||
data, { user_id: userId, week_number: weekNumber, ...data });
|
||||
}
|
||||
|
||||
// ── Learn Progress ────────────────────────────────────────────────────────────
|
||||
@@ -210,15 +203,9 @@ export async function getLearnDone(userId, weekNumber) {
|
||||
} catch { return false; }
|
||||
}
|
||||
|
||||
export async function setLearnDone(userId, weekNumber) {
|
||||
try {
|
||||
const r = await pb.collection('learn_progress').getFirstListItem(
|
||||
`user_id="${userId}" && week_number=${weekNumber}`
|
||||
);
|
||||
return pb.collection('learn_progress').update(r.id, { done: true });
|
||||
} catch {
|
||||
return pb.collection('learn_progress').create({ user_id: userId, week_number: weekNumber, done: true });
|
||||
}
|
||||
export function setLearnDone(userId, weekNumber) {
|
||||
return pbUpsert('learn_progress', `user_id="${userId}" && week_number=${weekNumber}`,
|
||||
{ done: true }, { user_id: userId, week_number: weekNumber, done: true });
|
||||
}
|
||||
|
||||
// ── Leaderboard ───────────────────────────────────────────────────────────────
|
||||
@@ -255,13 +242,8 @@ export async function getSetting(key, defaultValue = null) {
|
||||
} catch { return defaultValue; }
|
||||
}
|
||||
|
||||
export async function setSetting(key, value) {
|
||||
try {
|
||||
const r = await pb.collection('settings').getFirstListItem(`key="${key}"`);
|
||||
return pb.collection('settings').update(r.id, { value: String(value) });
|
||||
} catch {
|
||||
return pb.collection('settings').create({ key, value: String(value) });
|
||||
}
|
||||
export function setSetting(key, value) {
|
||||
return pbUpsert('settings', `key="${key}"`, { value: String(value) }, { key, value: String(value) });
|
||||
}
|
||||
|
||||
// ── Curriculum ────────────────────────────────────────────────────────────────
|
||||
@@ -283,19 +265,9 @@ export async function getCurriculumWeek(year, weekNumber) {
|
||||
} catch { return null; }
|
||||
}
|
||||
|
||||
export async function setCurriculumWeek(year, weekNumber, data) {
|
||||
try {
|
||||
const r = await pb.collection('curriculum').getFirstListItem(
|
||||
`year=${year} && week_number=${weekNumber}`
|
||||
);
|
||||
return pb.collection('curriculum').update(r.id, data);
|
||||
} catch {
|
||||
return pb.collection('curriculum').create({
|
||||
year,
|
||||
week_number: weekNumber,
|
||||
...data,
|
||||
});
|
||||
}
|
||||
export function setCurriculumWeek(year, weekNumber, data) {
|
||||
return pbUpsert('curriculum', `year=${year} && week_number=${weekNumber}`,
|
||||
data, { year, week_number: weekNumber, ...data });
|
||||
}
|
||||
|
||||
export async function deleteCurriculumWeek(year, weekNumber) {
|
||||
|
||||
Reference in New Issue
Block a user