@studious-lms/server 1.24.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/data/curriculum/nepal-cdc-g4-g5/subjects/english.json +4 -4
  2. package/data/curriculum/nepal-cdc-g4-g5/subjects/mathematics.json +1 -1
  3. package/data/curriculum/nepal-cdc-g4-g5/subjects/science-technology.json +4 -4
  4. package/data/curriculum/nepal-cdc-g4-g5/subjects/social-studies.json +4 -4
  5. package/dist/models/attendance.d.ts.map +1 -1
  6. package/dist/models/attendance.js +17 -14
  7. package/dist/models/attendance.js.map +1 -1
  8. package/dist/models/marketplace.d.ts +37 -0
  9. package/dist/models/marketplace.d.ts.map +1 -1
  10. package/dist/models/marketplace.js +10 -2
  11. package/dist/models/marketplace.js.map +1 -1
  12. package/dist/models/module.d.ts +228 -0
  13. package/dist/models/module.d.ts.map +1 -0
  14. package/dist/models/module.js +69 -0
  15. package/dist/models/module.js.map +1 -0
  16. package/dist/models/moduleItem.d.ts +5 -1
  17. package/dist/models/moduleItem.d.ts.map +1 -1
  18. package/dist/models/moduleItem.js +19 -4
  19. package/dist/models/moduleItem.js.map +1 -1
  20. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
  21. package/dist/pipelines/gradeWorksheet.js +4 -2
  22. package/dist/pipelines/gradeWorksheet.js.map +1 -1
  23. package/dist/routers/_app.d.ts +768 -6
  24. package/dist/routers/_app.d.ts.map +1 -1
  25. package/dist/routers/_app.js +4 -2
  26. package/dist/routers/_app.js.map +1 -1
  27. package/dist/routers/fees.d.ts +1 -1
  28. package/dist/routers/marketplace.d.ts +41 -0
  29. package/dist/routers/marketplace.d.ts.map +1 -1
  30. package/dist/routers/marketplace.js +13 -3
  31. package/dist/routers/marketplace.js.map +1 -1
  32. package/dist/routers/module.d.ts +345 -0
  33. package/dist/routers/module.d.ts.map +1 -0
  34. package/dist/routers/module.js +82 -0
  35. package/dist/routers/module.js.map +1 -0
  36. package/dist/routers/moduleItem.d.ts.map +1 -1
  37. package/dist/routers/moduleItem.js +7 -6
  38. package/dist/routers/moduleItem.js.map +1 -1
  39. package/dist/routers/parent.d.ts +2 -1
  40. package/dist/routers/parent.d.ts.map +1 -1
  41. package/dist/routers/school.d.ts +1 -1
  42. package/dist/routers/school.d.ts.map +1 -1
  43. package/dist/routers/school.js +14 -4
  44. package/dist/routers/school.js.map +1 -1
  45. package/dist/services/academicCalendar.d.ts.map +1 -1
  46. package/dist/services/academicCalendar.js +30 -2
  47. package/dist/services/academicCalendar.js.map +1 -1
  48. package/dist/services/assignment.d.ts.map +1 -1
  49. package/dist/services/assignment.js +8 -3
  50. package/dist/services/assignment.js.map +1 -1
  51. package/dist/services/attendance.d.ts +6 -2
  52. package/dist/services/attendance.d.ts.map +1 -1
  53. package/dist/services/attendance.js +8 -4
  54. package/dist/services/attendance.js.map +1 -1
  55. package/dist/services/class.d.ts +14 -9
  56. package/dist/services/class.d.ts.map +1 -1
  57. package/dist/services/class.js +4 -4
  58. package/dist/services/class.js.map +1 -1
  59. package/dist/services/fees.d.ts.map +1 -1
  60. package/dist/services/fees.js +24 -4
  61. package/dist/services/fees.js.map +1 -1
  62. package/dist/services/feesAuthz.d.ts +2 -5
  63. package/dist/services/feesAuthz.d.ts.map +1 -1
  64. package/dist/services/feesAuthz.js +5 -8
  65. package/dist/services/feesAuthz.js.map +1 -1
  66. package/dist/services/marketplace.d.ts +36 -0
  67. package/dist/services/marketplace.d.ts.map +1 -1
  68. package/dist/services/marketplace.js +36 -6
  69. package/dist/services/marketplace.js.map +1 -1
  70. package/dist/services/module.d.ts +288 -0
  71. package/dist/services/module.d.ts.map +1 -0
  72. package/dist/services/module.js +518 -0
  73. package/dist/services/module.js.map +1 -0
  74. package/dist/services/moduleItem.d.ts.map +1 -1
  75. package/dist/services/moduleItem.js +23 -7
  76. package/dist/services/moduleItem.js.map +1 -1
  77. package/dist/services/parentPortal.d.ts +3 -5
  78. package/dist/services/parentPortal.d.ts.map +1 -1
  79. package/dist/services/parentPortal.js +29 -43
  80. package/dist/services/parentPortal.js.map +1 -1
  81. package/dist/services/school.d.ts.map +1 -1
  82. package/dist/services/school.js +52 -16
  83. package/dist/services/school.js.map +1 -1
  84. package/dist/services/studentImport.d.ts.map +1 -1
  85. package/dist/services/studentImport.js +38 -25
  86. package/dist/services/studentImport.js.map +1 -1
  87. package/dist/services/transcript.d.ts +2 -3
  88. package/dist/services/transcript.d.ts.map +1 -1
  89. package/dist/services/transcript.js +13 -25
  90. package/dist/services/transcript.js.map +1 -1
  91. package/package.json +1 -1
  92. package/prisma/migrations/20260708013000_add_modules/migration.sql +100 -0
  93. package/prisma/schema.prisma +93 -0
  94. package/scripts/import-nepal-cdc-curriculum.ts +29 -6
  95. package/src/models/attendance.ts +10 -12
  96. package/src/models/marketplace.ts +19 -0
  97. package/src/models/module.ts +77 -0
  98. package/src/models/moduleItem.ts +20 -2
  99. package/src/pipelines/gradeWorksheet.ts +6 -0
  100. package/src/routers/_app.ts +2 -0
  101. package/src/routers/marketplace.ts +16 -0
  102. package/src/routers/module.ts +118 -0
  103. package/src/routers/moduleItem.ts +6 -4
  104. package/src/routers/school.ts +16 -6
  105. package/src/services/academicCalendar.ts +28 -0
  106. package/src/services/assignment.ts +12 -1
  107. package/src/services/attendance.ts +7 -3
  108. package/src/services/class.ts +2 -2
  109. package/src/services/fees.ts +25 -2
  110. package/src/services/feesAuthz.ts +3 -7
  111. package/src/services/marketplace.ts +47 -3
  112. package/src/services/module.ts +683 -0
  113. package/src/services/moduleItem.ts +28 -4
  114. package/src/services/parentPortal.ts +26 -39
  115. package/src/services/school.ts +52 -15
  116. package/src/services/studentImport.ts +37 -25
  117. package/src/services/transcript.ts +11 -23
@@ -1548,7 +1548,7 @@
1548
1548
  "criteria": [
1549
1549
  {
1550
1550
  "id": "lo-1",
1551
- "title": "1. [Listening] Identify specific information (e.g., time, place, person and date) from the texts on familiar topics of e",
1551
+ "title": "1. [Listening] Identify specific information (e.g., time, place, person and date) from the texts on familiar topics of everyday life",
1552
1552
  "description": "Identify specific information (e.g., time, place, person and date) from the texts on familiar topics of everyday life",
1553
1553
  "levels": [
1554
1554
  {
@@ -3583,8 +3583,8 @@
3583
3583
  "criteria": [
3584
3584
  {
3585
3585
  "id": "lo-1",
3586
- "title": "1. [Listening] Listen and retrieve specific information form a short and simple conversation",
3587
- "description": "Listen and retrieve specific information form a short and simple conversation",
3586
+ "title": "1. [Listening] Listen and retrieve specific information from a short and simple conversation",
3587
+ "description": "Listen and retrieve specific information from a short and simple conversation",
3588
3588
  "levels": [
3589
3589
  {
3590
3590
  "id": "advanced",
@@ -5264,7 +5264,7 @@
5264
5264
  },
5265
5265
  {
5266
5266
  "id": "lo-5",
5267
- "title": "5. [Writing] Write a fact-based paragraph (describing people, places and animals) using appropriate punctuation marks (f",
5267
+ "title": "5. [Writing] Write a fact-based paragraph (describing people, places and animals) using appropriate punctuation marks (full stops, commas, question marks, etc.)",
5268
5268
  "description": "Write a fact-based paragraph (describing people, places and animals) using appropriate punctuation marks (full stops, commas, question marks, etc.)",
5269
5269
  "levels": [
5270
5270
  {
@@ -207,7 +207,7 @@
207
207
  "criteria": [
208
208
  {
209
209
  "id": "lo-1",
210
- "title": "1. Present, read and write numbers up to seven digits using place-value tables (Dev",
210
+ "title": "1. Present, read and write numbers up to seven digits using place-value tables (Devanagari and Hindu-Arabic)",
211
211
  "description": "Present, read and write numbers up to seven digits using place-value tables (Devanagari and Hindu-Arabic)",
212
212
  "levels": [
213
213
  {
@@ -27,7 +27,7 @@
27
27
  "criteria": [
28
28
  {
29
29
  "id": "lo-1",
30
- "title": "1. Carry out basic observation, classification and testing activities in scientific",
30
+ "title": "1. Carry out basic observation, classification and testing activities in scientific study and find their importance",
31
31
  "description": "Carry out basic observation, classification and testing activities in scientific study and find their importance",
32
32
  "levels": [
33
33
  {
@@ -246,7 +246,7 @@
246
246
  "criteria": [
247
247
  {
248
248
  "id": "lo-1",
249
- "title": "1. Identify newspaper, letter, notice board, TV, radio, telephone and mobile phone ",
249
+ "title": "1. Identify newspaper, letter, notice board, TV, radio, telephone and mobile phone as sources of information and communication",
250
250
  "description": "Identify newspaper, letter, notice board, TV, radio, telephone and mobile phone as sources of information and communication",
251
251
  "levels": [
252
252
  {
@@ -363,7 +363,7 @@
363
363
  },
364
364
  {
365
365
  "id": "lo-4",
366
- "title": "4. Adopt personal safety measures when using computers and mobile phones, and follo",
366
+ "title": "4. Adopt personal safety measures when using computers and mobile phones, and follow computer safety practices",
367
367
  "description": "Adopt personal safety measures when using computers and mobile phones, and follow computer safety practices",
368
368
  "levels": [
369
369
  {
@@ -465,7 +465,7 @@
465
465
  "criteria": [
466
466
  {
467
467
  "id": "lo-1",
468
- "title": "1. Identify environmental factors affecting living beings (light, heat, air, water,",
468
+ "title": "1. Identify environmental factors affecting living beings (light, heat, air, water, soil and other living beings)",
469
469
  "description": "Identify environmental factors affecting living beings (light, heat, air, water, soil and other living beings)",
470
470
  "levels": [
471
471
  {
@@ -144,7 +144,7 @@
144
144
  },
145
145
  {
146
146
  "id": "lo-4",
147
- "title": "4. Identify materials used in various occupations/businesses, use them safely and t",
147
+ "title": "4. Identify materials used in various occupations/businesses, use them safely and take care of them",
148
148
  "description": "Identify materials used in various occupations/businesses, use them safely and take care of them",
149
149
  "levels": [
150
150
  {
@@ -285,7 +285,7 @@
285
285
  },
286
286
  {
287
287
  "id": "lo-3",
288
- "title": "3. Identify and respect the languages, costumes, lifestyles and festivals of one's ",
288
+ "title": "3. Identify and respect the languages, costumes, lifestyles and festivals of one's community",
289
289
  "description": "Identify and respect the languages, costumes, lifestyles and festivals of one's community",
290
290
  "levels": [
291
291
  {
@@ -363,7 +363,7 @@
363
363
  },
364
364
  {
365
365
  "id": "lo-5",
366
- "title": "5. Give a general introduction to some national heritages and draw inspiration from",
366
+ "title": "5. Give a general introduction to some national heritages and draw inspiration from them",
367
367
  "description": "Give a general introduction to some national heritages and draw inspiration from them",
368
368
  "levels": [
369
369
  {
@@ -504,7 +504,7 @@
504
504
  },
505
505
  {
506
506
  "id": "lo-3",
507
- "title": "3. Identify local public properties and participate in their proper use and conserv",
507
+ "title": "3. Identify local public properties and participate in their proper use and conservation",
508
508
  "description": "Identify local public properties and participate in their proper use and conservation",
509
509
  "levels": [
510
510
  {
@@ -1 +1 @@
1
- {"version":3,"file":"attendance.d.ts","sourceRoot":"/","sources":["models/attendance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attendance.d.ts","sourceRoot":"/","sources":["models/attendance.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="04968f1d-49ec-52b6-ab2b-a86286e300ce")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ac666668-c4fd-5607-832e-a8cac0ace37d")}catch(e){}}();
3
3
  import { prisma } from "../lib/prisma.js";
4
4
  import { classTeacherOrSchoolAdminWhere } from "./access.js";
5
5
  const studentProfileSelect = {
@@ -287,18 +287,21 @@ export async function updateAttendance(id, data) {
287
287
  }
288
288
  function buildRecordsFromLists(input) {
289
289
  const records = [];
290
- for (const studentId of input.presentIds) {
291
- records.push({ studentId, status: "PRESENT", updatedById: input.updatedById });
292
- }
293
- for (const studentId of input.lateIds) {
294
- records.push({ studentId, status: "LATE", updatedById: input.updatedById });
295
- }
296
- for (const studentId of input.absentIds) {
297
- records.push({ studentId, status: "ABSENT", updatedById: input.updatedById });
298
- }
299
- for (const studentId of input.excusedIds) {
300
- records.push({ studentId, status: "EXCUSED", updatedById: input.updatedById });
301
- }
290
+ const seen = new Set();
291
+ const pushUnique = (studentId, status) => {
292
+ if (seen.has(studentId))
293
+ return;
294
+ seen.add(studentId);
295
+ records.push({ studentId, status, updatedById: input.updatedById });
296
+ };
297
+ for (const studentId of input.presentIds)
298
+ pushUnique(studentId, "PRESENT");
299
+ for (const studentId of input.lateIds)
300
+ pushUnique(studentId, "LATE");
301
+ for (const studentId of input.absentIds)
302
+ pushUnique(studentId, "ABSENT");
303
+ for (const studentId of input.excusedIds)
304
+ pushUnique(studentId, "EXCUSED");
302
305
  return records;
303
306
  }
304
307
  /** Active (non-revoked) excusals covering a calendar date for given students. */
@@ -670,4 +673,4 @@ export function endOfUtcDay(date) {
670
673
  return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 23, 59, 59, 999));
671
674
  }
672
675
  //# sourceMappingURL=attendance.js.map
673
- //# debugId=04968f1d-49ec-52b6-ab2b-a86286e300ce
676
+ //# debugId=ac666668-c4fd-5607-832e-a8cac0ace37d
@@ -1 +1 @@
1
- {"version":3,"file":"attendance.js","sources":["models/attendance.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Attendance model – session-level lists + per-student AttendanceRecord,\n * and school-scoped StudentExcusal persistence.\n */\nimport { AttendanceStatus, Prisma } from \"@prisma/client\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { classTeacherOrSchoolAdminWhere } from \"./access.js\";\n\nconst studentProfileSelect = {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n bio: true,\n location: true,\n website: true,\n },\n },\n} as const;\n\nconst attendanceInclude = {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n color: true,\n },\n },\n present: { select: studentProfileSelect },\n late: { select: studentProfileSelect },\n absent: { select: studentProfileSelect },\n records: {\n select: {\n id: true,\n studentId: true,\n status: true,\n note: true,\n excusedByExcusalId: true,\n updatedById: true,\n updatedAt: true,\n student: { select: studentProfileSelect },\n excusedByExcusal: {\n select: {\n id: true,\n reason: true,\n note: true,\n startDate: true,\n endDate: true,\n revokedAt: true,\n },\n },\n },\n },\n} as const;\n\nconst attendanceUpdateInclude = {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n },\n },\n present: { select: { id: true, username: true } },\n late: { select: { id: true, username: true } },\n absent: { select: { id: true, username: true } },\n records: {\n select: {\n id: true,\n studentId: true,\n status: true,\n note: true,\n excusedByExcusalId: true,\n updatedById: true,\n updatedAt: true,\n student: { select: { id: true, username: true } },\n excusedByExcusal: {\n select: { id: true, reason: true, note: true },\n },\n },\n },\n} as const;\n\nconst excusalInclude = {\n students: {\n select: {\n studentId: true,\n student: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n },\n },\n createdBy: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n revokedBy: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n} as const;\n\n/** @returns Class with students for attendance. */\nexport function findClassWithStudents(classId: string) {\n return prisma.class.findUnique({\n where: { id: classId },\n select: {\n id: true,\n schoolId: true,\n students: {\n select: studentProfileSelect,\n },\n },\n });\n}\n\n/** @returns Class if user is a teacher or school admin. */\nexport function findClassWithTeacher(classId: string, teacherId: string) {\n return prisma.class.findFirst({\n where: {\n id: classId,\n ...classTeacherOrSchoolAdminWhere(teacherId),\n },\n select: {\n id: true,\n name: true,\n schoolId: true,\n students: { select: { id: true } },\n },\n });\n}\n\n/** @returns Events for a class. */\nexport function findEventsByClassId(classId: string) {\n return prisma.event.findMany({\n where: { classId },\n });\n}\n\n/** @returns Attendance record for an event. */\nexport function findAttendanceByEventId(eventId: string) {\n return prisma.attendance.findFirst({\n where: { eventId },\n include: {\n records: {\n select: {\n studentId: true,\n status: true,\n excusedByExcusalId: true,\n },\n },\n },\n });\n}\n\n/** @returns Attendance for class and event (eventId null = class-level). */\nexport function findAttendanceByClassAndEvent(classId: string, eventId: string | null) {\n return prisma.attendance.findFirst({\n where: {\n classId,\n eventId,\n },\n include: {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n },\n },\n late: { select: { id: true } },\n absent: { select: { id: true } },\n records: {\n select: {\n studentId: true,\n status: true,\n excusedByExcusalId: true,\n note: true,\n },\n },\n },\n });\n}\n\n/** @returns Attendance records for class, optionally filtered by event. */\nexport function findManyAttendance(classId: string, eventId?: string) {\n return prisma.attendance.findMany({\n where: {\n classId,\n ...(eventId ? { eventId } : {}),\n },\n include: attendanceInclude,\n orderBy: { date: \"desc\" },\n });\n}\n\n/** Create an attendance session with legacy lists + per-student records. */\nexport function createAttendance(data: {\n classId: string;\n eventId?: string | null;\n date?: Date;\n presentIds: string[];\n lateIds?: string[];\n absentIds?: string[];\n excusedIds?: string[];\n records?: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n updatedById?: string | null;\n}) {\n const lateIds = data.lateIds ?? [];\n const absentIds = data.absentIds ?? [];\n const excusedIds = data.excusedIds ?? [];\n const records: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }> =\n data.records ??\n buildRecordsFromLists({\n presentIds: data.presentIds,\n lateIds,\n absentIds,\n excusedIds,\n updatedById: data.updatedById,\n });\n\n return prisma.attendance.create({\n data: {\n classId: data.classId,\n eventId: data.eventId ?? undefined,\n date: data.date ?? new Date(),\n present: { connect: data.presentIds.map((id) => ({ id })) },\n late: lateIds.length ? { connect: lateIds.map((id) => ({ id })) } : undefined,\n absent: absentIds.length ? { connect: absentIds.map((id) => ({ id })) } : undefined,\n records: {\n create: records.map((record) => ({\n studentId: record.studentId,\n status: record.status,\n note: record.note ?? undefined,\n excusedByExcusalId: record.excusedByExcusalId ?? undefined,\n updatedById: record.updatedById ?? data.updatedById ?? undefined,\n })),\n },\n },\n include: attendanceUpdateInclude,\n });\n}\n\n/** Create attendance for a specific event. */\nexport function createAttendanceForEvent(data: {\n classId: string;\n eventId: string;\n date?: Date;\n presentIds: string[];\n lateIds?: string[];\n absentIds?: string[];\n excusedIds?: string[];\n records?: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n}) {\n return createAttendance({\n classId: data.classId,\n eventId: data.eventId,\n date: data.date,\n presentIds: data.presentIds,\n lateIds: data.lateIds,\n absentIds: data.absentIds,\n excusedIds: data.excusedIds,\n records: data.records,\n });\n}\n\n/** Update attendance present/late/absent lists and sync per-student records. */\nexport async function updateAttendance(\n id: string,\n data: {\n presentIds: string[];\n lateIds: string[];\n absentIds: string[];\n records: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n }\n) {\n const studentIds = data.records.map((r) => r.studentId);\n\n return prisma.$transaction(async (tx) => {\n // Replace per-student rows for students in this update set.\n await tx.attendanceRecord.deleteMany({\n where: {\n attendanceId: id,\n studentId: { in: studentIds },\n },\n });\n\n if (data.records.length > 0) {\n await tx.attendanceRecord.createMany({\n data: data.records.map((record) => ({\n attendanceId: id,\n studentId: record.studentId,\n status: record.status,\n note: record.note ?? null,\n excusedByExcusalId: record.excusedByExcusalId ?? null,\n updatedById: record.updatedById ?? null,\n })),\n });\n }\n\n return tx.attendance.update({\n where: { id },\n data: {\n present: { set: data.presentIds.map((id) => ({ id })) },\n late: { set: data.lateIds.map((id) => ({ id })) },\n absent: { set: data.absentIds.map((id) => ({ id })) },\n },\n include: attendanceUpdateInclude,\n });\n });\n}\n\nfunction buildRecordsFromLists(input: {\n presentIds: string[];\n lateIds: string[];\n absentIds: string[];\n excusedIds: string[];\n updatedById?: string | null;\n}) {\n const records: Array<{\n studentId: string;\n status: AttendanceStatus;\n updatedById?: string | null;\n }> = [];\n for (const studentId of input.presentIds) {\n records.push({ studentId, status: \"PRESENT\", updatedById: input.updatedById });\n }\n for (const studentId of input.lateIds) {\n records.push({ studentId, status: \"LATE\", updatedById: input.updatedById });\n }\n for (const studentId of input.absentIds) {\n records.push({ studentId, status: \"ABSENT\", updatedById: input.updatedById });\n }\n for (const studentId of input.excusedIds) {\n records.push({ studentId, status: \"EXCUSED\", updatedById: input.updatedById });\n }\n return records;\n}\n\n/** Active (non-revoked) excusals covering a calendar date for given students. */\nexport function findActiveExcusalsForStudents(input: {\n schoolId: string;\n studentIds: string[];\n date: Date;\n}) {\n if (input.studentIds.length === 0) {\n return Promise.resolve([]);\n }\n\n const day = toDateOnly(input.date);\n\n return prisma.studentExcusal.findMany({\n where: {\n schoolId: input.schoolId,\n revokedAt: null,\n startDate: { lte: day },\n endDate: { gte: day },\n students: { some: { studentId: { in: input.studentIds } } },\n },\n include: {\n students: { select: { studentId: true } },\n },\n });\n}\n\n/** Active excusals overlapping a date range for school students. */\nexport function findActiveExcusalsInRange(input: {\n schoolId: string;\n studentIds?: string[];\n startDate: Date;\n endDate: Date;\n}) {\n const start = toDateOnly(input.startDate);\n const end = toDateOnly(input.endDate);\n\n return prisma.studentExcusal.findMany({\n where: {\n schoolId: input.schoolId,\n revokedAt: null,\n startDate: { lte: end },\n endDate: { gte: start },\n ...(input.studentIds?.length\n ? { students: { some: { studentId: { in: input.studentIds } } } }\n : {}),\n },\n include: {\n students: { select: { studentId: true } },\n },\n });\n}\n\nexport function listExcusalsForSchool(input: {\n schoolId: string;\n includeRevoked?: boolean;\n studentId?: string;\n}) {\n return prisma.studentExcusal.findMany({\n where: {\n schoolId: input.schoolId,\n ...(input.includeRevoked ? {} : { revokedAt: null }),\n ...(input.studentId\n ? { students: { some: { studentId: input.studentId } } }\n : {}),\n },\n include: excusalInclude,\n orderBy: [{ startDate: \"desc\" }, { createdAt: \"desc\" }],\n });\n}\n\nexport function findExcusalById(excusalId: string) {\n return prisma.studentExcusal.findUnique({\n where: { id: excusalId },\n include: {\n ...excusalInclude,\n students: { select: { studentId: true } },\n },\n });\n}\n\nexport function createStudentExcusal(data: {\n schoolId: string;\n studentIds: string[];\n startDate: Date;\n endDate: Date;\n reason: string;\n note?: string | null;\n createdById: string;\n}) {\n return prisma.studentExcusal.create({\n data: {\n schoolId: data.schoolId,\n startDate: toDateOnly(data.startDate),\n endDate: toDateOnly(data.endDate),\n reason: data.reason,\n note: data.note ?? null,\n createdById: data.createdById,\n students: {\n create: data.studentIds.map((studentId) => ({ studentId })),\n },\n },\n include: excusalInclude,\n });\n}\n\nexport function updateStudentExcusal(\n excusalId: string,\n data: {\n studentIds?: string[];\n startDate?: Date;\n endDate?: Date;\n reason?: string;\n note?: string | null;\n }\n) {\n return prisma.$transaction(async (tx) => {\n if (data.studentIds) {\n await tx.studentExcusalStudent.deleteMany({ where: { excusalId } });\n await tx.studentExcusalStudent.createMany({\n data: data.studentIds.map((studentId) => ({ excusalId, studentId })),\n });\n }\n\n return tx.studentExcusal.update({\n where: { id: excusalId },\n data: {\n ...(data.startDate !== undefined\n ? { startDate: toDateOnly(data.startDate) }\n : {}),\n ...(data.endDate !== undefined ? { endDate: toDateOnly(data.endDate) } : {}),\n ...(data.reason !== undefined ? { reason: data.reason } : {}),\n ...(data.note !== undefined ? { note: data.note } : {}),\n },\n include: excusalInclude,\n });\n });\n}\n\nexport function revokeStudentExcusal(excusalId: string, revokedById: string) {\n return prisma.studentExcusal.update({\n where: { id: excusalId },\n data: {\n revokedAt: new Date(),\n revokedById,\n },\n include: excusalInclude,\n });\n}\n\n/** Apply EXCUSED status for an excusal across matching class attendance sessions. */\nexport async function applyExcusalToAttendance(input: {\n schoolId: string;\n excusalId: string;\n studentIds: string[];\n startDate: Date;\n endDate: Date;\n updatedById?: string | null;\n}) {\n if (input.studentIds.length === 0) {\n return { sessionsTouched: 0, recordsUpserted: 0 };\n }\n\n const start = startOfUtcDay(input.startDate);\n const end = endOfUtcDay(input.endDate);\n\n const events = await prisma.event.findMany({\n where: {\n class: {\n schoolId: input.schoolId,\n students: { some: { id: { in: input.studentIds } } },\n },\n startTime: { gte: start, lte: end },\n },\n select: {\n id: true,\n classId: true,\n startTime: true,\n class: {\n select: {\n id: true,\n students: {\n where: { id: { in: input.studentIds } },\n select: { id: true },\n },\n },\n },\n },\n });\n\n let sessionsTouched = 0;\n let recordsUpserted = 0;\n\n for (const event of events) {\n if (!event.classId || !event.class) continue;\n const classStudentIds = event.class.students.map((s) => s.id);\n if (classStudentIds.length === 0) continue;\n\n let attendance = await prisma.attendance.findFirst({\n where: { classId: event.classId, eventId: event.id },\n include: {\n present: { select: { id: true } },\n late: { select: { id: true } },\n absent: { select: { id: true } },\n records: {\n select: {\n studentId: true,\n status: true,\n excusedByExcusalId: true,\n note: true,\n },\n },\n },\n });\n\n if (!attendance) {\n // Default everyone present, then override excused students.\n const allStudentIds = await prisma.class\n .findUnique({\n where: { id: event.classId },\n select: { students: { select: { id: true } } },\n })\n .then((c) => c?.students.map((s) => s.id) ?? []);\n\n const excusedSet = new Set(classStudentIds);\n const presentIds = allStudentIds.filter((id) => !excusedSet.has(id));\n\n attendance = await createAttendance({\n classId: event.classId,\n eventId: event.id,\n date: event.startTime,\n presentIds,\n lateIds: [],\n absentIds: [],\n records: [\n ...presentIds.map((studentId) => ({\n studentId,\n status: \"PRESENT\" as const,\n updatedById: input.updatedById,\n })),\n ...classStudentIds.map((studentId) => ({\n studentId,\n status: \"EXCUSED\" as const,\n note: null,\n excusedByExcusalId: input.excusalId,\n updatedById: input.updatedById,\n })),\n ],\n });\n sessionsTouched += 1;\n recordsUpserted += classStudentIds.length;\n continue;\n }\n\n const presentIds = attendance.present\n .map((s) => s.id)\n .filter((id) => !classStudentIds.includes(id));\n const lateIds = attendance.late\n .map((s) => s.id)\n .filter((id) => !classStudentIds.includes(id));\n const absentIds = attendance.absent\n .map((s) => s.id)\n .filter((id) => !classStudentIds.includes(id));\n\n const recordByStudent = new Map(\n attendance.records.map((r) => [r.studentId, r])\n );\n const nextRecords: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }> = [];\n\n for (const [studentId, existing] of recordByStudent) {\n if (classStudentIds.includes(studentId)) {\n nextRecords.push({\n studentId,\n status: \"EXCUSED\",\n note: existing.note,\n excusedByExcusalId: input.excusalId,\n updatedById: input.updatedById,\n });\n } else {\n nextRecords.push({\n studentId,\n status: existing.status,\n note: existing.note,\n excusedByExcusalId: existing.excusedByExcusalId,\n });\n }\n }\n\n for (const studentId of classStudentIds) {\n if (!recordByStudent.has(studentId)) {\n nextRecords.push({\n studentId,\n status: \"EXCUSED\",\n excusedByExcusalId: input.excusalId,\n updatedById: input.updatedById,\n });\n }\n }\n\n await updateAttendance(attendance.id, {\n presentIds,\n lateIds,\n absentIds,\n records: nextRecords,\n });\n sessionsTouched += 1;\n recordsUpserted += classStudentIds.length;\n }\n\n return { sessionsTouched, recordsUpserted };\n}\n\n/** Clear EXCUSED locks tied to a revoked/updated excusal (leave status EXCUSED unless cleared). */\nexport async function clearExcusalLocks(excusalId: string) {\n return prisma.attendanceRecord.updateMany({\n where: { excusedByExcusalId: excusalId },\n data: { excusedByExcusalId: null },\n });\n}\n\nexport function listSchoolStudentMemberships(schoolId: string) {\n return prisma.schoolMembership.findMany({\n where: {\n schoolId,\n role: \"STUDENT\",\n status: \"ACTIVE\",\n },\n select: {\n userId: true,\n user: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n studentIn: {\n where: { schoolId },\n select: { id: true, name: true, section: true, subject: true },\n },\n },\n },\n },\n orderBy: { createdAt: \"asc\" },\n });\n}\n\nexport function listAttendanceRecordsForSchoolStudents(input: {\n schoolId: string;\n studentIds: string[];\n from?: Date;\n to?: Date;\n}) {\n if (input.studentIds.length === 0) {\n return Promise.resolve([]);\n }\n\n return prisma.attendanceRecord.findMany({\n where: {\n studentId: { in: input.studentIds },\n attendance: {\n class: { schoolId: input.schoolId },\n ...(input.from || input.to\n ? {\n date: {\n ...(input.from ? { gte: input.from } : {}),\n ...(input.to ? { lte: input.to } : {}),\n },\n }\n : {}),\n },\n },\n select: {\n studentId: true,\n status: true,\n attendance: {\n select: {\n id: true,\n date: true,\n classId: true,\n eventId: true,\n class: { select: { id: true, name: true } },\n event: { select: { id: true, name: true, startTime: true } },\n },\n },\n },\n });\n}\n\nexport function listTodaySchoolAttendanceSessions(schoolId: string, day: Date) {\n const start = startOfUtcDay(day);\n const end = endOfUtcDay(day);\n\n return prisma.attendance.findMany({\n where: {\n class: { schoolId },\n OR: [\n { date: { gte: start, lte: end } },\n { event: { startTime: { gte: start, lte: end } } },\n ],\n },\n select: {\n id: true,\n date: true,\n classId: true,\n eventId: true,\n class: {\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n _count: { select: { students: true } },\n },\n },\n event: {\n select: { id: true, name: true, startTime: true, endTime: true },\n },\n records: {\n select: {\n studentId: true,\n status: true,\n },\n },\n },\n orderBy: { date: \"asc\" },\n });\n}\n\nexport function toDateOnly(date: Date): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())\n );\n}\n\nexport function startOfUtcDay(date: Date): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0, 0)\n );\n}\n\nexport function endOfUtcDay(date: Date): Date {\n return new Date(\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n 23,\n 59,\n 59,\n 999\n )\n );\n}\n\nexport type { AttendanceStatus };\nexport type AttendanceIncludeResult = Prisma.AttendanceGetPayload<{\n include: typeof attendanceInclude;\n}>;\n"],"names":[],"mappings":"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","debug_id":"04968f1d-49ec-52b6-ab2b-a86286e300ce"}
1
+ {"version":3,"file":"attendance.js","sources":["models/attendance.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Attendance model – session-level lists + per-student AttendanceRecord,\n * and school-scoped StudentExcusal persistence.\n */\nimport { AttendanceStatus, Prisma } from \"@prisma/client\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { classTeacherOrSchoolAdminWhere } from \"./access.js\";\n\nconst studentProfileSelect = {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n bio: true,\n location: true,\n website: true,\n },\n },\n} as const;\n\nconst attendanceInclude = {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n color: true,\n },\n },\n present: { select: studentProfileSelect },\n late: { select: studentProfileSelect },\n absent: { select: studentProfileSelect },\n records: {\n select: {\n id: true,\n studentId: true,\n status: true,\n note: true,\n excusedByExcusalId: true,\n updatedById: true,\n updatedAt: true,\n student: { select: studentProfileSelect },\n excusedByExcusal: {\n select: {\n id: true,\n reason: true,\n note: true,\n startDate: true,\n endDate: true,\n revokedAt: true,\n },\n },\n },\n },\n} as const;\n\nconst attendanceUpdateInclude = {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n },\n },\n present: { select: { id: true, username: true } },\n late: { select: { id: true, username: true } },\n absent: { select: { id: true, username: true } },\n records: {\n select: {\n id: true,\n studentId: true,\n status: true,\n note: true,\n excusedByExcusalId: true,\n updatedById: true,\n updatedAt: true,\n student: { select: { id: true, username: true } },\n excusedByExcusal: {\n select: { id: true, reason: true, note: true },\n },\n },\n },\n} as const;\n\nconst excusalInclude = {\n students: {\n select: {\n studentId: true,\n student: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n },\n },\n createdBy: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n revokedBy: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n} as const;\n\n/** @returns Class with students for attendance. */\nexport function findClassWithStudents(classId: string) {\n return prisma.class.findUnique({\n where: { id: classId },\n select: {\n id: true,\n schoolId: true,\n students: {\n select: studentProfileSelect,\n },\n },\n });\n}\n\n/** @returns Class if user is a teacher or school admin. */\nexport function findClassWithTeacher(classId: string, teacherId: string) {\n return prisma.class.findFirst({\n where: {\n id: classId,\n ...classTeacherOrSchoolAdminWhere(teacherId),\n },\n select: {\n id: true,\n name: true,\n schoolId: true,\n students: { select: { id: true } },\n },\n });\n}\n\n/** @returns Events for a class. */\nexport function findEventsByClassId(classId: string) {\n return prisma.event.findMany({\n where: { classId },\n });\n}\n\n/** @returns Attendance record for an event. */\nexport function findAttendanceByEventId(eventId: string) {\n return prisma.attendance.findFirst({\n where: { eventId },\n include: {\n records: {\n select: {\n studentId: true,\n status: true,\n excusedByExcusalId: true,\n },\n },\n },\n });\n}\n\n/** @returns Attendance for class and event (eventId null = class-level). */\nexport function findAttendanceByClassAndEvent(classId: string, eventId: string | null) {\n return prisma.attendance.findFirst({\n where: {\n classId,\n eventId,\n },\n include: {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n },\n },\n late: { select: { id: true } },\n absent: { select: { id: true } },\n records: {\n select: {\n studentId: true,\n status: true,\n excusedByExcusalId: true,\n note: true,\n },\n },\n },\n });\n}\n\n/** @returns Attendance records for class, optionally filtered by event. */\nexport function findManyAttendance(classId: string, eventId?: string) {\n return prisma.attendance.findMany({\n where: {\n classId,\n ...(eventId ? { eventId } : {}),\n },\n include: attendanceInclude,\n orderBy: { date: \"desc\" },\n });\n}\n\n/** Create an attendance session with legacy lists + per-student records. */\nexport function createAttendance(data: {\n classId: string;\n eventId?: string | null;\n date?: Date;\n presentIds: string[];\n lateIds?: string[];\n absentIds?: string[];\n excusedIds?: string[];\n records?: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n updatedById?: string | null;\n}) {\n const lateIds = data.lateIds ?? [];\n const absentIds = data.absentIds ?? [];\n const excusedIds = data.excusedIds ?? [];\n const records: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }> =\n data.records ??\n buildRecordsFromLists({\n presentIds: data.presentIds,\n lateIds,\n absentIds,\n excusedIds,\n updatedById: data.updatedById,\n });\n\n return prisma.attendance.create({\n data: {\n classId: data.classId,\n eventId: data.eventId ?? undefined,\n date: data.date ?? new Date(),\n present: { connect: data.presentIds.map((id) => ({ id })) },\n late: lateIds.length ? { connect: lateIds.map((id) => ({ id })) } : undefined,\n absent: absentIds.length ? { connect: absentIds.map((id) => ({ id })) } : undefined,\n records: {\n create: records.map((record) => ({\n studentId: record.studentId,\n status: record.status,\n note: record.note ?? undefined,\n excusedByExcusalId: record.excusedByExcusalId ?? undefined,\n updatedById: record.updatedById ?? data.updatedById ?? undefined,\n })),\n },\n },\n include: attendanceUpdateInclude,\n });\n}\n\n/** Create attendance for a specific event. */\nexport function createAttendanceForEvent(data: {\n classId: string;\n eventId: string;\n date?: Date;\n presentIds: string[];\n lateIds?: string[];\n absentIds?: string[];\n excusedIds?: string[];\n records?: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n}) {\n return createAttendance({\n classId: data.classId,\n eventId: data.eventId,\n date: data.date,\n presentIds: data.presentIds,\n lateIds: data.lateIds,\n absentIds: data.absentIds,\n excusedIds: data.excusedIds,\n records: data.records,\n });\n}\n\n/** Update attendance present/late/absent lists and sync per-student records. */\nexport async function updateAttendance(\n id: string,\n data: {\n presentIds: string[];\n lateIds: string[];\n absentIds: string[];\n records: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n }\n) {\n const studentIds = data.records.map((r) => r.studentId);\n\n return prisma.$transaction(async (tx) => {\n // Replace per-student rows for students in this update set.\n await tx.attendanceRecord.deleteMany({\n where: {\n attendanceId: id,\n studentId: { in: studentIds },\n },\n });\n\n if (data.records.length > 0) {\n await tx.attendanceRecord.createMany({\n data: data.records.map((record) => ({\n attendanceId: id,\n studentId: record.studentId,\n status: record.status,\n note: record.note ?? null,\n excusedByExcusalId: record.excusedByExcusalId ?? null,\n updatedById: record.updatedById ?? null,\n })),\n });\n }\n\n return tx.attendance.update({\n where: { id },\n data: {\n present: { set: data.presentIds.map((id) => ({ id })) },\n late: { set: data.lateIds.map((id) => ({ id })) },\n absent: { set: data.absentIds.map((id) => ({ id })) },\n },\n include: attendanceUpdateInclude,\n });\n });\n}\n\nfunction buildRecordsFromLists(input: {\n presentIds: string[];\n lateIds: string[];\n absentIds: string[];\n excusedIds: string[];\n updatedById?: string | null;\n}) {\n const records: Array<{\n studentId: string;\n status: AttendanceStatus;\n updatedById?: string | null;\n }> = [];\n const seen = new Set<string>();\n const pushUnique = (studentId: string, status: AttendanceStatus) => {\n if (seen.has(studentId)) return;\n seen.add(studentId);\n records.push({ studentId, status, updatedById: input.updatedById });\n };\n for (const studentId of input.presentIds) pushUnique(studentId, \"PRESENT\");\n for (const studentId of input.lateIds) pushUnique(studentId, \"LATE\");\n for (const studentId of input.absentIds) pushUnique(studentId, \"ABSENT\");\n for (const studentId of input.excusedIds) pushUnique(studentId, \"EXCUSED\");\n return records;\n}\n\n/** Active (non-revoked) excusals covering a calendar date for given students. */\nexport function findActiveExcusalsForStudents(input: {\n schoolId: string;\n studentIds: string[];\n date: Date;\n}) {\n if (input.studentIds.length === 0) {\n return Promise.resolve([]);\n }\n\n const day = toDateOnly(input.date);\n\n return prisma.studentExcusal.findMany({\n where: {\n schoolId: input.schoolId,\n revokedAt: null,\n startDate: { lte: day },\n endDate: { gte: day },\n students: { some: { studentId: { in: input.studentIds } } },\n },\n include: {\n students: { select: { studentId: true } },\n },\n });\n}\n\n/** Active excusals overlapping a date range for school students. */\nexport function findActiveExcusalsInRange(input: {\n schoolId: string;\n studentIds?: string[];\n startDate: Date;\n endDate: Date;\n}) {\n const start = toDateOnly(input.startDate);\n const end = toDateOnly(input.endDate);\n\n return prisma.studentExcusal.findMany({\n where: {\n schoolId: input.schoolId,\n revokedAt: null,\n startDate: { lte: end },\n endDate: { gte: start },\n ...(input.studentIds?.length\n ? { students: { some: { studentId: { in: input.studentIds } } } }\n : {}),\n },\n include: {\n students: { select: { studentId: true } },\n },\n });\n}\n\nexport function listExcusalsForSchool(input: {\n schoolId: string;\n includeRevoked?: boolean;\n studentId?: string;\n}) {\n return prisma.studentExcusal.findMany({\n where: {\n schoolId: input.schoolId,\n ...(input.includeRevoked ? {} : { revokedAt: null }),\n ...(input.studentId\n ? { students: { some: { studentId: input.studentId } } }\n : {}),\n },\n include: excusalInclude,\n orderBy: [{ startDate: \"desc\" }, { createdAt: \"desc\" }],\n });\n}\n\nexport function findExcusalById(excusalId: string) {\n return prisma.studentExcusal.findUnique({\n where: { id: excusalId },\n include: {\n ...excusalInclude,\n students: { select: { studentId: true } },\n },\n });\n}\n\nexport function createStudentExcusal(data: {\n schoolId: string;\n studentIds: string[];\n startDate: Date;\n endDate: Date;\n reason: string;\n note?: string | null;\n createdById: string;\n}) {\n return prisma.studentExcusal.create({\n data: {\n schoolId: data.schoolId,\n startDate: toDateOnly(data.startDate),\n endDate: toDateOnly(data.endDate),\n reason: data.reason,\n note: data.note ?? null,\n createdById: data.createdById,\n students: {\n create: data.studentIds.map((studentId) => ({ studentId })),\n },\n },\n include: excusalInclude,\n });\n}\n\nexport function updateStudentExcusal(\n excusalId: string,\n data: {\n studentIds?: string[];\n startDate?: Date;\n endDate?: Date;\n reason?: string;\n note?: string | null;\n }\n) {\n return prisma.$transaction(async (tx) => {\n if (data.studentIds) {\n await tx.studentExcusalStudent.deleteMany({ where: { excusalId } });\n await tx.studentExcusalStudent.createMany({\n data: data.studentIds.map((studentId) => ({ excusalId, studentId })),\n });\n }\n\n return tx.studentExcusal.update({\n where: { id: excusalId },\n data: {\n ...(data.startDate !== undefined\n ? { startDate: toDateOnly(data.startDate) }\n : {}),\n ...(data.endDate !== undefined ? { endDate: toDateOnly(data.endDate) } : {}),\n ...(data.reason !== undefined ? { reason: data.reason } : {}),\n ...(data.note !== undefined ? { note: data.note } : {}),\n },\n include: excusalInclude,\n });\n });\n}\n\nexport function revokeStudentExcusal(excusalId: string, revokedById: string) {\n return prisma.studentExcusal.update({\n where: { id: excusalId },\n data: {\n revokedAt: new Date(),\n revokedById,\n },\n include: excusalInclude,\n });\n}\n\n/** Apply EXCUSED status for an excusal across matching class attendance sessions. */\nexport async function applyExcusalToAttendance(input: {\n schoolId: string;\n excusalId: string;\n studentIds: string[];\n startDate: Date;\n endDate: Date;\n updatedById?: string | null;\n}) {\n if (input.studentIds.length === 0) {\n return { sessionsTouched: 0, recordsUpserted: 0 };\n }\n\n const start = startOfUtcDay(input.startDate);\n const end = endOfUtcDay(input.endDate);\n\n const events = await prisma.event.findMany({\n where: {\n class: {\n schoolId: input.schoolId,\n students: { some: { id: { in: input.studentIds } } },\n },\n startTime: { gte: start, lte: end },\n },\n select: {\n id: true,\n classId: true,\n startTime: true,\n class: {\n select: {\n id: true,\n students: {\n where: { id: { in: input.studentIds } },\n select: { id: true },\n },\n },\n },\n },\n });\n\n let sessionsTouched = 0;\n let recordsUpserted = 0;\n\n for (const event of events) {\n if (!event.classId || !event.class) continue;\n const classStudentIds = event.class.students.map((s) => s.id);\n if (classStudentIds.length === 0) continue;\n\n let attendance = await prisma.attendance.findFirst({\n where: { classId: event.classId, eventId: event.id },\n include: {\n present: { select: { id: true } },\n late: { select: { id: true } },\n absent: { select: { id: true } },\n records: {\n select: {\n studentId: true,\n status: true,\n excusedByExcusalId: true,\n note: true,\n },\n },\n },\n });\n\n if (!attendance) {\n // Default everyone present, then override excused students.\n const allStudentIds = await prisma.class\n .findUnique({\n where: { id: event.classId },\n select: { students: { select: { id: true } } },\n })\n .then((c) => c?.students.map((s) => s.id) ?? []);\n\n const excusedSet = new Set(classStudentIds);\n const presentIds = allStudentIds.filter((id) => !excusedSet.has(id));\n\n attendance = await createAttendance({\n classId: event.classId,\n eventId: event.id,\n date: event.startTime,\n presentIds,\n lateIds: [],\n absentIds: [],\n records: [\n ...presentIds.map((studentId) => ({\n studentId,\n status: \"PRESENT\" as const,\n updatedById: input.updatedById,\n })),\n ...classStudentIds.map((studentId) => ({\n studentId,\n status: \"EXCUSED\" as const,\n note: null,\n excusedByExcusalId: input.excusalId,\n updatedById: input.updatedById,\n })),\n ],\n });\n sessionsTouched += 1;\n recordsUpserted += classStudentIds.length;\n continue;\n }\n\n const presentIds = attendance.present\n .map((s) => s.id)\n .filter((id) => !classStudentIds.includes(id));\n const lateIds = attendance.late\n .map((s) => s.id)\n .filter((id) => !classStudentIds.includes(id));\n const absentIds = attendance.absent\n .map((s) => s.id)\n .filter((id) => !classStudentIds.includes(id));\n\n const recordByStudent = new Map(\n attendance.records.map((r) => [r.studentId, r])\n );\n const nextRecords: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }> = [];\n\n for (const [studentId, existing] of recordByStudent) {\n if (classStudentIds.includes(studentId)) {\n nextRecords.push({\n studentId,\n status: \"EXCUSED\",\n note: existing.note,\n excusedByExcusalId: input.excusalId,\n updatedById: input.updatedById,\n });\n } else {\n nextRecords.push({\n studentId,\n status: existing.status,\n note: existing.note,\n excusedByExcusalId: existing.excusedByExcusalId,\n });\n }\n }\n\n for (const studentId of classStudentIds) {\n if (!recordByStudent.has(studentId)) {\n nextRecords.push({\n studentId,\n status: \"EXCUSED\",\n excusedByExcusalId: input.excusalId,\n updatedById: input.updatedById,\n });\n }\n }\n\n await updateAttendance(attendance.id, {\n presentIds,\n lateIds,\n absentIds,\n records: nextRecords,\n });\n sessionsTouched += 1;\n recordsUpserted += classStudentIds.length;\n }\n\n return { sessionsTouched, recordsUpserted };\n}\n\n/** Clear EXCUSED locks tied to a revoked/updated excusal (leave status EXCUSED unless cleared). */\nexport async function clearExcusalLocks(excusalId: string) {\n return prisma.attendanceRecord.updateMany({\n where: { excusedByExcusalId: excusalId },\n data: { excusedByExcusalId: null },\n });\n}\n\nexport function listSchoolStudentMemberships(schoolId: string) {\n return prisma.schoolMembership.findMany({\n where: {\n schoolId,\n role: \"STUDENT\",\n status: \"ACTIVE\",\n },\n select: {\n userId: true,\n user: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n studentIn: {\n where: { schoolId },\n select: { id: true, name: true, section: true, subject: true },\n },\n },\n },\n },\n orderBy: { createdAt: \"asc\" },\n });\n}\n\nexport function listAttendanceRecordsForSchoolStudents(input: {\n schoolId: string;\n studentIds: string[];\n from?: Date;\n to?: Date;\n}) {\n if (input.studentIds.length === 0) {\n return Promise.resolve([]);\n }\n\n return prisma.attendanceRecord.findMany({\n where: {\n studentId: { in: input.studentIds },\n attendance: {\n class: { schoolId: input.schoolId },\n ...(input.from || input.to\n ? {\n date: {\n ...(input.from ? { gte: input.from } : {}),\n ...(input.to ? { lte: input.to } : {}),\n },\n }\n : {}),\n },\n },\n select: {\n studentId: true,\n status: true,\n attendance: {\n select: {\n id: true,\n date: true,\n classId: true,\n eventId: true,\n class: { select: { id: true, name: true } },\n event: { select: { id: true, name: true, startTime: true } },\n },\n },\n },\n });\n}\n\nexport function listTodaySchoolAttendanceSessions(schoolId: string, day: Date) {\n const start = startOfUtcDay(day);\n const end = endOfUtcDay(day);\n\n return prisma.attendance.findMany({\n where: {\n class: { schoolId },\n OR: [\n { date: { gte: start, lte: end } },\n { event: { startTime: { gte: start, lte: end } } },\n ],\n },\n select: {\n id: true,\n date: true,\n classId: true,\n eventId: true,\n class: {\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n _count: { select: { students: true } },\n },\n },\n event: {\n select: { id: true, name: true, startTime: true, endTime: true },\n },\n records: {\n select: {\n studentId: true,\n status: true,\n },\n },\n },\n orderBy: { date: \"asc\" },\n });\n}\n\nexport function toDateOnly(date: Date): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())\n );\n}\n\nexport function startOfUtcDay(date: Date): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0, 0)\n );\n}\n\nexport function endOfUtcDay(date: Date): Date {\n return new Date(\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n 23,\n 59,\n 59,\n 999\n )\n );\n}\n\nexport type { AttendanceStatus };\nexport type AttendanceIncludeResult = Prisma.AttendanceGetPayload<{\n include: typeof attendanceInclude;\n}>;\n"],"names":[],"mappings":"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","debug_id":"ac666668-c4fd-5607-832e-a8cac0ace37d"}
@@ -106,6 +106,8 @@ export declare function searchMarketplaceListings(input: {
106
106
  limit: number;
107
107
  /** When true, include the caller's own hidden listings (for authors). */
108
108
  authorId?: string;
109
+ /** When set, restrict the entire result set (including PUBLIC listings) to this school. */
110
+ scopeSchoolId?: string;
109
111
  }): Promise<{
110
112
  items: ({
111
113
  school: {
@@ -139,6 +141,41 @@ export declare function searchMarketplaceListings(input: {
139
141
  })[];
140
142
  nextCursor: string | undefined;
141
143
  }>;
144
+ export declare function updateMarketplaceListing(id: string, data: {
145
+ title?: string;
146
+ description?: string | null;
147
+ visibility?: MarketplaceVisibility;
148
+ tags?: string[];
149
+ }): Promise<{
150
+ school: {
151
+ id: string;
152
+ name: string;
153
+ } | null;
154
+ author: {
155
+ id: string;
156
+ username: string;
157
+ profile: {
158
+ displayName: string | null;
159
+ } | null;
160
+ };
161
+ } & {
162
+ type: import(".prisma/client").$Enums.MarketplaceListingType;
163
+ payload: Prisma.JsonValue;
164
+ id: string;
165
+ createdAt: Date;
166
+ updatedAt: Date;
167
+ schoolId: string | null;
168
+ tags: string[];
169
+ description: string | null;
170
+ title: string;
171
+ worksheetId: string | null;
172
+ markSchemeId: string | null;
173
+ authorId: string;
174
+ fileId: string | null;
175
+ visibility: import(".prisma/client").$Enums.MarketplaceVisibility;
176
+ reportCount: number;
177
+ isHidden: boolean;
178
+ }>;
142
179
  export declare function incrementMarketplaceReportCount(id: string): Promise<{
143
180
  id: string;
144
181
  reportCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"marketplace.d.ts","sourceRoot":"/","sources":["models/marketplace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;CAS5B,CAAC;AAEX,MAAM,MAAM,+BAA+B,GAAG,MAAM,CAAC,4BAA4B,CAAC;IAChF,OAAO,EAAE,OAAO,yBAAyB,CAAC;CAC3C,CAAC,CAAC;AAEH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,qBAAqB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiBA;AAED,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAK1D;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DA;AAED,wBAAsB,+BAA+B,CAAC,EAAE,EAAE,MAAM;;;;GAM/D;AAED,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOlB;AAED,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,uEAI1E"}
1
+ {"version":3,"file":"marketplace.d.ts","sourceRoot":"/","sources":["models/marketplace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;CAS5B,CAAC;AAEX,MAAM,MAAM,+BAA+B,GAAG,MAAM,CAAC,4BAA4B,CAAC;IAChF,OAAO,EAAE,OAAO,yBAAyB,CAAC;CAC3C,CAAC,CAAC;AAEH,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,qBAAqB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiBA;AAED,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAK1D;AAED,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DA;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOF;AAED,wBAAsB,+BAA+B,CAAC,EAAE,EAAE,MAAM;;;;GAM/D;AAED,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOlB;AAED,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,uEAI1E"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c91cb026-d857-5f1e-879c-e8dcd659347f")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e56099a1-dd5a-518e-8901-edc3da74c70d")}catch(e){}}();
3
3
  import { prisma } from "../lib/prisma.js";
4
4
  export const marketplaceListingInclude = {
5
5
  author: {
@@ -39,6 +39,7 @@ export async function searchMarketplaceListings(input) {
39
39
  const search = input.search?.trim();
40
40
  const where = {
41
41
  AND: [
42
+ ...(input.scopeSchoolId ? [{ schoolId: input.scopeSchoolId }] : []),
42
43
  {
43
44
  OR: [
44
45
  { visibility: "PUBLIC", isHidden: false },
@@ -92,6 +93,13 @@ export async function searchMarketplaceListings(input) {
92
93
  }
93
94
  return { items: rows, nextCursor };
94
95
  }
96
+ export async function updateMarketplaceListing(id, data) {
97
+ return prisma.marketplaceListing.update({
98
+ where: { id },
99
+ data,
100
+ include: marketplaceListingInclude,
101
+ });
102
+ }
95
103
  export async function incrementMarketplaceReportCount(id) {
96
104
  return prisma.marketplaceListing.update({
97
105
  where: { id },
@@ -112,4 +120,4 @@ export async function deleteMarketplaceListing(id, authorId) {
112
120
  });
113
121
  }
114
122
  //# sourceMappingURL=marketplace.js.map
115
- //# debugId=c91cb026-d857-5f1e-879c-e8dcd659347f
123
+ //# debugId=e56099a1-dd5a-518e-8901-edc3da74c70d
@@ -1 +1 @@
1
- {"version":3,"file":"marketplace.js","sources":["models/marketplace.ts"],"sourceRoot":"/","sourcesContent":["/**\n * MarketplaceListing data access — B1 v1 (markschemes, worksheets, files).\n * Isolated Marketplace* tables only; no Attendance/Fee coupling.\n */\nimport type {\n MarketplaceListingType,\n MarketplaceVisibility,\n Prisma,\n} from \"@prisma/client\";\nimport { prisma } from \"../lib/prisma.js\";\n\nexport const marketplaceListingInclude = {\n author: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n school: { select: { id: true, name: true } },\n} as const;\n\nexport type MarketplaceListingWithRelations = Prisma.MarketplaceListingGetPayload<{\n include: typeof marketplaceListingInclude;\n}>;\n\nexport async function createMarketplaceListing(data: {\n type: MarketplaceListingType;\n title: string;\n description?: string | null;\n authorId: string;\n schoolId?: string | null;\n visibility: MarketplaceVisibility;\n markSchemeId?: string | null;\n worksheetId?: string | null;\n fileId?: string | null;\n payload: Prisma.InputJsonValue;\n tags?: string[];\n}) {\n return prisma.marketplaceListing.create({\n data: {\n type: data.type,\n title: data.title,\n description: data.description ?? null,\n authorId: data.authorId,\n schoolId: data.schoolId ?? null,\n visibility: data.visibility,\n markSchemeId: data.markSchemeId ?? null,\n worksheetId: data.worksheetId ?? null,\n fileId: data.fileId ?? null,\n payload: data.payload,\n tags: data.tags ?? [],\n },\n include: marketplaceListingInclude,\n });\n}\n\nexport async function findMarketplaceListingById(id: string) {\n return prisma.marketplaceListing.findUnique({\n where: { id },\n include: marketplaceListingInclude,\n });\n}\n\nexport async function searchMarketplaceListings(input: {\n schoolIds: string[];\n type?: MarketplaceListingType;\n search?: string;\n tags?: string[];\n cursor?: string;\n limit: number;\n /** When true, include the caller's own hidden listings (for authors). */\n authorId?: string;\n}) {\n const search = input.search?.trim();\n const where: Prisma.MarketplaceListingWhereInput = {\n AND: [\n {\n OR: [\n { visibility: \"PUBLIC\", isHidden: false },\n {\n visibility: \"SCHOOL\",\n isHidden: false,\n schoolId: { in: input.schoolIds },\n },\n // Authors can always see their own listings (including hidden).\n ...(input.authorId ? [{ authorId: input.authorId }] : []),\n ],\n },\n ...(input.type ? [{ type: input.type }] : []),\n ...(input.tags?.length\n ? [{ tags: { hasSome: input.tags } }]\n : []),\n ...(search\n ? [\n {\n OR: [\n { title: { contains: search, mode: \"insensitive\" as const } },\n {\n description: {\n contains: search,\n mode: \"insensitive\" as const,\n },\n },\n { tags: { has: search } },\n ],\n },\n ]\n : []),\n ],\n };\n\n const rows = await prisma.marketplaceListing.findMany({\n where,\n include: marketplaceListingInclude,\n orderBy: [{ createdAt: \"desc\" }, { id: \"desc\" }],\n take: input.limit + 1,\n ...(input.cursor\n ? {\n cursor: { id: input.cursor },\n skip: 1,\n }\n : {}),\n });\n\n let nextCursor: string | undefined;\n if (rows.length > input.limit) {\n const next = rows.pop();\n nextCursor = next?.id;\n }\n\n return { items: rows, nextCursor };\n}\n\nexport async function incrementMarketplaceReportCount(id: string) {\n return prisma.marketplaceListing.update({\n where: { id },\n data: { reportCount: { increment: 1 } },\n select: { id: true, reportCount: true, isHidden: true },\n });\n}\n\nexport async function setMarketplaceListingHidden(\n id: string,\n isHidden: boolean\n) {\n return prisma.marketplaceListing.update({\n where: { id },\n data: { isHidden },\n include: marketplaceListingInclude,\n });\n}\n\nexport async function deleteMarketplaceListing(id: string, authorId: string) {\n return prisma.marketplaceListing.deleteMany({\n where: { id, authorId },\n });\n}\n"],"names":[],"mappings":"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","debug_id":"c91cb026-d857-5f1e-879c-e8dcd659347f"}
1
+ {"version":3,"file":"marketplace.js","sources":["models/marketplace.ts"],"sourceRoot":"/","sourcesContent":["/**\n * MarketplaceListing data access — B1 v1 (markschemes, worksheets, files).\n * Isolated Marketplace* tables only; no Attendance/Fee coupling.\n */\nimport type {\n MarketplaceListingType,\n MarketplaceVisibility,\n Prisma,\n} from \"@prisma/client\";\nimport { prisma } from \"../lib/prisma.js\";\n\nexport const marketplaceListingInclude = {\n author: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n school: { select: { id: true, name: true } },\n} as const;\n\nexport type MarketplaceListingWithRelations = Prisma.MarketplaceListingGetPayload<{\n include: typeof marketplaceListingInclude;\n}>;\n\nexport async function createMarketplaceListing(data: {\n type: MarketplaceListingType;\n title: string;\n description?: string | null;\n authorId: string;\n schoolId?: string | null;\n visibility: MarketplaceVisibility;\n markSchemeId?: string | null;\n worksheetId?: string | null;\n fileId?: string | null;\n payload: Prisma.InputJsonValue;\n tags?: string[];\n}) {\n return prisma.marketplaceListing.create({\n data: {\n type: data.type,\n title: data.title,\n description: data.description ?? null,\n authorId: data.authorId,\n schoolId: data.schoolId ?? null,\n visibility: data.visibility,\n markSchemeId: data.markSchemeId ?? null,\n worksheetId: data.worksheetId ?? null,\n fileId: data.fileId ?? null,\n payload: data.payload,\n tags: data.tags ?? [],\n },\n include: marketplaceListingInclude,\n });\n}\n\nexport async function findMarketplaceListingById(id: string) {\n return prisma.marketplaceListing.findUnique({\n where: { id },\n include: marketplaceListingInclude,\n });\n}\n\nexport async function searchMarketplaceListings(input: {\n schoolIds: string[];\n type?: MarketplaceListingType;\n search?: string;\n tags?: string[];\n cursor?: string;\n limit: number;\n /** When true, include the caller's own hidden listings (for authors). */\n authorId?: string;\n /** When set, restrict the entire result set (including PUBLIC listings) to this school. */\n scopeSchoolId?: string;\n}) {\n const search = input.search?.trim();\n const where: Prisma.MarketplaceListingWhereInput = {\n AND: [\n ...(input.scopeSchoolId ? [{ schoolId: input.scopeSchoolId }] : []),\n {\n OR: [\n { visibility: \"PUBLIC\", isHidden: false },\n {\n visibility: \"SCHOOL\",\n isHidden: false,\n schoolId: { in: input.schoolIds },\n },\n // Authors can always see their own listings (including hidden).\n ...(input.authorId ? [{ authorId: input.authorId }] : []),\n ],\n },\n ...(input.type ? [{ type: input.type }] : []),\n ...(input.tags?.length\n ? [{ tags: { hasSome: input.tags } }]\n : []),\n ...(search\n ? [\n {\n OR: [\n { title: { contains: search, mode: \"insensitive\" as const } },\n {\n description: {\n contains: search,\n mode: \"insensitive\" as const,\n },\n },\n { tags: { has: search } },\n ],\n },\n ]\n : []),\n ],\n };\n\n const rows = await prisma.marketplaceListing.findMany({\n where,\n include: marketplaceListingInclude,\n orderBy: [{ createdAt: \"desc\" }, { id: \"desc\" }],\n take: input.limit + 1,\n ...(input.cursor\n ? {\n cursor: { id: input.cursor },\n skip: 1,\n }\n : {}),\n });\n\n let nextCursor: string | undefined;\n if (rows.length > input.limit) {\n const next = rows.pop();\n nextCursor = next?.id;\n }\n\n return { items: rows, nextCursor };\n}\n\nexport async function updateMarketplaceListing(\n id: string,\n data: {\n title?: string;\n description?: string | null;\n visibility?: MarketplaceVisibility;\n tags?: string[];\n }\n) {\n return prisma.marketplaceListing.update({\n where: { id },\n data,\n include: marketplaceListingInclude,\n });\n}\n\nexport async function incrementMarketplaceReportCount(id: string) {\n return prisma.marketplaceListing.update({\n where: { id },\n data: { reportCount: { increment: 1 } },\n select: { id: true, reportCount: true, isHidden: true },\n });\n}\n\nexport async function setMarketplaceListingHidden(\n id: string,\n isHidden: boolean\n) {\n return prisma.marketplaceListing.update({\n where: { id },\n data: { isHidden },\n include: marketplaceListingInclude,\n });\n}\n\nexport async function deleteMarketplaceListing(id: string, authorId: string) {\n return prisma.marketplaceListing.deleteMany({\n where: { id, authorId },\n });\n}\n"],"names":[],"mappings":"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","debug_id":"e56099a1-dd5a-518e-8901-edc3da74c70d"}