source: src/lib/prof-demo-store.ts@ 50f2fb4

Last change on this file since 50f2fb4 was 298f9b3, checked in by Stefan-Saveski <stefansaveski19@…>, 8 months ago

feat: Implement professor portal with student management, grade handling, and profile display

  • Property mode set to 100644
File size: 2.5 KB
Line 
1export type UsersBySubject = {
2 Id?: string;
3 Name?: string;
4 Grade: number;
5};
6
7export type SubjectsAndUsers = {
8 Name?: string;
9 Id?: number;
10 Users: UsersBySubject[];
11};
12
13export type AddGrade = {
14 StudentId: number;
15 SubjectId: number;
16 grade: number;
17};
18
19type Store = {
20 subjects: SubjectsAndUsers[];
21};
22
23function createInitialStore(): Store {
24 return {
25 subjects: [
26 {
27 Id: 101,
28 Name: "Web Programming",
29 Users: [
30 { Id: "20001", Name: "Ana Petrovska", Grade: 0 },
31 { Id: "20002", Name: "Marko Trajkov", Grade: 8 },
32 { Id: "20003", Name: "Elena Stojanova", Grade: 0 },
33 ],
34 },
35 {
36 Id: 102,
37 Name: "Databases",
38 Users: [
39 { Id: "20001", Name: "Ana Petrovska", Grade: 0 },
40 { Id: "20004", Name: "Nikola Iliev", Grade: 9 },
41 { Id: "20005", Name: "Sara Dimitrova", Grade: 7 },
42 ],
43 },
44 {
45 Id: 103,
46 Name: "Algorithms",
47 Users: [
48 { Id: "20002", Name: "Marko Trajkov", Grade: 0 },
49 { Id: "20006", Name: "Ivana Kostova", Grade: 10 },
50 ],
51 },
52 ],
53 };
54}
55
56function getGlobalStore(): Store {
57 const globalKey = "__iknow_prof_demo_store__";
58 const globalObj = globalThis as unknown as Record<string, unknown>;
59
60 if (!globalObj[globalKey]) {
61 globalObj[globalKey] = createInitialStore();
62 }
63
64 return globalObj[globalKey] as Store;
65}
66
67export function getSubjects(): SubjectsAndUsers[] {
68 return getGlobalStore().subjects;
69}
70
71function parseStudentId(id: string | undefined): number | null {
72 if (!id) return null;
73 const parsed = Number.parseInt(id, 10);
74 return Number.isFinite(parsed) ? parsed : null;
75}
76
77export function setGrade(
78 payload: AddGrade,
79 mode: "add" | "edit" | "remove",
80): { subject: SubjectsAndUsers; user: UsersBySubject } {
81 const store = getGlobalStore();
82 const subject = store.subjects.find((s) => s.Id === payload.SubjectId);
83 if (!subject) {
84 throw new Error("Subject not found");
85 }
86
87 const user = subject.Users.find((u) => parseStudentId(u.Id) === payload.StudentId);
88 if (!user) {
89 throw new Error("Student not found in subject");
90 }
91
92 if (mode === "remove") {
93 user.Grade = 0;
94 return { subject, user };
95 }
96
97 if (payload.grade < 5 || payload.grade > 10) {
98 throw new Error("Grade must be between 5 and 10");
99 }
100
101 if (mode === "add" && user.Grade > 0) {
102 throw new Error("Grade already exists; use edit");
103 }
104
105 user.Grade = payload.grade;
106 return { subject, user };
107}
Note: See TracBrowser for help on using the repository browser.