feat: introduce feed management for individual and professor modules across frontend and backend services.

This commit is contained in:
Elmar Kresse
2025-11-22 21:20:41 +01:00
parent 34ad90d50d
commit ac6e1fe0dd
21 changed files with 1655 additions and 240 deletions

View File

@@ -44,6 +44,37 @@ export async function createIndividualFeed(modules: Module[]): Promise<string> {
}
}
export async function createProfessorFeed(modules: Module[]): Promise<string> {
if (import.meta.env.SSR) {
return "";
}
try {
// Dynamic import to avoid circular dependencies or issues if pb is not initialized
const { pb } = await import("../service/pocketbase");
const response = await fetch("/api/professor/feed", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": pb.authStore.token,
},
body: JSON.stringify(modules),
});
if (
response.status === 429 ||
response.status === 500 ||
response.status != 200
) {
return Promise.reject(response.statusText);
}
return await response.json();
} catch (error) {
return Promise.reject(error);
}
}
interface FeedResponse {
modules: FeedModule[];
collectionId: string;

View File

@@ -20,6 +20,7 @@ import { defineStore } from "pinia";
const moduleStore = defineStore("moduleStore", {
state: () => ({
modules: new Map<string, Module>(),
isProfessorFeed: false,
}),
actions: {
addModule(module: Module) {
@@ -55,6 +56,9 @@ const moduleStore = defineStore("moduleStore", {
containsModule(module: Module): boolean {
return this.modules.has(module.uuid);
},
setProfessorFeed(isProf: boolean) {
this.isProfessorFeed = isProf;
},
},
});

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
<script setup lang="ts">
import moduleStore from "@/store/moduleStore.ts";
import { createIndividualFeed } from "@/api/createFeed.ts";
import { createIndividualFeed, createProfessorFeed } from "@/api/createFeed.ts";
import { router } from "@/main";
import tokenStore from "@/store/tokenStore.ts";
import { Ref, computed, inject, ref, onMounted } from "vue";
@@ -57,9 +57,14 @@ const requestIsPending = ref(false);
async function finalStep() {
requestIsPending.value = true;
const createFeed: Promise<string> = createIndividualFeed(
store.getAllModules(),
);
let createFeed: Promise<string>;
if (store.isProfessorFeed) {
createFeed = createProfessorFeed(store.getAllModules());
} else {
createFeed = createIndividualFeed(store.getAllModules());
}
// Check if createFeed Promise is resolved
createFeed.then(async (token: string) => {

View File

@@ -114,6 +114,7 @@ const createCalendar = () => {
import("../../store/moduleStore").then(({ default: useModuleStore }) => {
const store = useModuleStore();
store.removeAllModules();
store.setProfessorFeed(true);
selectedModules.value.forEach((m) => store.addModule(m));
router.push("/rename-modules");
});