@studious-lms/server 1.27.0 → 1.28.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 (106) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +31 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/instrument.js +9 -4
  5. package/dist/instrument.js.map +1 -1
  6. package/dist/lib/fileUpload.d.ts +15 -0
  7. package/dist/lib/fileUpload.d.ts.map +1 -1
  8. package/dist/lib/fileUpload.js +43 -2
  9. package/dist/lib/fileUpload.js.map +1 -1
  10. package/dist/pipelines/aiLabChatContract.d.ts +2 -2
  11. package/dist/pipelines/generateVisualization.d.ts +33 -0
  12. package/dist/pipelines/generateVisualization.d.ts.map +1 -0
  13. package/dist/pipelines/generateVisualization.js +79 -0
  14. package/dist/pipelines/generateVisualization.js.map +1 -0
  15. package/dist/routers/_app.d.ts +891 -53
  16. package/dist/routers/_app.d.ts.map +1 -1
  17. package/dist/routers/_app.js +4 -2
  18. package/dist/routers/_app.js.map +1 -1
  19. package/dist/routers/admin.d.ts +297 -0
  20. package/dist/routers/admin.d.ts.map +1 -1
  21. package/dist/routers/admin.js +43 -2
  22. package/dist/routers/admin.js.map +1 -1
  23. package/dist/routers/class.d.ts.map +1 -1
  24. package/dist/routers/class.js +16 -3
  25. package/dist/routers/class.js.map +1 -1
  26. package/dist/routers/module.d.ts +1 -1
  27. package/dist/routers/visualization.d.ts +124 -0
  28. package/dist/routers/visualization.d.ts.map +1 -0
  29. package/dist/routers/visualization.js +41 -0
  30. package/dist/routers/visualization.js.map +1 -0
  31. package/dist/services/adminClass.d.ts +153 -0
  32. package/dist/services/adminClass.d.ts.map +1 -0
  33. package/dist/services/adminClass.js +196 -0
  34. package/dist/services/adminClass.js.map +1 -0
  35. package/dist/services/adminInstitution.d.ts +2 -0
  36. package/dist/services/adminInstitution.d.ts.map +1 -1
  37. package/dist/services/adminInstitution.js +11 -4
  38. package/dist/services/adminInstitution.js.map +1 -1
  39. package/dist/services/adminMetrics.d.ts +8 -0
  40. package/dist/services/adminMetrics.d.ts.map +1 -1
  41. package/dist/services/adminMetrics.js +30 -3
  42. package/dist/services/adminMetrics.js.map +1 -1
  43. package/dist/services/adminSpam.d.ts +76 -0
  44. package/dist/services/adminSpam.d.ts.map +1 -0
  45. package/dist/services/adminSpam.js +163 -0
  46. package/dist/services/adminSpam.js.map +1 -0
  47. package/dist/services/adminSql.d.ts +36 -0
  48. package/dist/services/adminSql.d.ts.map +1 -0
  49. package/dist/services/adminSql.js +172 -0
  50. package/dist/services/adminSql.js.map +1 -0
  51. package/dist/services/adminTelemetry.d.ts +56 -0
  52. package/dist/services/adminTelemetry.d.ts.map +1 -0
  53. package/dist/services/adminTelemetry.js +147 -0
  54. package/dist/services/adminTelemetry.js.map +1 -0
  55. package/dist/services/adminUser.d.ts +45 -0
  56. package/dist/services/adminUser.d.ts.map +1 -1
  57. package/dist/services/adminUser.js +48 -11
  58. package/dist/services/adminUser.js.map +1 -1
  59. package/dist/services/auth.d.ts.map +1 -1
  60. package/dist/services/auth.js +10 -4
  61. package/dist/services/auth.js.map +1 -1
  62. package/dist/services/fees.d.ts.map +1 -1
  63. package/dist/services/fees.js +7 -3
  64. package/dist/services/fees.js.map +1 -1
  65. package/dist/services/module.d.ts.map +1 -1
  66. package/dist/services/module.js +23 -4
  67. package/dist/services/module.js.map +1 -1
  68. package/dist/services/visualization.d.ts +72 -0
  69. package/dist/services/visualization.d.ts.map +1 -0
  70. package/dist/services/visualization.js +122 -0
  71. package/dist/services/visualization.js.map +1 -0
  72. package/dist/utils/sentryTrpc.d.ts +3 -0
  73. package/dist/utils/sentryTrpc.d.ts.map +1 -0
  74. package/dist/utils/sentryTrpc.js +26 -0
  75. package/dist/utils/sentryTrpc.js.map +1 -0
  76. package/package.json +1 -1
  77. package/prisma/migrations/20261025120000_add_visualizations/migration.sql +27 -0
  78. package/prisma/schema.prisma +24 -0
  79. package/src/index.ts +30 -4
  80. package/src/instrument.ts +8 -2
  81. package/src/lib/fileUpload.ts +49 -0
  82. package/src/pipelines/generateVisualization.ts +107 -0
  83. package/src/routers/_app.ts +2 -0
  84. package/src/routers/admin.ts +72 -0
  85. package/src/routers/class.ts +14 -1
  86. package/src/routers/visualization.ts +60 -0
  87. package/src/services/adminClass.ts +222 -0
  88. package/src/services/adminInstitution.ts +9 -2
  89. package/src/services/adminMetrics.ts +35 -0
  90. package/src/services/adminSpam.ts +224 -0
  91. package/src/services/adminSql.ts +214 -0
  92. package/src/services/adminTelemetry.ts +194 -0
  93. package/src/services/adminUser.ts +61 -9
  94. package/src/services/auth.ts +8 -2
  95. package/src/services/fees.ts +5 -1
  96. package/src/services/module.ts +29 -2
  97. package/src/services/visualization.ts +147 -0
  98. package/src/utils/sentryTrpc.ts +25 -0
  99. package/tests/unit/lib/fileUploadSession.test.ts +67 -0
  100. package/tests/unit/services/adminClass.test.ts +102 -0
  101. package/tests/unit/services/adminSpam.test.ts +108 -0
  102. package/tests/unit/services/adminSql.test.ts +56 -0
  103. package/tests/unit/services/adminTelemetry.test.ts +47 -0
  104. package/tests/unit/services/adminUser.test.ts +2 -0
  105. package/tests/unit/services/visualization.test.ts +130 -0
  106. package/tests/unit/utils/sentryTrpc.test.ts +15 -0
@@ -9956,6 +9956,14 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
9956
9956
  schools: number;
9957
9957
  users: number;
9958
9958
  verifiedUsers: number;
9959
+ suspectedUsers: number;
9960
+ cleanUsers: number;
9961
+ signupsLast24h: number;
9962
+ signupsLast7d: number;
9963
+ activeUsersLast24h: number;
9964
+ activeUsersLast7d: number;
9965
+ activeClassesLast7d: number;
9966
+ submissionsLast24h: number;
9959
9967
  classes: number;
9960
9968
  departments: number;
9961
9969
  runJobs: {
@@ -10164,6 +10172,7 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10164
10172
  };
10165
10173
  output: {
10166
10174
  items: {
10175
+ signals: import("../services/adminSpam.js").SpamSignals;
10167
10176
  type: string;
10168
10177
  status: string;
10169
10178
  id: string;
@@ -10198,6 +10207,7 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10198
10207
  };
10199
10208
  output: {
10200
10209
  items: {
10210
+ signals: import("../services/adminSpam.js").SpamSignals;
10201
10211
  id: string;
10202
10212
  createdAt: Date;
10203
10213
  email: string;
@@ -10212,12 +10222,19 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10212
10222
  }>;
10213
10223
  searchUsers: import("@trpc/server").TRPCQueryProcedure<{
10214
10224
  input: {
10225
+ sort?: "username" | "recent" | "activity" | undefined;
10215
10226
  query?: string | undefined;
10227
+ verified?: boolean | undefined;
10228
+ schoolId?: string | undefined;
10216
10229
  page?: number | undefined;
10230
+ activity?: "active" | "all" | "inactive" | undefined;
10217
10231
  pageSize?: number | undefined;
10232
+ emailDomain?: string | undefined;
10233
+ spam?: "all" | "suspected" | "clean" | undefined;
10218
10234
  };
10219
10235
  output: {
10220
10236
  items: {
10237
+ signals: import("../services/adminSpam.js").SpamSignals;
10221
10238
  school: {
10222
10239
  id: string;
10223
10240
  name: string;
@@ -10226,9 +10243,13 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10226
10243
  username: string;
10227
10244
  email: string;
10228
10245
  verified: boolean;
10246
+ profile: {
10247
+ createdAt: Date;
10248
+ } | null;
10229
10249
  _count: {
10230
10250
  teacherIn: number;
10231
10251
  studentIn: number;
10252
+ submissions: number;
10232
10253
  sessions: number;
10233
10254
  };
10234
10255
  }[];
@@ -10244,6 +10265,37 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10244
10265
  id: string;
10245
10266
  };
10246
10267
  output: {
10268
+ classes: {
10269
+ teaching: {
10270
+ school: {
10271
+ id: string;
10272
+ name: string;
10273
+ } | null;
10274
+ section: string;
10275
+ id: string;
10276
+ name: string;
10277
+ _count: {
10278
+ students: number;
10279
+ assignments: number;
10280
+ };
10281
+ subject: string;
10282
+ }[];
10283
+ enrolled: {
10284
+ school: {
10285
+ id: string;
10286
+ name: string;
10287
+ } | null;
10288
+ section: string;
10289
+ id: string;
10290
+ name: string;
10291
+ _count: {
10292
+ students: number;
10293
+ assignments: number;
10294
+ };
10295
+ subject: string;
10296
+ }[];
10297
+ };
10298
+ signals: import("../services/adminSpam.js").SpamSignals;
10247
10299
  school: {
10248
10300
  id: string;
10249
10301
  name: string;
@@ -10285,6 +10337,251 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10285
10337
  };
10286
10338
  meta: object;
10287
10339
  }>;
10340
+ listClasses: import("@trpc/server").TRPCQueryProcedure<{
10341
+ input: {
10342
+ sort?: "name" | "students" | "assignments" | undefined;
10343
+ query?: string | undefined;
10344
+ schoolId?: string | undefined;
10345
+ page?: number | undefined;
10346
+ pageSize?: number | undefined;
10347
+ membership?: "all" | "populated" | "empty" | undefined;
10348
+ };
10349
+ output: {
10350
+ items: {
10351
+ lastAssignmentAt: Date | null;
10352
+ school: {
10353
+ id: string;
10354
+ name: string;
10355
+ } | null;
10356
+ department: {
10357
+ id: string;
10358
+ name: string;
10359
+ } | null;
10360
+ section: string;
10361
+ id: string;
10362
+ name: string;
10363
+ teachers: {
10364
+ id: string;
10365
+ username: string;
10366
+ }[];
10367
+ _count: {
10368
+ teachers: number;
10369
+ students: number;
10370
+ assignments: number;
10371
+ events: number;
10372
+ announcements: number;
10373
+ discussions: number;
10374
+ worksheets: number;
10375
+ modules: number;
10376
+ };
10377
+ subject: string;
10378
+ }[];
10379
+ total: number;
10380
+ page: number;
10381
+ pageSize: number;
10382
+ pageCount: number;
10383
+ };
10384
+ meta: object;
10385
+ }>;
10386
+ getClass: import("@trpc/server").TRPCQueryProcedure<{
10387
+ input: {
10388
+ id: string;
10389
+ };
10390
+ output: {
10391
+ teachers: {
10392
+ signals: import("../services/adminSpam.js").SpamSignals;
10393
+ submissionsInClass: number;
10394
+ id: string;
10395
+ username: string;
10396
+ email: string;
10397
+ verified: boolean;
10398
+ _count: {
10399
+ teacherIn: number;
10400
+ studentIn: number;
10401
+ submissions: number;
10402
+ };
10403
+ }[];
10404
+ students: {
10405
+ signals: import("../services/adminSpam.js").SpamSignals;
10406
+ submissionsInClass: number;
10407
+ id: string;
10408
+ username: string;
10409
+ email: string;
10410
+ verified: boolean;
10411
+ _count: {
10412
+ teacherIn: number;
10413
+ studentIn: number;
10414
+ submissions: number;
10415
+ };
10416
+ }[];
10417
+ announcements: {
10418
+ remarks: string;
10419
+ id: string;
10420
+ createdAt: Date;
10421
+ teacher: {
10422
+ id: string;
10423
+ username: string;
10424
+ };
10425
+ }[];
10426
+ suspectedMembers: number;
10427
+ school: {
10428
+ id: string;
10429
+ name: string;
10430
+ } | null;
10431
+ department: {
10432
+ id: string;
10433
+ name: string;
10434
+ } | null;
10435
+ section: string;
10436
+ id: string;
10437
+ name: string;
10438
+ assignments: {
10439
+ type: import(".prisma/client").$Enums.AssignmentType;
10440
+ id: string;
10441
+ createdAt: Date | null;
10442
+ _count: {
10443
+ submissions: number;
10444
+ };
10445
+ title: string;
10446
+ dueDate: Date;
10447
+ graded: boolean;
10448
+ teacher: {
10449
+ id: string;
10450
+ username: string;
10451
+ };
10452
+ }[];
10453
+ _count: {
10454
+ teachers: number;
10455
+ students: number;
10456
+ assignments: number;
10457
+ events: number;
10458
+ announcements: number;
10459
+ discussions: number;
10460
+ sections: number;
10461
+ worksheets: number;
10462
+ modules: number;
10463
+ };
10464
+ color: string | null;
10465
+ subject: string;
10466
+ };
10467
+ meta: object;
10468
+ }>;
10469
+ getContentTelemetry: import("@trpc/server").TRPCQueryProcedure<{
10470
+ input: void;
10471
+ output: {
10472
+ content: {
10473
+ assignments: number;
10474
+ assignmentsLast7d: number;
10475
+ submissions: number;
10476
+ submissionsLast7d: number;
10477
+ gradedSubmissions: number;
10478
+ announcements: number;
10479
+ announcementsLast7d: number;
10480
+ discussions: number;
10481
+ messages: number;
10482
+ messagesLast7d: number;
10483
+ worksheets: number;
10484
+ events: number;
10485
+ modules: number;
10486
+ files: number;
10487
+ storageBytes: number;
10488
+ };
10489
+ ai: {
10490
+ calls7d: number;
10491
+ failures7d: number;
10492
+ tokens7d: number;
10493
+ byModel: {
10494
+ model: string;
10495
+ calls: number;
10496
+ tokens: number;
10497
+ }[];
10498
+ };
10499
+ jobs: {
10500
+ failedLast24h: number;
10501
+ byType: {
10502
+ total: number;
10503
+ failed: number;
10504
+ type: string;
10505
+ }[];
10506
+ };
10507
+ };
10508
+ meta: object;
10509
+ }>;
10510
+ getActivitySeries: import("@trpc/server").TRPCQueryProcedure<{
10511
+ input: {
10512
+ days?: number | undefined;
10513
+ };
10514
+ output: {
10515
+ points: import("../services/adminTelemetry.js").DailyPoint[];
10516
+ };
10517
+ meta: object;
10518
+ }>;
10519
+ listSqlSchema: import("@trpc/server").TRPCQueryProcedure<{
10520
+ input: void;
10521
+ output: {
10522
+ tables: import("../services/adminSql.js").AdminSqlTable[];
10523
+ };
10524
+ meta: object;
10525
+ }>;
10526
+ runSql: import("@trpc/server").TRPCMutationProcedure<{
10527
+ input: {
10528
+ sql: string;
10529
+ limit?: number | undefined;
10530
+ };
10531
+ output: import("../services/adminSql.js").AdminSqlResult;
10532
+ meta: object;
10533
+ }>;
10534
+ getSpamOverview: import("@trpc/server").TRPCQueryProcedure<{
10535
+ input: void;
10536
+ output: {
10537
+ rules: {
10538
+ blockedDomains: string[];
10539
+ botPatterns: string[];
10540
+ disposableDomains: string[];
10541
+ };
10542
+ totalUsers: number;
10543
+ suspectedUsers: number;
10544
+ suspectedVerified: number;
10545
+ cleanUsers: number;
10546
+ domains: {
10547
+ domain: string;
10548
+ total: number;
10549
+ verified: number;
10550
+ suspected: boolean;
10551
+ }[];
10552
+ recent: {
10553
+ signals: import("../services/adminSpam.js").SpamSignals;
10554
+ id: string;
10555
+ username: string;
10556
+ email: string;
10557
+ verified: boolean;
10558
+ profile: {
10559
+ createdAt: Date;
10560
+ } | null;
10561
+ _count: {
10562
+ teacherIn: number;
10563
+ studentIn: number;
10564
+ submissions: number;
10565
+ };
10566
+ }[];
10567
+ };
10568
+ meta: object;
10569
+ }>;
10570
+ listUserEmailDomains: import("@trpc/server").TRPCQueryProcedure<{
10571
+ input: {
10572
+ limit?: number | undefined;
10573
+ suspectedOnly?: boolean | undefined;
10574
+ };
10575
+ output: {
10576
+ items: {
10577
+ domain: string;
10578
+ total: number;
10579
+ verified: number;
10580
+ suspected: boolean;
10581
+ }[];
10582
+ };
10583
+ meta: object;
10584
+ }>;
10288
10585
  }>>;
10289
10586
  embedding: import("@trpc/server").TRPCBuiltRouter<{
10290
10587
  ctx: import("../trpc.js").Context;
@@ -10568,7 +10865,7 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
10568
10865
  [x: string]: unknown;
10569
10866
  classId: string;
10570
10867
  moduleId: string;
10571
- itemType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "DISCUSSION" | "EXTERNAL_URL" | "SUB_HEADER";
10868
+ itemType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "DISCUSSION" | "EXTERNAL_URL" | "SUB_HEADER" | "VISUALIZATION";
10572
10869
  title?: string | undefined;
10573
10870
  indent?: number | undefined;
10574
10871
  itemId?: string | undefined;
@@ -12565,28 +12862,7 @@ export declare const appRouter: import("@trpc/server").TRPCBuiltRouter<{
12565
12862
  meta: object;
12566
12863
  }>;
12567
12864
  }>>;
12568
- }>>;
12569
- export type AppRouter = typeof appRouter;
12570
- export type RouterInputs = inferRouterInputs<AppRouter>;
12571
- export type RouterOutputs = inferRouterOutputs<AppRouter>;
12572
- export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
12573
- ctx: import("../trpc.js").Context;
12574
- meta: object;
12575
- errorShape: {
12576
- data: {
12577
- zodError: import("zod").typeToFlattenedError<any, string> | null;
12578
- prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
12579
- code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
12580
- httpStatus: number;
12581
- path?: string;
12582
- stack?: string;
12583
- };
12584
- message: string;
12585
- code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
12586
- };
12587
- transformer: false;
12588
- }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
12589
- class: import("@trpc/server").TRPCBuiltRouter<{
12865
+ visualization: import("@trpc/server").TRPCBuiltRouter<{
12590
12866
  ctx: import("../trpc.js").Context;
12591
12867
  meta: object;
12592
12868
  errorShape: {
@@ -12603,36 +12879,179 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
12603
12879
  };
12604
12880
  transformer: false;
12605
12881
  }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
12606
- getAll: import("@trpc/server").TRPCQueryProcedure<{
12607
- input: void;
12882
+ list: import("@trpc/server").TRPCQueryProcedure<{
12883
+ input: {
12884
+ [x: string]: unknown;
12885
+ classId: string;
12886
+ };
12608
12887
  output: {
12609
- teacherInClass: {
12610
- id: string;
12611
- name: string;
12612
- section: string;
12613
- subject: string;
12614
- dueToday: {
12615
- type: import(".prisma/client").$Enums.AssignmentType;
12616
- id: string;
12617
- submissions: {
12618
- studentId: string;
12619
- submitted: boolean | null;
12620
- returned: boolean | null;
12621
- }[];
12622
- title: string;
12623
- dueDate: Date;
12624
- }[];
12625
- assignments: {
12626
- type: import(".prisma/client").$Enums.AssignmentType;
12627
- id: string;
12628
- submissions: {
12629
- studentId: string;
12630
- submitted: boolean | null;
12631
- returned: boolean | null;
12632
- }[];
12633
- title: string;
12634
- dueDate: Date;
12635
- }[];
12888
+ id: string;
12889
+ createdAt: Date;
12890
+ updatedAt: Date;
12891
+ classId: string;
12892
+ title: string;
12893
+ prompt: string | null;
12894
+ published: boolean;
12895
+ }[];
12896
+ meta: object;
12897
+ }>;
12898
+ get: import("@trpc/server").TRPCQueryProcedure<{
12899
+ input: {
12900
+ [x: string]: unknown;
12901
+ classId: string;
12902
+ id: string;
12903
+ };
12904
+ output: {
12905
+ id: string;
12906
+ createdAt: Date;
12907
+ updatedAt: Date;
12908
+ classId: string;
12909
+ title: string;
12910
+ prompt: string | null;
12911
+ published: boolean;
12912
+ html: string;
12913
+ };
12914
+ meta: object;
12915
+ }>;
12916
+ generate: import("@trpc/server").TRPCMutationProcedure<{
12917
+ input: {
12918
+ [x: string]: unknown;
12919
+ classId: string;
12920
+ prompt: string;
12921
+ title?: string | undefined;
12922
+ };
12923
+ output: {
12924
+ id: string;
12925
+ createdAt: Date;
12926
+ updatedAt: Date;
12927
+ classId: string;
12928
+ title: string;
12929
+ prompt: string | null;
12930
+ published: boolean;
12931
+ html: string;
12932
+ };
12933
+ meta: object;
12934
+ }>;
12935
+ revise: import("@trpc/server").TRPCMutationProcedure<{
12936
+ input: {
12937
+ [x: string]: unknown;
12938
+ classId: string;
12939
+ id: string;
12940
+ instruction: string;
12941
+ };
12942
+ output: {
12943
+ id: string;
12944
+ createdAt: Date;
12945
+ updatedAt: Date;
12946
+ classId: string;
12947
+ title: string;
12948
+ prompt: string | null;
12949
+ published: boolean;
12950
+ html: string;
12951
+ };
12952
+ meta: object;
12953
+ }>;
12954
+ update: import("@trpc/server").TRPCMutationProcedure<{
12955
+ input: {
12956
+ [x: string]: unknown;
12957
+ classId: string;
12958
+ id: string;
12959
+ title?: string | undefined;
12960
+ published?: boolean | undefined;
12961
+ html?: string | undefined;
12962
+ };
12963
+ output: {
12964
+ id: string;
12965
+ createdAt: Date;
12966
+ updatedAt: Date;
12967
+ classId: string;
12968
+ title: string;
12969
+ prompt: string | null;
12970
+ published: boolean;
12971
+ html: string;
12972
+ };
12973
+ meta: object;
12974
+ }>;
12975
+ delete: import("@trpc/server").TRPCMutationProcedure<{
12976
+ input: {
12977
+ [x: string]: unknown;
12978
+ classId: string;
12979
+ id: string;
12980
+ };
12981
+ output: {
12982
+ id: string;
12983
+ };
12984
+ meta: object;
12985
+ }>;
12986
+ }>>;
12987
+ }>>;
12988
+ export type AppRouter = typeof appRouter;
12989
+ export type RouterInputs = inferRouterInputs<AppRouter>;
12990
+ export type RouterOutputs = inferRouterOutputs<AppRouter>;
12991
+ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
12992
+ ctx: import("../trpc.js").Context;
12993
+ meta: object;
12994
+ errorShape: {
12995
+ data: {
12996
+ zodError: import("zod").typeToFlattenedError<any, string> | null;
12997
+ prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
12998
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
12999
+ httpStatus: number;
13000
+ path?: string;
13001
+ stack?: string;
13002
+ };
13003
+ message: string;
13004
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
13005
+ };
13006
+ transformer: false;
13007
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
13008
+ class: import("@trpc/server").TRPCBuiltRouter<{
13009
+ ctx: import("../trpc.js").Context;
13010
+ meta: object;
13011
+ errorShape: {
13012
+ data: {
13013
+ zodError: import("zod").typeToFlattenedError<any, string> | null;
13014
+ prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
13015
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
13016
+ httpStatus: number;
13017
+ path?: string;
13018
+ stack?: string;
13019
+ };
13020
+ message: string;
13021
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
13022
+ };
13023
+ transformer: false;
13024
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
13025
+ getAll: import("@trpc/server").TRPCQueryProcedure<{
13026
+ input: void;
13027
+ output: {
13028
+ teacherInClass: {
13029
+ id: string;
13030
+ name: string;
13031
+ section: string;
13032
+ subject: string;
13033
+ dueToday: {
13034
+ type: import(".prisma/client").$Enums.AssignmentType;
13035
+ id: string;
13036
+ submissions: {
13037
+ studentId: string;
13038
+ submitted: boolean | null;
13039
+ returned: boolean | null;
13040
+ }[];
13041
+ title: string;
13042
+ dueDate: Date;
13043
+ }[];
13044
+ assignments: {
13045
+ type: import(".prisma/client").$Enums.AssignmentType;
13046
+ id: string;
13047
+ submissions: {
13048
+ studentId: string;
13049
+ submitted: boolean | null;
13050
+ returned: boolean | null;
13051
+ }[];
13052
+ title: string;
13053
+ dueDate: Date;
13054
+ }[];
12636
13055
  members: {
12637
13056
  id: string;
12638
13057
  username: string;
@@ -22526,6 +22945,14 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22526
22945
  schools: number;
22527
22946
  users: number;
22528
22947
  verifiedUsers: number;
22948
+ suspectedUsers: number;
22949
+ cleanUsers: number;
22950
+ signupsLast24h: number;
22951
+ signupsLast7d: number;
22952
+ activeUsersLast24h: number;
22953
+ activeUsersLast7d: number;
22954
+ activeClassesLast7d: number;
22955
+ submissionsLast24h: number;
22529
22956
  classes: number;
22530
22957
  departments: number;
22531
22958
  runJobs: {
@@ -22734,6 +23161,7 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22734
23161
  };
22735
23162
  output: {
22736
23163
  items: {
23164
+ signals: import("../services/adminSpam.js").SpamSignals;
22737
23165
  type: string;
22738
23166
  status: string;
22739
23167
  id: string;
@@ -22768,6 +23196,7 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22768
23196
  };
22769
23197
  output: {
22770
23198
  items: {
23199
+ signals: import("../services/adminSpam.js").SpamSignals;
22771
23200
  id: string;
22772
23201
  createdAt: Date;
22773
23202
  email: string;
@@ -22782,12 +23211,19 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22782
23211
  }>;
22783
23212
  searchUsers: import("@trpc/server").TRPCQueryProcedure<{
22784
23213
  input: {
23214
+ sort?: "username" | "recent" | "activity" | undefined;
22785
23215
  query?: string | undefined;
23216
+ verified?: boolean | undefined;
23217
+ schoolId?: string | undefined;
22786
23218
  page?: number | undefined;
23219
+ activity?: "active" | "all" | "inactive" | undefined;
22787
23220
  pageSize?: number | undefined;
23221
+ emailDomain?: string | undefined;
23222
+ spam?: "all" | "suspected" | "clean" | undefined;
22788
23223
  };
22789
23224
  output: {
22790
23225
  items: {
23226
+ signals: import("../services/adminSpam.js").SpamSignals;
22791
23227
  school: {
22792
23228
  id: string;
22793
23229
  name: string;
@@ -22796,9 +23232,13 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22796
23232
  username: string;
22797
23233
  email: string;
22798
23234
  verified: boolean;
23235
+ profile: {
23236
+ createdAt: Date;
23237
+ } | null;
22799
23238
  _count: {
22800
23239
  teacherIn: number;
22801
23240
  studentIn: number;
23241
+ submissions: number;
22802
23242
  sessions: number;
22803
23243
  };
22804
23244
  }[];
@@ -22814,6 +23254,37 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22814
23254
  id: string;
22815
23255
  };
22816
23256
  output: {
23257
+ classes: {
23258
+ teaching: {
23259
+ school: {
23260
+ id: string;
23261
+ name: string;
23262
+ } | null;
23263
+ section: string;
23264
+ id: string;
23265
+ name: string;
23266
+ _count: {
23267
+ students: number;
23268
+ assignments: number;
23269
+ };
23270
+ subject: string;
23271
+ }[];
23272
+ enrolled: {
23273
+ school: {
23274
+ id: string;
23275
+ name: string;
23276
+ } | null;
23277
+ section: string;
23278
+ id: string;
23279
+ name: string;
23280
+ _count: {
23281
+ students: number;
23282
+ assignments: number;
23283
+ };
23284
+ subject: string;
23285
+ }[];
23286
+ };
23287
+ signals: import("../services/adminSpam.js").SpamSignals;
22817
23288
  school: {
22818
23289
  id: string;
22819
23290
  name: string;
@@ -22855,6 +23326,251 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
22855
23326
  };
22856
23327
  meta: object;
22857
23328
  }>;
23329
+ listClasses: import("@trpc/server").TRPCQueryProcedure<{
23330
+ input: {
23331
+ sort?: "name" | "students" | "assignments" | undefined;
23332
+ query?: string | undefined;
23333
+ schoolId?: string | undefined;
23334
+ page?: number | undefined;
23335
+ pageSize?: number | undefined;
23336
+ membership?: "all" | "populated" | "empty" | undefined;
23337
+ };
23338
+ output: {
23339
+ items: {
23340
+ lastAssignmentAt: Date | null;
23341
+ school: {
23342
+ id: string;
23343
+ name: string;
23344
+ } | null;
23345
+ department: {
23346
+ id: string;
23347
+ name: string;
23348
+ } | null;
23349
+ section: string;
23350
+ id: string;
23351
+ name: string;
23352
+ teachers: {
23353
+ id: string;
23354
+ username: string;
23355
+ }[];
23356
+ _count: {
23357
+ teachers: number;
23358
+ students: number;
23359
+ assignments: number;
23360
+ events: number;
23361
+ announcements: number;
23362
+ discussions: number;
23363
+ worksheets: number;
23364
+ modules: number;
23365
+ };
23366
+ subject: string;
23367
+ }[];
23368
+ total: number;
23369
+ page: number;
23370
+ pageSize: number;
23371
+ pageCount: number;
23372
+ };
23373
+ meta: object;
23374
+ }>;
23375
+ getClass: import("@trpc/server").TRPCQueryProcedure<{
23376
+ input: {
23377
+ id: string;
23378
+ };
23379
+ output: {
23380
+ teachers: {
23381
+ signals: import("../services/adminSpam.js").SpamSignals;
23382
+ submissionsInClass: number;
23383
+ id: string;
23384
+ username: string;
23385
+ email: string;
23386
+ verified: boolean;
23387
+ _count: {
23388
+ teacherIn: number;
23389
+ studentIn: number;
23390
+ submissions: number;
23391
+ };
23392
+ }[];
23393
+ students: {
23394
+ signals: import("../services/adminSpam.js").SpamSignals;
23395
+ submissionsInClass: number;
23396
+ id: string;
23397
+ username: string;
23398
+ email: string;
23399
+ verified: boolean;
23400
+ _count: {
23401
+ teacherIn: number;
23402
+ studentIn: number;
23403
+ submissions: number;
23404
+ };
23405
+ }[];
23406
+ announcements: {
23407
+ remarks: string;
23408
+ id: string;
23409
+ createdAt: Date;
23410
+ teacher: {
23411
+ id: string;
23412
+ username: string;
23413
+ };
23414
+ }[];
23415
+ suspectedMembers: number;
23416
+ school: {
23417
+ id: string;
23418
+ name: string;
23419
+ } | null;
23420
+ department: {
23421
+ id: string;
23422
+ name: string;
23423
+ } | null;
23424
+ section: string;
23425
+ id: string;
23426
+ name: string;
23427
+ assignments: {
23428
+ type: import(".prisma/client").$Enums.AssignmentType;
23429
+ id: string;
23430
+ createdAt: Date | null;
23431
+ _count: {
23432
+ submissions: number;
23433
+ };
23434
+ title: string;
23435
+ dueDate: Date;
23436
+ graded: boolean;
23437
+ teacher: {
23438
+ id: string;
23439
+ username: string;
23440
+ };
23441
+ }[];
23442
+ _count: {
23443
+ teachers: number;
23444
+ students: number;
23445
+ assignments: number;
23446
+ events: number;
23447
+ announcements: number;
23448
+ discussions: number;
23449
+ sections: number;
23450
+ worksheets: number;
23451
+ modules: number;
23452
+ };
23453
+ color: string | null;
23454
+ subject: string;
23455
+ };
23456
+ meta: object;
23457
+ }>;
23458
+ getContentTelemetry: import("@trpc/server").TRPCQueryProcedure<{
23459
+ input: void;
23460
+ output: {
23461
+ content: {
23462
+ assignments: number;
23463
+ assignmentsLast7d: number;
23464
+ submissions: number;
23465
+ submissionsLast7d: number;
23466
+ gradedSubmissions: number;
23467
+ announcements: number;
23468
+ announcementsLast7d: number;
23469
+ discussions: number;
23470
+ messages: number;
23471
+ messagesLast7d: number;
23472
+ worksheets: number;
23473
+ events: number;
23474
+ modules: number;
23475
+ files: number;
23476
+ storageBytes: number;
23477
+ };
23478
+ ai: {
23479
+ calls7d: number;
23480
+ failures7d: number;
23481
+ tokens7d: number;
23482
+ byModel: {
23483
+ model: string;
23484
+ calls: number;
23485
+ tokens: number;
23486
+ }[];
23487
+ };
23488
+ jobs: {
23489
+ failedLast24h: number;
23490
+ byType: {
23491
+ total: number;
23492
+ failed: number;
23493
+ type: string;
23494
+ }[];
23495
+ };
23496
+ };
23497
+ meta: object;
23498
+ }>;
23499
+ getActivitySeries: import("@trpc/server").TRPCQueryProcedure<{
23500
+ input: {
23501
+ days?: number | undefined;
23502
+ };
23503
+ output: {
23504
+ points: import("../services/adminTelemetry.js").DailyPoint[];
23505
+ };
23506
+ meta: object;
23507
+ }>;
23508
+ listSqlSchema: import("@trpc/server").TRPCQueryProcedure<{
23509
+ input: void;
23510
+ output: {
23511
+ tables: import("../services/adminSql.js").AdminSqlTable[];
23512
+ };
23513
+ meta: object;
23514
+ }>;
23515
+ runSql: import("@trpc/server").TRPCMutationProcedure<{
23516
+ input: {
23517
+ sql: string;
23518
+ limit?: number | undefined;
23519
+ };
23520
+ output: import("../services/adminSql.js").AdminSqlResult;
23521
+ meta: object;
23522
+ }>;
23523
+ getSpamOverview: import("@trpc/server").TRPCQueryProcedure<{
23524
+ input: void;
23525
+ output: {
23526
+ rules: {
23527
+ blockedDomains: string[];
23528
+ botPatterns: string[];
23529
+ disposableDomains: string[];
23530
+ };
23531
+ totalUsers: number;
23532
+ suspectedUsers: number;
23533
+ suspectedVerified: number;
23534
+ cleanUsers: number;
23535
+ domains: {
23536
+ domain: string;
23537
+ total: number;
23538
+ verified: number;
23539
+ suspected: boolean;
23540
+ }[];
23541
+ recent: {
23542
+ signals: import("../services/adminSpam.js").SpamSignals;
23543
+ id: string;
23544
+ username: string;
23545
+ email: string;
23546
+ verified: boolean;
23547
+ profile: {
23548
+ createdAt: Date;
23549
+ } | null;
23550
+ _count: {
23551
+ teacherIn: number;
23552
+ studentIn: number;
23553
+ submissions: number;
23554
+ };
23555
+ }[];
23556
+ };
23557
+ meta: object;
23558
+ }>;
23559
+ listUserEmailDomains: import("@trpc/server").TRPCQueryProcedure<{
23560
+ input: {
23561
+ limit?: number | undefined;
23562
+ suspectedOnly?: boolean | undefined;
23563
+ };
23564
+ output: {
23565
+ items: {
23566
+ domain: string;
23567
+ total: number;
23568
+ verified: number;
23569
+ suspected: boolean;
23570
+ }[];
23571
+ };
23572
+ meta: object;
23573
+ }>;
22858
23574
  }>>;
22859
23575
  embedding: import("@trpc/server").TRPCBuiltRouter<{
22860
23576
  ctx: import("../trpc.js").Context;
@@ -23138,7 +23854,7 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
23138
23854
  [x: string]: unknown;
23139
23855
  classId: string;
23140
23856
  moduleId: string;
23141
- itemType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "DISCUSSION" | "EXTERNAL_URL" | "SUB_HEADER";
23857
+ itemType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "DISCUSSION" | "EXTERNAL_URL" | "SUB_HEADER" | "VISUALIZATION";
23142
23858
  title?: string | undefined;
23143
23859
  indent?: number | undefined;
23144
23860
  itemId?: string | undefined;
@@ -25135,5 +25851,127 @@ export declare const createCaller: import("@trpc/server").TRPCRouterCaller<{
25135
25851
  meta: object;
25136
25852
  }>;
25137
25853
  }>>;
25854
+ visualization: import("@trpc/server").TRPCBuiltRouter<{
25855
+ ctx: import("../trpc.js").Context;
25856
+ meta: object;
25857
+ errorShape: {
25858
+ data: {
25859
+ zodError: import("zod").typeToFlattenedError<any, string> | null;
25860
+ prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
25861
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
25862
+ httpStatus: number;
25863
+ path?: string;
25864
+ stack?: string;
25865
+ };
25866
+ message: string;
25867
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
25868
+ };
25869
+ transformer: false;
25870
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
25871
+ list: import("@trpc/server").TRPCQueryProcedure<{
25872
+ input: {
25873
+ [x: string]: unknown;
25874
+ classId: string;
25875
+ };
25876
+ output: {
25877
+ id: string;
25878
+ createdAt: Date;
25879
+ updatedAt: Date;
25880
+ classId: string;
25881
+ title: string;
25882
+ prompt: string | null;
25883
+ published: boolean;
25884
+ }[];
25885
+ meta: object;
25886
+ }>;
25887
+ get: import("@trpc/server").TRPCQueryProcedure<{
25888
+ input: {
25889
+ [x: string]: unknown;
25890
+ classId: string;
25891
+ id: string;
25892
+ };
25893
+ output: {
25894
+ id: string;
25895
+ createdAt: Date;
25896
+ updatedAt: Date;
25897
+ classId: string;
25898
+ title: string;
25899
+ prompt: string | null;
25900
+ published: boolean;
25901
+ html: string;
25902
+ };
25903
+ meta: object;
25904
+ }>;
25905
+ generate: import("@trpc/server").TRPCMutationProcedure<{
25906
+ input: {
25907
+ [x: string]: unknown;
25908
+ classId: string;
25909
+ prompt: string;
25910
+ title?: string | undefined;
25911
+ };
25912
+ output: {
25913
+ id: string;
25914
+ createdAt: Date;
25915
+ updatedAt: Date;
25916
+ classId: string;
25917
+ title: string;
25918
+ prompt: string | null;
25919
+ published: boolean;
25920
+ html: string;
25921
+ };
25922
+ meta: object;
25923
+ }>;
25924
+ revise: import("@trpc/server").TRPCMutationProcedure<{
25925
+ input: {
25926
+ [x: string]: unknown;
25927
+ classId: string;
25928
+ id: string;
25929
+ instruction: string;
25930
+ };
25931
+ output: {
25932
+ id: string;
25933
+ createdAt: Date;
25934
+ updatedAt: Date;
25935
+ classId: string;
25936
+ title: string;
25937
+ prompt: string | null;
25938
+ published: boolean;
25939
+ html: string;
25940
+ };
25941
+ meta: object;
25942
+ }>;
25943
+ update: import("@trpc/server").TRPCMutationProcedure<{
25944
+ input: {
25945
+ [x: string]: unknown;
25946
+ classId: string;
25947
+ id: string;
25948
+ title?: string | undefined;
25949
+ published?: boolean | undefined;
25950
+ html?: string | undefined;
25951
+ };
25952
+ output: {
25953
+ id: string;
25954
+ createdAt: Date;
25955
+ updatedAt: Date;
25956
+ classId: string;
25957
+ title: string;
25958
+ prompt: string | null;
25959
+ published: boolean;
25960
+ html: string;
25961
+ };
25962
+ meta: object;
25963
+ }>;
25964
+ delete: import("@trpc/server").TRPCMutationProcedure<{
25965
+ input: {
25966
+ [x: string]: unknown;
25967
+ classId: string;
25968
+ id: string;
25969
+ };
25970
+ output: {
25971
+ id: string;
25972
+ };
25973
+ meta: object;
25974
+ }>;
25975
+ }>>;
25138
25976
  }>>;
25139
25977
  //# sourceMappingURL=_app.d.ts.map