@studious-lms/server 1.1.24 → 1.2.6

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 (485) hide show
  1. package/.coderabbit.yaml +9 -0
  2. package/.env.example +53 -0
  3. package/.env.test.example +37 -0
  4. package/README.md +34 -7
  5. package/dist/exportType.d.ts.map +1 -1
  6. package/dist/exportType.js +4 -0
  7. package/dist/exportType.js.map +1 -0
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +212 -51
  11. package/dist/index.js.map +1 -0
  12. package/dist/instrument.d.ts +2 -0
  13. package/dist/instrument.d.ts.map +1 -0
  14. package/dist/instrument.js +18 -0
  15. package/dist/instrument.js.map +1 -0
  16. package/dist/lib/config/env.d.ts +190 -0
  17. package/dist/lib/config/env.d.ts.map +1 -0
  18. package/dist/lib/config/env.js +121 -0
  19. package/dist/lib/config/env.js.map +1 -0
  20. package/dist/lib/fileUpload.d.ts +2 -2
  21. package/dist/lib/fileUpload.d.ts.map +1 -1
  22. package/dist/lib/fileUpload.js +82 -15
  23. package/dist/lib/fileUpload.js.map +1 -0
  24. package/dist/lib/googleCloudStorage.d.ts +13 -0
  25. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  26. package/dist/lib/googleCloudStorage.js +45 -6
  27. package/dist/lib/googleCloudStorage.js.map +1 -0
  28. package/dist/lib/jsonConversion.d.ts.map +1 -1
  29. package/dist/lib/jsonConversion.js +16 -14
  30. package/dist/lib/jsonConversion.js.map +1 -0
  31. package/dist/lib/jsonStyles.d.ts.map +1 -1
  32. package/dist/lib/jsonStyles.js +4 -0
  33. package/dist/lib/jsonStyles.js.map +1 -0
  34. package/dist/lib/notificationHandler.d.ts +25 -0
  35. package/dist/lib/notificationHandler.d.ts.map +1 -0
  36. package/dist/lib/notificationHandler.js +32 -0
  37. package/dist/lib/notificationHandler.js.map +1 -0
  38. package/dist/lib/prisma.d.ts +2 -2
  39. package/dist/lib/prisma.d.ts.map +1 -1
  40. package/dist/lib/prisma.js +24 -1
  41. package/dist/lib/prisma.js.map +1 -0
  42. package/dist/lib/pusher.d.ts +4 -1
  43. package/dist/lib/pusher.d.ts.map +1 -1
  44. package/dist/lib/pusher.js +14 -6
  45. package/dist/lib/pusher.js.map +1 -0
  46. package/dist/lib/redis.d.ts +5 -0
  47. package/dist/lib/redis.d.ts.map +1 -0
  48. package/dist/lib/redis.js +53 -0
  49. package/dist/lib/redis.js.map +1 -0
  50. package/dist/lib/thumbnailGenerator.d.ts +0 -21
  51. package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
  52. package/dist/lib/thumbnailGenerator.js +159 -158
  53. package/dist/lib/thumbnailGenerator.js.map +1 -0
  54. package/dist/middleware/auth.d.ts.map +1 -1
  55. package/dist/middleware/auth.js +41 -93
  56. package/dist/middleware/auth.js.map +1 -0
  57. package/dist/middleware/logging.d.ts.map +1 -1
  58. package/dist/middleware/logging.js +4 -0
  59. package/dist/middleware/logging.js.map +1 -0
  60. package/dist/middleware/security.d.ts +5 -0
  61. package/dist/middleware/security.d.ts.map +1 -0
  62. package/dist/middleware/security.js +77 -0
  63. package/dist/middleware/security.js.map +1 -0
  64. package/dist/models/agenda.d.ts +97 -0
  65. package/dist/models/agenda.d.ts.map +1 -0
  66. package/dist/models/agenda.js +40 -0
  67. package/dist/models/agenda.js.map +1 -0
  68. package/dist/models/announcement.d.ts +223 -0
  69. package/dist/models/announcement.d.ts.map +1 -0
  70. package/dist/models/announcement.js +120 -0
  71. package/dist/models/announcement.js.map +1 -0
  72. package/dist/models/assignment.d.ts +1292 -0
  73. package/dist/models/assignment.d.ts.map +1 -0
  74. package/dist/models/assignment.js +309 -0
  75. package/dist/models/assignment.js.map +1 -0
  76. package/dist/models/attendance.d.ts +180 -0
  77. package/dist/models/attendance.d.ts.map +1 -0
  78. package/dist/models/attendance.js +188 -0
  79. package/dist/models/attendance.js.map +1 -0
  80. package/dist/models/auth.d.ts +153 -0
  81. package/dist/models/auth.d.ts.map +1 -0
  82. package/dist/models/auth.js +217 -0
  83. package/dist/models/auth.js.map +1 -0
  84. package/dist/models/class.d.ts +439 -0
  85. package/dist/models/class.d.ts.map +1 -0
  86. package/dist/models/class.js +546 -0
  87. package/dist/models/class.js.map +1 -0
  88. package/dist/models/comment.d.ts +171 -0
  89. package/dist/models/comment.d.ts.map +1 -0
  90. package/dist/models/comment.js +138 -0
  91. package/dist/models/comment.js.map +1 -0
  92. package/dist/models/conversation.d.ts +164 -0
  93. package/dist/models/conversation.d.ts.map +1 -0
  94. package/dist/models/conversation.js +175 -0
  95. package/dist/models/conversation.js.map +1 -0
  96. package/dist/models/event.d.ts +295 -0
  97. package/dist/models/event.d.ts.map +1 -0
  98. package/dist/models/event.js +145 -0
  99. package/dist/models/event.js.map +1 -0
  100. package/dist/models/file.d.ts +536 -0
  101. package/dist/models/file.d.ts.map +1 -0
  102. package/dist/models/file.js +126 -0
  103. package/dist/models/file.js.map +1 -0
  104. package/dist/models/folder.d.ts +295 -0
  105. package/dist/models/folder.d.ts.map +1 -0
  106. package/dist/models/folder.js +202 -0
  107. package/dist/models/folder.js.map +1 -0
  108. package/dist/models/labChat.d.ts +243 -0
  109. package/dist/models/labChat.d.ts.map +1 -0
  110. package/dist/models/labChat.js +204 -0
  111. package/dist/models/labChat.js.map +1 -0
  112. package/dist/models/marketing.d.ts +72 -0
  113. package/dist/models/marketing.d.ts.map +1 -0
  114. package/dist/models/marketing.js +26 -0
  115. package/dist/models/marketing.js.map +1 -0
  116. package/dist/models/message.d.ts +100 -0
  117. package/dist/models/message.d.ts.map +1 -0
  118. package/dist/models/message.js +131 -0
  119. package/dist/models/message.js.map +1 -0
  120. package/dist/models/newtonChat.d.ts +72 -0
  121. package/dist/models/newtonChat.d.ts.map +1 -0
  122. package/dist/models/newtonChat.js +61 -0
  123. package/dist/models/newtonChat.js.map +1 -0
  124. package/dist/models/notification.d.ts +65 -0
  125. package/dist/models/notification.d.ts.map +1 -0
  126. package/dist/models/notification.js +46 -0
  127. package/dist/models/notification.js.map +1 -0
  128. package/dist/models/section.d.ts +102 -0
  129. package/dist/models/section.d.ts.map +1 -0
  130. package/dist/models/section.js +83 -0
  131. package/dist/models/section.js.map +1 -0
  132. package/dist/models/user.d.ts +39 -0
  133. package/dist/models/user.d.ts.map +1 -0
  134. package/dist/models/user.js +38 -0
  135. package/dist/models/user.js.map +1 -0
  136. package/dist/models/worksheet.d.ts +460 -0
  137. package/dist/models/worksheet.d.ts.map +1 -0
  138. package/dist/models/worksheet.js +200 -0
  139. package/dist/models/worksheet.js.map +1 -0
  140. package/dist/pipelines/aiLabChat.d.ts +21 -0
  141. package/dist/pipelines/aiLabChat.d.ts.map +1 -0
  142. package/dist/pipelines/aiLabChat.js +460 -0
  143. package/dist/pipelines/aiLabChat.js.map +1 -0
  144. package/dist/pipelines/aiNewtonChat.d.ts +30 -0
  145. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -0
  146. package/dist/pipelines/aiNewtonChat.js +289 -0
  147. package/dist/pipelines/aiNewtonChat.js.map +1 -0
  148. package/dist/pipelines/gradeWorksheet.d.ts +30 -0
  149. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -0
  150. package/dist/pipelines/gradeWorksheet.js +252 -0
  151. package/dist/pipelines/gradeWorksheet.js.map +1 -0
  152. package/dist/routers/_app.d.ts +6403 -3741
  153. package/dist/routers/_app.d.ts.map +1 -1
  154. package/dist/routers/_app.js +10 -0
  155. package/dist/routers/_app.js.map +1 -0
  156. package/dist/routers/agenda.d.ts +58 -6
  157. package/dist/routers/agenda.d.ts.map +1 -1
  158. package/dist/routers/agenda.js +6 -58
  159. package/dist/routers/agenda.js.map +1 -0
  160. package/dist/routers/announcement.d.ts +325 -6
  161. package/dist/routers/announcement.d.ts.map +1 -1
  162. package/dist/routers/announcement.js +547 -57
  163. package/dist/routers/announcement.js.map +1 -0
  164. package/dist/routers/assignment.d.ts +431 -318
  165. package/dist/routers/assignment.d.ts.map +1 -1
  166. package/dist/routers/assignment.js +104 -1559
  167. package/dist/routers/assignment.js.map +1 -0
  168. package/dist/routers/attendance.d.ts +20 -9
  169. package/dist/routers/attendance.d.ts.map +1 -1
  170. package/dist/routers/attendance.js +10 -263
  171. package/dist/routers/attendance.js.map +1 -0
  172. package/dist/routers/auth.d.ts +21 -1
  173. package/dist/routers/auth.d.ts.map +1 -1
  174. package/dist/routers/auth.js +37 -241
  175. package/dist/routers/auth.js.map +1 -0
  176. package/dist/routers/class.d.ts +198 -68
  177. package/dist/routers/class.d.ts.map +1 -1
  178. package/dist/routers/class.js +88 -909
  179. package/dist/routers/class.js.map +1 -0
  180. package/dist/routers/comment.d.ts +153 -0
  181. package/dist/routers/comment.d.ts.map +1 -0
  182. package/dist/routers/comment.js +58 -0
  183. package/dist/routers/comment.js.map +1 -0
  184. package/dist/routers/conversation.d.ts +73 -3
  185. package/dist/routers/conversation.d.ts.map +1 -1
  186. package/dist/routers/conversation.js +23 -265
  187. package/dist/routers/conversation.js.map +1 -0
  188. package/dist/routers/event.d.ts +46 -37
  189. package/dist/routers/event.d.ts.map +1 -1
  190. package/dist/routers/event.js +15 -431
  191. package/dist/routers/event.js.map +1 -0
  192. package/dist/routers/file.d.ts +4 -2
  193. package/dist/routers/file.d.ts.map +1 -1
  194. package/dist/routers/file.js +11 -295
  195. package/dist/routers/file.js.map +1 -0
  196. package/dist/routers/folder.d.ts +21 -14
  197. package/dist/routers/folder.d.ts.map +1 -1
  198. package/dist/routers/folder.js +36 -743
  199. package/dist/routers/folder.js.map +1 -0
  200. package/dist/routers/labChat.d.ts +12 -9
  201. package/dist/routers/labChat.d.ts.map +1 -1
  202. package/dist/routers/labChat.js +21 -877
  203. package/dist/routers/labChat.js.map +1 -0
  204. package/dist/routers/marketing.d.ts +2 -2
  205. package/dist/routers/marketing.d.ts.map +1 -1
  206. package/dist/routers/marketing.js +9 -54
  207. package/dist/routers/marketing.js.map +1 -0
  208. package/dist/routers/message.d.ts +2 -1
  209. package/dist/routers/message.d.ts.map +1 -1
  210. package/dist/routers/message.js +29 -519
  211. package/dist/routers/message.js.map +1 -0
  212. package/dist/routers/newtonChat.d.ts +55 -0
  213. package/dist/routers/newtonChat.d.ts.map +1 -0
  214. package/dist/routers/newtonChat.js +22 -0
  215. package/dist/routers/newtonChat.js.map +1 -0
  216. package/dist/routers/notifications.d.ts +8 -8
  217. package/dist/routers/notifications.d.ts.map +1 -1
  218. package/dist/routers/notifications.js +20 -81
  219. package/dist/routers/notifications.js.map +1 -0
  220. package/dist/routers/section.d.ts +37 -6
  221. package/dist/routers/section.d.ts.map +1 -1
  222. package/dist/routers/section.js +26 -167
  223. package/dist/routers/section.js.map +1 -0
  224. package/dist/routers/user.d.ts +1 -1
  225. package/dist/routers/user.d.ts.map +1 -1
  226. package/dist/routers/user.js +34 -204
  227. package/dist/routers/user.js.map +1 -0
  228. package/dist/routers/worksheet.d.ts +362 -0
  229. package/dist/routers/worksheet.d.ts.map +1 -0
  230. package/dist/routers/worksheet.js +153 -0
  231. package/dist/routers/worksheet.js.map +1 -0
  232. package/dist/seedDatabase.d.ts +2 -3
  233. package/dist/seedDatabase.d.ts.map +1 -1
  234. package/dist/seedDatabase.js +311 -289
  235. package/dist/seedDatabase.js.map +1 -0
  236. package/dist/server/pipelines/aiLabChat.d.ts +21 -0
  237. package/dist/server/pipelines/aiLabChat.d.ts.map +1 -0
  238. package/dist/server/pipelines/aiLabChat.js +456 -0
  239. package/dist/server/pipelines/aiLabChat.js.map +1 -0
  240. package/dist/server/pipelines/aiNewtonChat.d.ts +30 -0
  241. package/dist/server/pipelines/aiNewtonChat.d.ts.map +1 -0
  242. package/dist/server/pipelines/aiNewtonChat.js +285 -0
  243. package/dist/server/pipelines/aiNewtonChat.js.map +1 -0
  244. package/dist/server/pipelines/gradeWorksheet.d.ts +30 -0
  245. package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -0
  246. package/dist/server/pipelines/gradeWorksheet.js +248 -0
  247. package/dist/server/pipelines/gradeWorksheet.js.map +1 -0
  248. package/dist/services/agenda.d.ts +100 -0
  249. package/dist/services/agenda.d.ts.map +1 -0
  250. package/dist/services/agenda.js +21 -0
  251. package/dist/services/agenda.js.map +1 -0
  252. package/dist/services/announcement.d.ts +135 -0
  253. package/dist/services/announcement.d.ts.map +1 -0
  254. package/dist/services/announcement.js +223 -0
  255. package/dist/services/announcement.js.map +1 -0
  256. package/dist/services/assignment.d.ts +1462 -0
  257. package/dist/services/assignment.d.ts.map +1 -0
  258. package/dist/services/assignment.js +898 -0
  259. package/dist/services/assignment.js.map +1 -0
  260. package/dist/services/attendance.d.ts +93 -0
  261. package/dist/services/attendance.d.ts.map +1 -0
  262. package/dist/services/attendance.js +61 -0
  263. package/dist/services/attendance.js.map +1 -0
  264. package/dist/services/auth.d.ts +68 -0
  265. package/dist/services/auth.d.ts.map +1 -0
  266. package/dist/services/auth.js +218 -0
  267. package/dist/services/auth.js.map +1 -0
  268. package/dist/services/class.d.ts +621 -0
  269. package/dist/services/class.d.ts.map +1 -0
  270. package/dist/services/class.js +474 -0
  271. package/dist/services/class.js.map +1 -0
  272. package/dist/services/comment.d.ts +100 -0
  273. package/dist/services/comment.d.ts.map +1 -0
  274. package/dist/services/comment.js +83 -0
  275. package/dist/services/comment.js.map +1 -0
  276. package/dist/services/conversation.d.ts +159 -0
  277. package/dist/services/conversation.d.ts.map +1 -0
  278. package/dist/services/conversation.js +138 -0
  279. package/dist/services/conversation.js.map +1 -0
  280. package/dist/services/event.d.ts +216 -0
  281. package/dist/services/event.d.ts.map +1 -0
  282. package/dist/services/event.js +168 -0
  283. package/dist/services/event.js.map +1 -0
  284. package/dist/services/file.d.ts +74 -0
  285. package/dist/services/file.d.ts.map +1 -0
  286. package/dist/services/file.js +133 -0
  287. package/dist/services/file.js.map +1 -0
  288. package/dist/services/folder.d.ts +239 -0
  289. package/dist/services/folder.d.ts.map +1 -0
  290. package/dist/services/folder.js +248 -0
  291. package/dist/services/folder.js.map +1 -0
  292. package/dist/services/labChat.d.ts +165 -0
  293. package/dist/services/labChat.d.ts.map +1 -0
  294. package/dist/services/labChat.js +289 -0
  295. package/dist/services/labChat.js.map +1 -0
  296. package/dist/services/marketing.d.ts +50 -0
  297. package/dist/services/marketing.d.ts.map +1 -0
  298. package/dist/services/marketing.js +32 -0
  299. package/dist/services/marketing.js.map +1 -0
  300. package/dist/services/message.d.ts +95 -0
  301. package/dist/services/message.d.ts.map +1 -0
  302. package/dist/services/message.js +350 -0
  303. package/dist/services/message.js.map +1 -0
  304. package/dist/services/newtonChat.d.ts +22 -0
  305. package/dist/services/newtonChat.d.ts.map +1 -0
  306. package/dist/services/newtonChat.js +174 -0
  307. package/dist/services/newtonChat.js.map +1 -0
  308. package/dist/services/notification.d.ts +65 -0
  309. package/dist/services/notification.d.ts.map +1 -0
  310. package/dist/services/notification.js +33 -0
  311. package/dist/services/notification.js.map +1 -0
  312. package/dist/services/section.d.ts +53 -0
  313. package/dist/services/section.d.ts.map +1 -0
  314. package/dist/services/section.js +199 -0
  315. package/dist/services/section.js.map +1 -0
  316. package/dist/services/user.d.ts +48 -0
  317. package/dist/services/user.d.ts.map +1 -0
  318. package/dist/services/user.js +141 -0
  319. package/dist/services/user.js.map +1 -0
  320. package/dist/services/worksheet.d.ts +239 -0
  321. package/dist/services/worksheet.d.ts.map +1 -0
  322. package/dist/services/worksheet.js +235 -0
  323. package/dist/services/worksheet.js.map +1 -0
  324. package/dist/socket/handlers.d.ts.map +1 -1
  325. package/dist/socket/handlers.js +4 -0
  326. package/dist/socket/handlers.js.map +1 -0
  327. package/dist/trpc.d.ts.map +1 -1
  328. package/dist/trpc.js +4 -0
  329. package/dist/trpc.js.map +1 -0
  330. package/dist/types/trpc.d.ts.map +1 -1
  331. package/dist/types/trpc.js +4 -0
  332. package/dist/types/trpc.js.map +1 -0
  333. package/dist/utils/aiUser.d.ts +1 -3
  334. package/dist/utils/aiUser.d.ts.map +1 -1
  335. package/dist/utils/aiUser.js +8 -3
  336. package/dist/utils/aiUser.js.map +1 -0
  337. package/dist/utils/email.d.ts +12 -1
  338. package/dist/utils/email.d.ts.map +1 -1
  339. package/dist/utils/email.js +26 -4
  340. package/dist/utils/email.js.map +1 -0
  341. package/dist/utils/generateInviteCode.d.ts +1 -2
  342. package/dist/utils/generateInviteCode.d.ts.map +1 -1
  343. package/dist/utils/generateInviteCode.js +5 -2
  344. package/dist/utils/generateInviteCode.js.map +1 -0
  345. package/dist/utils/inference.d.ts +8 -0
  346. package/dist/utils/inference.d.ts.map +1 -1
  347. package/dist/utils/inference.js +78 -10
  348. package/dist/utils/inference.js.map +1 -0
  349. package/dist/utils/logger.d.ts +4 -0
  350. package/dist/utils/logger.d.ts.map +1 -1
  351. package/dist/utils/logger.js +35 -3
  352. package/dist/utils/logger.js.map +1 -0
  353. package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
  354. package/dist/utils/prismaErrorHandler.js +7 -0
  355. package/dist/utils/prismaErrorHandler.js.map +1 -0
  356. package/dist/utils/prismaWrapper.d.ts +1 -0
  357. package/dist/utils/prismaWrapper.d.ts.map +1 -1
  358. package/dist/utils/prismaWrapper.js +8 -0
  359. package/dist/utils/prismaWrapper.js.map +1 -0
  360. package/docker-compose.yml +19 -0
  361. package/package.json +21 -4
  362. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +30 -0
  363. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +35 -0
  364. package/prisma/schema.prisma +180 -12
  365. package/scripts/test-pre-push.ts +14 -0
  366. package/src/index.ts +247 -52
  367. package/src/instrument.ts +15 -0
  368. package/src/lib/config/env.ts +132 -0
  369. package/src/lib/fileUpload.ts +81 -16
  370. package/src/lib/googleCloudStorage.ts +42 -6
  371. package/src/lib/jsonConversion.ts +12 -14
  372. package/src/lib/prisma.ts +23 -2
  373. package/src/lib/pusher.ts +11 -6
  374. package/src/lib/redis.ts +56 -0
  375. package/src/lib/thumbnailGenerator.ts +170 -168
  376. package/src/middleware/auth.ts +86 -137
  377. package/src/middleware/security.ts +80 -0
  378. package/src/models/agenda.ts +46 -0
  379. package/src/models/announcement.ts +134 -0
  380. package/src/models/assignment.ts +322 -0
  381. package/src/models/attendance.ts +208 -0
  382. package/src/models/auth.ts +247 -0
  383. package/src/models/class.ts +598 -0
  384. package/src/models/comment.ts +152 -0
  385. package/src/models/conversation.ts +200 -0
  386. package/src/models/event.ts +177 -0
  387. package/src/models/file.ts +129 -0
  388. package/src/models/folder.ts +225 -0
  389. package/src/models/labChat.ts +213 -0
  390. package/src/models/marketing.ts +45 -0
  391. package/src/models/message.ts +153 -0
  392. package/src/models/newtonChat.ts +70 -0
  393. package/src/models/notification.ts +54 -0
  394. package/src/models/section.ts +98 -0
  395. package/src/models/user.ts +47 -0
  396. package/src/models/worksheet.ts +294 -0
  397. package/src/pipelines/aiLabChat.ts +511 -0
  398. package/src/pipelines/aiNewtonChat.ts +347 -0
  399. package/src/pipelines/gradeWorksheet.ts +286 -0
  400. package/src/routers/_app.ts +6 -0
  401. package/src/routers/agenda.ts +3 -61
  402. package/src/routers/announcement.ts +622 -57
  403. package/src/routers/assignment.ts +157 -1688
  404. package/src/routers/attendance.ts +16 -277
  405. package/src/routers/auth.ts +79 -313
  406. package/src/routers/class.ts +265 -1038
  407. package/src/routers/comment.ts +76 -0
  408. package/src/routers/conversation.ts +53 -284
  409. package/src/routers/event.ts +50 -481
  410. package/src/routers/file.ts +45 -341
  411. package/src/routers/folder.ts +107 -836
  412. package/src/routers/labChat.ts +29 -960
  413. package/src/routers/marketing.ts +35 -77
  414. package/src/routers/message.ts +45 -571
  415. package/src/routers/newtonChat.ts +36 -0
  416. package/src/routers/notifications.ts +32 -82
  417. package/src/routers/section.ts +58 -200
  418. package/src/routers/user.ts +49 -226
  419. package/src/routers/worksheet.ts +252 -0
  420. package/src/seedDatabase.ts +330 -290
  421. package/src/services/agenda.ts +21 -0
  422. package/src/services/announcement.ts +290 -0
  423. package/src/services/assignment.ts +1198 -0
  424. package/src/services/attendance.ts +85 -0
  425. package/src/services/auth.ts +277 -0
  426. package/src/services/class.ts +622 -0
  427. package/src/services/comment.ts +106 -0
  428. package/src/services/conversation.ts +213 -0
  429. package/src/services/event.ts +231 -0
  430. package/src/services/file.ts +167 -0
  431. package/src/services/folder.ts +316 -0
  432. package/src/services/labChat.ts +352 -0
  433. package/src/services/marketing.ts +57 -0
  434. package/src/services/message.ts +461 -0
  435. package/src/services/newtonChat.ts +222 -0
  436. package/src/services/notification.ts +50 -0
  437. package/src/services/section.ts +283 -0
  438. package/src/services/user.ts +172 -0
  439. package/src/services/worksheet.ts +358 -0
  440. package/src/trpc.ts +4 -0
  441. package/src/utils/aiUser.ts +4 -3
  442. package/src/utils/email.ts +33 -4
  443. package/src/utils/generateInviteCode.ts +1 -3
  444. package/src/utils/inference.ts +89 -10
  445. package/src/utils/logger.ts +33 -3
  446. package/src/utils/prismaErrorHandler.ts +3 -0
  447. package/src/utils/prismaWrapper.ts +4 -0
  448. package/tests/globalSetup.ts +62 -0
  449. package/tests/helpers.ts +22 -0
  450. package/tests/middleware/security.test.ts +42 -0
  451. package/tests/routers/agenda.test.ts +138 -0
  452. package/tests/routers/announcement.test.ts +490 -0
  453. package/tests/routers/assignment.test.ts +837 -0
  454. package/tests/routers/attendance.test.ts +160 -0
  455. package/tests/routers/auth.test.ts +171 -0
  456. package/tests/{class.test.ts → routers/class.test.ts} +163 -92
  457. package/tests/routers/comment.test.ts +126 -0
  458. package/tests/routers/conversation.test.ts +145 -0
  459. package/tests/routers/event.test.ts +289 -0
  460. package/tests/routers/folder.test.ts +178 -0
  461. package/tests/routers/labChat.test.ts +115 -0
  462. package/tests/routers/marketing.test.ts +59 -0
  463. package/tests/routers/message.test.ts +123 -0
  464. package/tests/routers/notification.test.ts +69 -0
  465. package/tests/routers/section.test.ts +208 -0
  466. package/tests/server/rateLimit.test.ts +73 -0
  467. package/tests/setup.ts +39 -65
  468. package/tests/user.test.ts +136 -0
  469. package/tests/utils/aiUser.test.ts +22 -0
  470. package/tests/utils/generateInviteCode.test.ts +24 -0
  471. package/tests/utils/logger.test.ts +74 -0
  472. package/tests/utils/prismaErrorHandler.test.ts +101 -0
  473. package/tests/utils/prismaWrapper.test.ts +82 -0
  474. package/tests/worksheet.test.ts +181 -0
  475. package/tsconfig.json +9 -2
  476. package/vitest.config.ts +30 -1
  477. package/vitest.unit.config.ts +21 -0
  478. package/API_SPECIFICATION.md +0 -1597
  479. package/BASE64_REMOVAL_SUMMARY.md +0 -164
  480. package/CHAT_API_SPEC.md +0 -579
  481. package/LAB_CHAT_API_SPEC.md +0 -518
  482. package/dist/routers/school.d.ts +0 -208
  483. package/dist/routers/school.d.ts.map +0 -1
  484. package/dist/routers/school.js +0 -481
  485. package/tests/auth.test.ts +0 -25
@@ -1,158 +1,159 @@
1
- import sharp from 'sharp';
2
- import { getSignedUrl } from './googleCloudStorage.js';
3
- // Thumbnail size configuration
4
- const THUMBNAIL_WIDTH = 200;
5
- const THUMBNAIL_HEIGHT = 200;
6
- // File type configurations
7
- const SUPPORTED_IMAGE_TYPES = [
8
- 'image/jpeg',
9
- 'image/png',
10
- 'image/gif',
11
- 'image/webp',
12
- 'image/tiff',
13
- 'image/bmp',
14
- 'image/avif'
15
- ];
16
- const DOCUMENT_TYPES = [
17
- 'application/pdf',
18
- 'application/msword',
19
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
20
- 'application/vnd.ms-excel',
21
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
22
- 'application/vnd.ms-powerpoint',
23
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx
24
- 'text/plain',
25
- 'text/csv',
26
- 'application/json',
27
- 'text/html',
28
- 'text/javascript',
29
- 'text/css'
30
- ];
31
- const VIDEO_TYPES = [
32
- 'video/mp4',
33
- 'video/webm',
34
- 'video/ogg',
35
- 'video/quicktime'
36
- ];
37
- const AUDIO_TYPES = [
38
- 'audio/mpeg',
39
- 'audio/ogg',
40
- 'audio/wav',
41
- 'audio/webm'
42
- ];
43
- /**
44
- * Generates a thumbnail for an image or PDF file
45
- * @param fileBuffer The file buffer
46
- * @param fileType The MIME type of the file
47
- * @returns Thumbnail buffer
48
- */
49
- export async function generateMediaThumbnail(fileBuffer, fileType) {
50
- if (fileType === 'application/pdf') {
51
- // For PDFs, we need to use a different approach
52
- try {
53
- return await sharp(fileBuffer, {
54
- density: 300, // Higher density for better quality
55
- page: 0 // First page only
56
- })
57
- .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {
58
- fit: 'inside',
59
- withoutEnlargement: true,
60
- })
61
- .jpeg({ quality: 80 })
62
- .toBuffer();
63
- }
64
- catch (error) {
65
- console.warn('Failed to generate PDF thumbnail:', error);
66
- return generateGenericThumbnail(fileType);
67
- }
68
- }
69
- // For regular images
70
- return sharp(fileBuffer)
71
- .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {
72
- fit: 'inside',
73
- withoutEnlargement: true,
74
- })
75
- .jpeg({ quality: 80 })
76
- .toBuffer();
77
- }
78
- /**
79
- * Generates a generic icon-based thumbnail for a file type
80
- * @param fileType The MIME type of the file
81
- * @returns Thumbnail buffer
82
- */
83
- async function generateGenericThumbnail(fileType) {
84
- // Create a blank canvas with a colored background based on file type
85
- const canvas = sharp({
86
- create: {
87
- width: THUMBNAIL_WIDTH,
88
- height: THUMBNAIL_HEIGHT,
89
- channels: 4,
90
- background: { r: 245, g: 245, b: 245, alpha: 1 }
91
- }
92
- });
93
- // Add a colored overlay based on file type
94
- let color = { r: 200, g: 200, b: 200, alpha: 0.5 }; // Default gray
95
- if (DOCUMENT_TYPES.includes(fileType)) {
96
- color = { r: 52, g: 152, b: 219, alpha: 0.5 }; // Blue for documents
97
- }
98
- else if (VIDEO_TYPES.includes(fileType)) {
99
- color = { r: 231, g: 76, b: 60, alpha: 0.5 }; // Red for videos
100
- }
101
- else if (AUDIO_TYPES.includes(fileType)) {
102
- color = { r: 46, g: 204, b: 113, alpha: 0.5 }; // Green for audio
103
- }
104
- return canvas
105
- .composite([{
106
- input: Buffer.from([color.r, color.g, color.b, Math.floor(color.alpha * 255)]),
107
- raw: {
108
- width: 1,
109
- height: 1,
110
- channels: 4
111
- },
112
- tile: true,
113
- blend: 'overlay'
114
- }])
115
- .jpeg({ quality: 80 })
116
- .toBuffer();
117
- }
118
- /**
119
- * Generates a thumbnail for a file
120
- * @param fileName The name of the file in Google Cloud Storage
121
- * @param fileType The MIME type of the file
122
- * @returns The thumbnail buffer or null if thumbnail generation is not supported
123
- */
124
- export async function generateThumbnail(fileName, fileType) {
125
- try {
126
- const signedUrl = await getSignedUrl(fileName);
127
- const response = await fetch(signedUrl);
128
- if (!response.ok) {
129
- throw new Error(`Failed to download file from storage: ${response.status} ${response.statusText}`);
130
- }
131
- const fileBuffer = await response.arrayBuffer();
132
- if (SUPPORTED_IMAGE_TYPES.includes(fileType) || fileType === 'application/pdf') {
133
- try {
134
- const thumbnail = await generateMediaThumbnail(Buffer.from(fileBuffer), fileType);
135
- return thumbnail;
136
- }
137
- catch (error) {
138
- return generateGenericThumbnail(fileType);
139
- }
140
- }
141
- else if ([...DOCUMENT_TYPES, ...VIDEO_TYPES, ...AUDIO_TYPES].includes(fileType)) {
142
- return generateGenericThumbnail(fileType);
143
- }
144
- return null; // Unsupported file type
145
- }
146
- catch (error) {
147
- return null;
148
- }
149
- }
150
- /**
151
- * Stores a thumbnail in Google Cloud Storage and creates a File entry
152
- * @param thumbnailBuffer The thumbnail buffer to store
153
- * @param originalFileName The original file name
154
- * @param userId The user ID who owns the file
155
- * @returns The ID of the created thumbnail File
156
- */
157
- // DEPRECATED: This function is no longer used - thumbnails are generated during direct uploads
158
- // Thumbnail generation is now handled in the direct upload flow
1
+ "use strict";
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]="8a494bec-8974-5f11-ae01-d96a89e7d69b")}catch(e){}}();
3
+
4
+ // @deprecated: this is not used anymore
5
+ // import sharp from 'sharp';
6
+ // import { prisma } from './prisma.js';
7
+ // import { deleteFile, getSignedUrl } from './googleCloudStorage.js';
8
+ // // Thumbnail size configuration
9
+ // const THUMBNAIL_WIDTH = 200;
10
+ // const THUMBNAIL_HEIGHT = 200;
11
+ // // File type configurations
12
+ // const SUPPORTED_IMAGE_TYPES = [
13
+ // 'image/jpeg',
14
+ // 'image/png',
15
+ // 'image/gif',
16
+ // 'image/webp',
17
+ // 'image/tiff',
18
+ // 'image/bmp',
19
+ // 'image/avif'
20
+ // ];
21
+ // const DOCUMENT_TYPES = [
22
+ // 'application/pdf',
23
+ // 'application/msword',
24
+ // 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
25
+ // 'application/vnd.ms-excel',
26
+ // 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
27
+ // 'application/vnd.ms-powerpoint',
28
+ // 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx
29
+ // 'text/plain',
30
+ // 'text/csv',
31
+ // 'application/json',
32
+ // 'text/html',
33
+ // 'text/javascript',
34
+ // 'text/css'
35
+ // ];
36
+ // const VIDEO_TYPES = [
37
+ // 'video/mp4',
38
+ // 'video/webm',
39
+ // 'video/ogg',
40
+ // 'video/quicktime'
41
+ // ];
42
+ // const AUDIO_TYPES = [
43
+ // 'audio/mpeg',
44
+ // 'audio/ogg',
45
+ // 'audio/wav',
46
+ // 'audio/webm'
47
+ // ];
48
+ // /**
49
+ // * Generates a thumbnail for an image or PDF file
50
+ // * @param fileBuffer The file buffer
51
+ // * @param fileType The MIME type of the file
52
+ // * @returns Thumbnail buffer
53
+ // */
54
+ // export async function generateMediaThumbnail(fileBuffer: Buffer, fileType: string): Promise<Buffer> {
55
+ // if (fileType === 'application/pdf') {
56
+ // // For PDFs, we need to use a different approach
57
+ // try {
58
+ // return await sharp(fileBuffer, {
59
+ // density: 300, // Higher density for better quality
60
+ // page: 0 // First page only
61
+ // })
62
+ // .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {
63
+ // fit: 'inside',
64
+ // withoutEnlargement: true,
65
+ // })
66
+ // .jpeg({ quality: 80 })
67
+ // .toBuffer();
68
+ // } catch (error) {
69
+ // console.warn('Failed to generate PDF thumbnail:', error);
70
+ // return generateGenericThumbnail(fileType);
71
+ // }
72
+ // }
73
+ // // For regular images
74
+ // return sharp(fileBuffer)
75
+ // .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {
76
+ // fit: 'inside',
77
+ // withoutEnlargement: true,
78
+ // })
79
+ // .jpeg({ quality: 80 })
80
+ // .toBuffer();
81
+ // }
82
+ // /**
83
+ // * Generates a generic icon-based thumbnail for a file type
84
+ // * @param fileType The MIME type of the file
85
+ // * @returns Thumbnail buffer
86
+ // */
87
+ // async function generateGenericThumbnail(fileType: string): Promise<Buffer> {
88
+ // // Create a blank canvas with a colored background based on file type
89
+ // const canvas = sharp({
90
+ // create: {
91
+ // width: THUMBNAIL_WIDTH,
92
+ // height: THUMBNAIL_HEIGHT,
93
+ // channels: 4,
94
+ // background: { r: 245, g: 245, b: 245, alpha: 1 }
95
+ // }
96
+ // });
97
+ // // Add a colored overlay based on file type
98
+ // let color = { r: 200, g: 200, b: 200, alpha: 0.5 }; // Default gray
99
+ // if (DOCUMENT_TYPES.includes(fileType)) {
100
+ // color = { r: 52, g: 152, b: 219, alpha: 0.5 }; // Blue for documents
101
+ // } else if (VIDEO_TYPES.includes(fileType)) {
102
+ // color = { r: 231, g: 76, b: 60, alpha: 0.5 }; // Red for videos
103
+ // } else if (AUDIO_TYPES.includes(fileType)) {
104
+ // color = { r: 46, g: 204, b: 113, alpha: 0.5 }; // Green for audio
105
+ // }
106
+ // return canvas
107
+ // .composite([{
108
+ // input: Buffer.from([color.r, color.g, color.b, Math.floor(color.alpha * 255)]),
109
+ // raw: {
110
+ // width: 1,
111
+ // height: 1,
112
+ // channels: 4
113
+ // },
114
+ // tile: true,
115
+ // blend: 'overlay'
116
+ // }])
117
+ // .jpeg({ quality: 80 })
118
+ // .toBuffer();
119
+ // }
120
+ // /**
121
+ // * Generates a thumbnail for a file
122
+ // * @param fileName The name of the file in Google Cloud Storage
123
+ // * @param fileType The MIME type of the file
124
+ // * @returns The thumbnail buffer or null if thumbnail generation is not supported
125
+ // */
126
+ // export async function generateThumbnail(fileName: string, fileType: string): Promise<Buffer | null> {
127
+ // try {
128
+ // const signedUrl = await getSignedUrl(fileName);
129
+ // const response = await fetch(signedUrl);
130
+ // if (!response.ok) {
131
+ // throw new Error(`Failed to download file from storage: ${response.status} ${response.statusText}`);
132
+ // }
133
+ // const fileBuffer = await response.arrayBuffer();
134
+ // if (SUPPORTED_IMAGE_TYPES.includes(fileType) || fileType === 'application/pdf') {
135
+ // try {
136
+ // const thumbnail = await generateMediaThumbnail(Buffer.from(fileBuffer), fileType);
137
+ // return thumbnail;
138
+ // } catch (error) {
139
+ // return generateGenericThumbnail(fileType);
140
+ // }
141
+ // } else if ([...DOCUMENT_TYPES, ...VIDEO_TYPES, ...AUDIO_TYPES].includes(fileType)) {
142
+ // return generateGenericThumbnail(fileType);
143
+ // }
144
+ // return null; // Unsupported file type
145
+ // } catch (error) {
146
+ // return null;
147
+ // }
148
+ // }
149
+ // /**
150
+ // * Stores a thumbnail in Google Cloud Storage and creates a File entry
151
+ // * @param thumbnailBuffer The thumbnail buffer to store
152
+ // * @param originalFileName The original file name
153
+ // * @param userId The user ID who owns the file
154
+ // * @returns The ID of the created thumbnail File
155
+ // */
156
+ // // DEPRECATED: This function is no longer used - thumbnails are generated during direct uploads
157
+ // // Thumbnail generation is now handled in the direct upload flow
158
+ //# sourceMappingURL=thumbnailGenerator.js.map
159
+ //# debugId=8a494bec-8974-5f11-ae01-d96a89e7d69b
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnailGenerator.js","sources":["lib/thumbnailGenerator.ts"],"sourceRoot":"/","sourcesContent":["// @deprecated: this is not used anymore\n\n// import sharp from 'sharp';\n// import { prisma } from './prisma.js';\n// import { deleteFile, getSignedUrl } from './googleCloudStorage.js';\n\n// // Thumbnail size configuration\n// const THUMBNAIL_WIDTH = 200;\n// const THUMBNAIL_HEIGHT = 200;\n\n// // File type configurations\n// const SUPPORTED_IMAGE_TYPES = [\n// 'image/jpeg',\n// 'image/png',\n// 'image/gif',\n// 'image/webp',\n// 'image/tiff',\n// 'image/bmp',\n// 'image/avif'\n// ];\n\n// const DOCUMENT_TYPES = [\n// 'application/pdf',\n// 'application/msword',\n// 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx\n// 'application/vnd.ms-excel',\n// 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx\n// 'application/vnd.ms-powerpoint',\n// 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx\n// 'text/plain',\n// 'text/csv',\n// 'application/json',\n// 'text/html',\n// 'text/javascript',\n// 'text/css'\n// ];\n\n// const VIDEO_TYPES = [\n// 'video/mp4',\n// 'video/webm',\n// 'video/ogg',\n// 'video/quicktime'\n// ];\n\n// const AUDIO_TYPES = [\n// 'audio/mpeg',\n// 'audio/ogg',\n// 'audio/wav',\n// 'audio/webm'\n// ];\n\n// /**\n// * Generates a thumbnail for an image or PDF file\n// * @param fileBuffer The file buffer\n// * @param fileType The MIME type of the file\n// * @returns Thumbnail buffer\n// */\n// export async function generateMediaThumbnail(fileBuffer: Buffer, fileType: string): Promise<Buffer> {\n// if (fileType === 'application/pdf') {\n// // For PDFs, we need to use a different approach\n// try {\n// return await sharp(fileBuffer, { \n// density: 300, // Higher density for better quality\n// page: 0 // First page only\n// })\n// .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {\n// fit: 'inside',\n// withoutEnlargement: true,\n// })\n// .jpeg({ quality: 80 })\n// .toBuffer();\n// } catch (error) {\n// console.warn('Failed to generate PDF thumbnail:', error);\n// return generateGenericThumbnail(fileType);\n// }\n// }\n \n// // For regular images\n// return sharp(fileBuffer)\n// .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {\n// fit: 'inside',\n// withoutEnlargement: true,\n// })\n// .jpeg({ quality: 80 })\n// .toBuffer();\n// }\n\n// /**\n// * Generates a generic icon-based thumbnail for a file type\n// * @param fileType The MIME type of the file\n// * @returns Thumbnail buffer\n// */\n// async function generateGenericThumbnail(fileType: string): Promise<Buffer> {\n// // Create a blank canvas with a colored background based on file type\n// const canvas = sharp({\n// create: {\n// width: THUMBNAIL_WIDTH,\n// height: THUMBNAIL_HEIGHT,\n// channels: 4,\n// background: { r: 245, g: 245, b: 245, alpha: 1 }\n// }\n// });\n\n// // Add a colored overlay based on file type\n// let color = { r: 200, g: 200, b: 200, alpha: 0.5 }; // Default gray\n\n// if (DOCUMENT_TYPES.includes(fileType)) {\n// color = { r: 52, g: 152, b: 219, alpha: 0.5 }; // Blue for documents\n// } else if (VIDEO_TYPES.includes(fileType)) {\n// color = { r: 231, g: 76, b: 60, alpha: 0.5 }; // Red for videos\n// } else if (AUDIO_TYPES.includes(fileType)) {\n// color = { r: 46, g: 204, b: 113, alpha: 0.5 }; // Green for audio\n// }\n\n// return canvas\n// .composite([{\n// input: Buffer.from([color.r, color.g, color.b, Math.floor(color.alpha * 255)]),\n// raw: {\n// width: 1,\n// height: 1,\n// channels: 4\n// },\n// tile: true,\n// blend: 'overlay'\n// }])\n// .jpeg({ quality: 80 })\n// .toBuffer();\n// }\n\n// /**\n// * Generates a thumbnail for a file\n// * @param fileName The name of the file in Google Cloud Storage\n// * @param fileType The MIME type of the file\n// * @returns The thumbnail buffer or null if thumbnail generation is not supported\n// */\n// export async function generateThumbnail(fileName: string, fileType: string): Promise<Buffer | null> {\n// try {\n// const signedUrl = await getSignedUrl(fileName);\n// const response = await fetch(signedUrl);\n \n// if (!response.ok) {\n// throw new Error(`Failed to download file from storage: ${response.status} ${response.statusText}`);\n// }\n\n// const fileBuffer = await response.arrayBuffer();\n\n// if (SUPPORTED_IMAGE_TYPES.includes(fileType) || fileType === 'application/pdf') {\n// try {\n// const thumbnail = await generateMediaThumbnail(Buffer.from(fileBuffer), fileType);\n// return thumbnail;\n// } catch (error) {\n// return generateGenericThumbnail(fileType);\n// }\n// } else if ([...DOCUMENT_TYPES, ...VIDEO_TYPES, ...AUDIO_TYPES].includes(fileType)) {\n// return generateGenericThumbnail(fileType);\n// }\n\n// return null; // Unsupported file type\n// } catch (error) {\n// return null;\n// }\n// }\n\n// /**\n// * Stores a thumbnail in Google Cloud Storage and creates a File entry\n// * @param thumbnailBuffer The thumbnail buffer to store\n// * @param originalFileName The original file name\n// * @param userId The user ID who owns the file\n// * @returns The ID of the created thumbnail File\n// */\n// // DEPRECATED: This function is no longer used - thumbnails are generated during direct uploads\n// // Thumbnail generation is now handled in the direct upload flow "],"names":[],"mappings":";;;AAAA,wCAAwC;AAExC,6BAA6B;AAC7B,wCAAwC;AACxC,sEAAsE;AAEtE,kCAAkC;AAClC,+BAA+B;AAC/B,gCAAgC;AAEhC,8BAA8B;AAC9B,kCAAkC;AAClC,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,oBAAoB;AACpB,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,KAAK;AAEL,2BAA2B;AAC3B,yBAAyB;AACzB,4BAA4B;AAC5B,0FAA0F;AAC1F,kCAAkC;AAClC,oFAAoF;AACpF,uCAAuC;AACvC,4FAA4F;AAC5F,oBAAoB;AACpB,kBAAkB;AAClB,0BAA0B;AAC1B,mBAAmB;AACnB,yBAAyB;AACzB,iBAAiB;AACjB,KAAK;AAEL,wBAAwB;AACxB,mBAAmB;AACnB,oBAAoB;AACpB,mBAAmB;AACnB,wBAAwB;AACxB,KAAK;AAEL,wBAAwB;AACxB,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,mBAAmB;AACnB,KAAK;AAEL,MAAM;AACN,oDAAoD;AACpD,uCAAuC;AACvC,+CAA+C;AAC/C,+BAA+B;AAC/B,MAAM;AACN,wGAAwG;AACxG,4CAA4C;AAC5C,2DAA2D;AAC3D,gBAAgB;AAChB,gDAAgD;AAChD,qEAAqE;AACrE,6CAA6C;AAC7C,iBAAiB;AACjB,2DAA2D;AAC3D,iCAAiC;AACjC,4CAA4C;AAC5C,iBAAiB;AACjB,qCAAqC;AACrC,2BAA2B;AAC3B,4BAA4B;AAC5B,wEAAwE;AACxE,yDAAyD;AACzD,YAAY;AACZ,QAAQ;AAER,4BAA4B;AAC5B,+BAA+B;AAC/B,uDAAuD;AACvD,6BAA6B;AAC7B,wCAAwC;AACxC,aAAa;AACb,iCAAiC;AACjC,uBAAuB;AACvB,IAAI;AAEJ,MAAM;AACN,8DAA8D;AAC9D,+CAA+C;AAC/C,+BAA+B;AAC/B,MAAM;AACN,+EAA+E;AAC/E,4EAA4E;AAC5E,6BAA6B;AAC7B,oBAAoB;AACpB,sCAAsC;AACtC,wCAAwC;AACxC,2BAA2B;AAC3B,+DAA+D;AAC/D,YAAY;AACZ,UAAU;AAEV,kDAAkD;AAClD,0EAA0E;AAE1E,+CAA+C;AAC/C,+EAA+E;AAC/E,mDAAmD;AACnD,0EAA0E;AAC1E,mDAAmD;AACnD,4EAA4E;AAC5E,QAAQ;AAER,oBAAoB;AACpB,wBAAwB;AACxB,8FAA8F;AAC9F,qBAAqB;AACrB,4BAA4B;AAC5B,6BAA6B;AAC7B,8BAA8B;AAC9B,iBAAiB;AACjB,0BAA0B;AAC1B,+BAA+B;AAC/B,cAAc;AACd,iCAAiC;AACjC,uBAAuB;AACvB,IAAI;AAEJ,MAAM;AACN,sCAAsC;AACtC,kEAAkE;AAClE,+CAA+C;AAC/C,oFAAoF;AACpF,MAAM;AACN,wGAAwG;AACxG,YAAY;AACZ,0DAA0D;AAC1D,mDAAmD;AAEnD,8BAA8B;AAC9B,kHAAkH;AAClH,YAAY;AAEZ,2DAA2D;AAE3D,4FAA4F;AAC5F,oBAAoB;AACpB,qGAAqG;AACrG,oCAAoC;AACpC,gCAAgC;AAChC,6DAA6D;AAC7D,gBAAgB;AAChB,+FAA+F;AAC/F,yDAAyD;AACzD,YAAY;AAEZ,gDAAgD;AAChD,wBAAwB;AACxB,uBAAuB;AACvB,QAAQ;AACR,IAAI;AAEJ,MAAM;AACN,yEAAyE;AACzE,0DAA0D;AAC1D,oDAAoD;AACpD,iDAAiD;AACjD,mDAAmD;AACnD,MAAM;AACN,kGAAkG;AAClG,oEAAoE","debug_id":"8a494bec-8974-5f11-ae01-d96a89e7d69b"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,GAAI,GAAG,GAAG;;;;;CAwL1C,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["middleware/auth.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,oBAAoB,GAAI,GAAG,GAAG;;;;;CA+H1C,CAAC"}
@@ -1,38 +1,24 @@
1
- import { TRPCError } from '@trpc/server';
2
- import { prisma } from '../lib/prisma.js';
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]="f1f0bcb4-fc6b-5b13-92c1-e2fedb706ef2")}catch(e){}}();
3
+ import { TRPCError } from "@trpc/server";
4
+ import * as Sentry from "@sentry/node";
5
+ import { findUserBySessionToken, findTeacherClassesByUserId, findClassWithMember, findClassWithTeacher, } from "../models/auth.js";
3
6
  export const createAuthMiddleware = (t) => {
4
- // Auth middleware
5
7
  const isAuthed = t.middleware(async ({ next, ctx }) => {
6
- const startTime = Date.now();
7
- // Get user from request headers
8
- const userHeader = ctx.req.headers['x-user'];
8
+ const userHeader = ctx.req.headers["x-user"];
9
9
  if (!userHeader) {
10
10
  throw new TRPCError({
11
- code: 'UNAUTHORIZED',
12
- message: 'Not authenticated - no token found',
11
+ code: "UNAUTHORIZED",
12
+ message: "Not authenticated - no token found",
13
13
  });
14
14
  }
15
15
  try {
16
- const token = typeof userHeader === 'string' ? userHeader : userHeader[0];
17
- // Find user by session token
18
- const user = await prisma.user.findFirst({
19
- where: {
20
- sessions: {
21
- some: {
22
- id: token
23
- }
24
- }
25
- },
26
- select: {
27
- id: true,
28
- username: true,
29
- // institutionId: true,
30
- }
31
- });
16
+ const token = typeof userHeader === "string" ? userHeader : userHeader[0];
17
+ const user = await findUserBySessionToken(token);
32
18
  if (!user) {
33
19
  throw new TRPCError({
34
- code: 'UNAUTHORIZED',
35
- message: 'Invalid or expired session',
20
+ code: "UNAUTHORIZED",
21
+ message: "Invalid or expired session",
36
22
  });
37
23
  }
38
24
  return next({
@@ -43,115 +29,75 @@ export const createAuthMiddleware = (t) => {
43
29
  });
44
30
  }
45
31
  catch (error) {
46
- console.log(error);
32
+ if (error instanceof TRPCError) {
33
+ throw error;
34
+ }
35
+ Sentry.captureException(error);
36
+ console.error(error);
47
37
  throw new TRPCError({
48
- code: 'UNAUTHORIZED',
49
- message: 'Invalid user data',
38
+ code: "INTERNAL_SERVER_ERROR",
39
+ message: "Internal server error",
50
40
  });
51
41
  }
52
42
  });
53
- // Add computed flags middleware
54
43
  const addComputedFlags = t.middleware(async ({ next, ctx }) => {
55
44
  if (!ctx.user) {
56
45
  throw new TRPCError({
57
- code: 'UNAUTHORIZED',
58
- message: 'Not authenticated',
46
+ code: "UNAUTHORIZED",
47
+ message: "Not authenticated",
59
48
  });
60
49
  }
61
- // Get all classes where user is a teacher
62
- const teacherClasses = await prisma.class.findMany({
63
- where: {
64
- teachers: {
65
- some: {
66
- id: ctx.user.id
67
- }
68
- }
69
- },
70
- select: {
71
- id: true
72
- }
73
- });
50
+ const teacherClasses = await findTeacherClassesByUserId(ctx.user.id);
74
51
  return next({
75
52
  ctx: {
76
53
  ...ctx,
77
54
  isTeacher: teacherClasses.length > 0,
78
- teacherClassIds: teacherClasses.map((c) => c.id)
79
- }
55
+ teacherClassIds: teacherClasses.map((c) => c.id),
56
+ },
80
57
  });
81
58
  });
82
- // Student middleware
83
59
  const isMemberInClass = t.middleware(async ({ next, ctx, input }) => {
84
60
  if (!ctx.user) {
85
61
  throw new TRPCError({
86
- code: 'UNAUTHORIZED',
87
- message: 'Not authenticated',
62
+ code: "UNAUTHORIZED",
63
+ message: "Not authenticated",
88
64
  });
89
65
  }
90
66
  const classId = input?.classId;
91
67
  if (!classId) {
92
68
  throw new TRPCError({
93
- code: 'BAD_REQUEST',
94
- message: 'classId is required',
69
+ code: "BAD_REQUEST",
70
+ message: "classId is required",
95
71
  });
96
72
  }
97
- const isMember = await prisma.class.findFirst({
98
- where: {
99
- id: classId,
100
- OR: [
101
- {
102
- students: {
103
- some: {
104
- id: ctx.user.id
105
- }
106
- }
107
- },
108
- {
109
- teachers: {
110
- some: {
111
- id: ctx.user.id
112
- }
113
- }
114
- }
115
- ]
116
- }
117
- });
73
+ const isMember = await findClassWithMember(classId, ctx.user.id);
118
74
  if (!isMember) {
119
75
  throw new TRPCError({
120
- code: 'FORBIDDEN',
121
- message: 'Not a member in this class',
76
+ code: "FORBIDDEN",
77
+ message: "Not a member in this class",
122
78
  });
123
79
  }
124
80
  return next();
125
81
  });
126
- // Teacher middleware
127
82
  const isTeacherInClass = t.middleware(async ({ next, ctx, input }) => {
128
83
  if (!ctx.user) {
129
84
  throw new TRPCError({
130
- code: 'UNAUTHORIZED',
131
- message: 'Not authenticated',
85
+ code: "UNAUTHORIZED",
86
+ message: "Not authenticated",
132
87
  });
133
88
  }
134
- const classId = input.classId;
89
+ const classId = input?.classId;
135
90
  if (!classId) {
136
91
  throw new TRPCError({
137
- code: 'BAD_REQUEST',
138
- message: 'classId is required',
92
+ code: "BAD_REQUEST",
93
+ message: "classId is required",
139
94
  });
140
95
  }
141
- const isTeacher = await prisma.class.findFirst({
142
- where: {
143
- id: classId,
144
- teachers: {
145
- some: {
146
- id: ctx.user.id
147
- }
148
- }
149
- }
150
- });
96
+ const isTeacher = await findClassWithTeacher(classId, ctx.user.id);
151
97
  if (!isTeacher) {
152
98
  throw new TRPCError({
153
- code: 'FORBIDDEN',
154
- message: 'Not a teacher in this class',
99
+ code: "FORBIDDEN",
100
+ message: "Not a teacher in this class",
155
101
  });
156
102
  }
157
103
  return next();
@@ -163,3 +109,5 @@ export const createAuthMiddleware = (t) => {
163
109
  isTeacherInClass,
164
110
  };
165
111
  };
112
+ //# sourceMappingURL=auth.js.map
113
+ //# debugId=f1f0bcb4-fc6b-5b13-92c1-e2fedb706ef2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sources":["middleware/auth.ts"],"sourceRoot":"/","sourcesContent":["import { TRPCError } from \"@trpc/server\";\nimport * as Sentry from \"@sentry/node\";\nimport type { MiddlewareContext } from \"../types/trpc.js\";\nimport {\n findUserBySessionToken,\n findTeacherClassesByUserId,\n findClassWithMember,\n findClassWithTeacher,\n} from \"../models/auth.js\";\n\nexport const createAuthMiddleware = (t: any) => {\n const isAuthed = t.middleware(async ({ next, ctx }: MiddlewareContext) => {\n const userHeader = ctx.req.headers[\"x-user\"];\n\n if (!userHeader) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated - no token found\",\n });\n }\n\n try {\n const token =\n typeof userHeader === \"string\" ? userHeader : userHeader[0];\n const user = await findUserBySessionToken(token);\n\n if (!user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Invalid or expired session\",\n });\n }\n\n return next({\n ctx: {\n ...ctx,\n user,\n },\n });\n } catch (error) {\n if (error instanceof TRPCError) {\n throw error;\n }\n Sentry.captureException(error);\n console.error(error);\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Internal server error\",\n });\n }\n });\n\n const addComputedFlags = t.middleware(\n async ({ next, ctx }: MiddlewareContext) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n\n const teacherClasses = await findTeacherClassesByUserId(ctx.user.id);\n\n return next({\n ctx: {\n ...ctx,\n isTeacher: teacherClasses.length > 0,\n teacherClassIds: teacherClasses.map((c) => c.id),\n },\n });\n }\n );\n\n const isMemberInClass = t.middleware(\n async ({ next, ctx, input }: MiddlewareContext) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n\n const classId = (input as { classId: string })?.classId;\n if (!classId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"classId is required\",\n });\n }\n\n const isMember = await findClassWithMember(classId, ctx.user.id);\n if (!isMember) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Not a member in this class\",\n });\n }\n\n return next();\n }\n );\n\n const isTeacherInClass = t.middleware(\n async ({ next, ctx, input }: MiddlewareContext) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n\n const classId = (input as { classId: string })?.classId;\n if (!classId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"classId is required\",\n });\n }\n\n const isTeacher = await findClassWithTeacher(classId, ctx.user.id);\n if (!isTeacher) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Not a teacher in this class\",\n });\n }\n\n return next();\n }\n );\n\n return {\n isAuthed,\n addComputedFlags,\n isMemberInClass,\n isTeacherInClass,\n };\n};\n"],"names":[],"mappings":"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","debug_id":"f1f0bcb4-fc6b-5b13-92c1-e2fedb706ef2"}
@@ -1 +1 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/middleware/logging.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,GAAI,GAAG,GAAG,QAkD7C,CAAC"}
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"/","sources":["middleware/logging.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,GAAI,GAAG,GAAG,QAkD7C,CAAC"}
@@ -1,3 +1,5 @@
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]="9445f0d5-551e-54a6-b55a-ac982cb659d3")}catch(e){}}();
1
3
  import { logger } from '../utils/logger.js';
2
4
  export const createLoggingMiddleware = (t) => {
3
5
  return t.middleware(async ({ path, type, next, ctx }) => {
@@ -45,3 +47,5 @@ export const createLoggingMiddleware = (t) => {
45
47
  }
46
48
  });
47
49
  };
50
+ //# sourceMappingURL=logging.js.map
51
+ //# debugId=9445f0d5-551e-54a6-b55a-ac982cb659d3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sources":["middleware/logging.ts"],"sourceRoot":"/","sourcesContent":["import type { MiddlewareContext } from '../types/trpc.js';\nimport { logger } from '../utils/logger.js';\n\nexport const createLoggingMiddleware = (t: any) => {\n return t.middleware(async ({ path, type, next, ctx }: MiddlewareContext) => {\n const start = Date.now();\n const requestId = crypto.randomUUID();\n\n // Log request\n logger.info('tRPC Request', {\n requestId,\n path,\n type,\n // input,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const result = await next();\n const durationMs = Date.now() - start;\n\n // Log successful response\n logger.info('tRPC Response', {\n requestId,\n path,\n type,\n durationMs,\n ok: result.ok,\n timestamp: new Date().toISOString(),\n });\n\n return result;\n } catch (error) {\n const durationMs = Date.now() - start;\n\n // Log error response\n logger.error('tRPC Error' + path, {\n requestId,\n path,\n type,\n durationMs,\n error: error instanceof Error ? {\n path,\n name: error.name,\n message: error.message,\n stack: error.stack,\n } : error,\n timestamp: new Date().toISOString(),\n });\n\n throw error;\n }\n });\n}; "],"names":[],"mappings":";;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAM,EAAE,EAAE;IAChD,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAqB,EAAE,EAAE;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEtC,cAAc;QACd,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC1B,SAAS;YACT,IAAI;YACJ,IAAI;YACJ,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAEtC,0BAA0B;YAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;gBAC3B,SAAS;gBACT,IAAI;gBACJ,IAAI;gBACJ,UAAU;gBACV,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAEtC,qBAAqB;YACrB,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,EAAE;gBAChC,SAAS;gBACT,IAAI;gBACJ,IAAI;gBACJ,UAAU;gBACV,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC;oBAC9B,IAAI;oBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB,CAAC,CAAC,CAAC,KAAK;gBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","debug_id":"9445f0d5-551e-54a6-b55a-ac982cb659d3"}
@@ -0,0 +1,5 @@
1
+ export declare const generalLimiter: import("express-rate-limit").RateLimitRequestHandler;
2
+ export declare const authLimiter: import("express-rate-limit").RateLimitRequestHandler;
3
+ export declare const uploadLimiter: import("express-rate-limit").RateLimitRequestHandler;
4
+ export declare const helmetConfig: (req: import("http").IncomingMessage, res: import("http").ServerResponse, next: (err?: unknown) => void) => void;
5
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"/","sources":["middleware/security.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,cAAc,sDAWzB,CAAC;AAGH,eAAO,MAAM,WAAW,sDAQtB,CAAC;AAGH,eAAO,MAAM,aAAa,sDAOxB,CAAC;AAGH,eAAO,MAAM,YAAY,sFAwB2mF,CAAC,2BAAnoF,CAAC"}