@studious-lms/server 1.14.0 → 1.15.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.
- package/.github/workflows/deploy.yml +1 -1
- package/dist/instrument.js +3 -3
- package/dist/instrument.js.map +1 -1
- package/dist/lib/inferDocumentFormat.d.ts +10 -0
- package/dist/lib/inferDocumentFormat.d.ts.map +1 -0
- package/dist/lib/inferDocumentFormat.js +48 -0
- package/dist/lib/inferDocumentFormat.js.map +1 -0
- package/dist/lib/legal.d.ts +3 -0
- package/dist/lib/legal.d.ts.map +1 -0
- package/dist/lib/legal.js +6 -0
- package/dist/lib/legal.js.map +1 -0
- package/dist/models/announcement.d.ts +47 -45
- package/dist/models/announcement.d.ts.map +1 -1
- package/dist/models/assignment.d.ts +75 -75
- package/dist/models/auth.d.ts +8 -0
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/auth.js +4 -2
- package/dist/models/auth.js.map +1 -1
- package/dist/models/class.d.ts +13 -13
- package/dist/models/comment.d.ts +6 -6
- package/dist/models/conversation.d.ts +23 -23
- package/dist/models/event.d.ts +20 -18
- package/dist/models/event.d.ts.map +1 -1
- package/dist/models/file.d.ts +33 -9
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/labChat.d.ts +4 -4
- package/dist/models/marketing.d.ts +2 -15
- package/dist/models/marketing.d.ts.map +1 -1
- package/dist/models/marketing.js +12 -4
- package/dist/models/marketing.js.map +1 -1
- package/dist/models/message.d.ts +13 -13
- package/dist/models/newtonChat.d.ts +3 -3
- package/dist/models/notification.d.ts +4 -4
- package/dist/models/worksheet.d.ts +121 -121
- package/dist/pipelines/aiLabChat.d.ts +7 -1
- package/dist/pipelines/aiLabChat.d.ts.map +1 -1
- package/dist/pipelines/aiLabChat.js +153 -67
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/aiLabChatContract.d.ts +34 -195
- package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
- package/dist/pipelines/aiLabChatContract.js +9 -19
- package/dist/pipelines/aiLabChatContract.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +6 -6
- package/dist/pipelines/labChatPrompt.d.ts +8 -3
- package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
- package/dist/pipelines/labChatPrompt.js +52 -14
- package/dist/pipelines/labChatPrompt.js.map +1 -1
- package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
- package/dist/routers/_app.d.ts +750 -546
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/announcement.d.ts +40 -40
- package/dist/routers/assignment.d.ts +131 -121
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/auth.d.ts +2 -0
- package/dist/routers/auth.d.ts.map +1 -1
- package/dist/routers/auth.js +15 -2
- package/dist/routers/auth.js.map +1 -1
- package/dist/routers/class.d.ts +12 -8
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/comment.d.ts +5 -5
- package/dist/routers/conversation.d.ts +6 -6
- package/dist/routers/discussion.d.ts +3 -3
- package/dist/routers/embedding.d.ts +6 -2
- package/dist/routers/embedding.d.ts.map +1 -1
- package/dist/routers/embedding.js +44 -36
- package/dist/routers/embedding.js.map +1 -1
- package/dist/routers/event.d.ts +20 -18
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/file.d.ts +2 -2
- package/dist/routers/labChat.d.ts +3 -3
- package/dist/routers/marketing.d.ts +0 -13
- package/dist/routers/marketing.d.ts.map +1 -1
- package/dist/routers/notifications.d.ts +4 -4
- package/dist/routers/school.d.ts +4 -0
- package/dist/routers/school.d.ts.map +1 -1
- package/dist/routers/search.d.ts +2 -2
- package/dist/routers/user.d.ts +89 -0
- package/dist/routers/user.d.ts.map +1 -1
- package/dist/routers/user.js +19 -2
- package/dist/routers/user.js.map +1 -1
- package/dist/routers/worksheet.d.ts +44 -44
- package/dist/routes/aiStream.d.ts.map +1 -1
- package/dist/routes/aiStream.js +41 -11
- package/dist/routes/aiStream.js.map +1 -1
- package/dist/seedDatabase.d.ts +3 -1
- package/dist/seedDatabase.d.ts.map +1 -1
- package/dist/services/aiChatStream.d.ts +20 -0
- package/dist/services/aiChatStream.d.ts.map +1 -1
- package/dist/services/aiChatStream.js +110 -13
- package/dist/services/aiChatStream.js.map +1 -1
- package/dist/services/aiModifierTools.d.ts +0 -16
- package/dist/services/aiModifierTools.d.ts.map +1 -1
- package/dist/services/aiModifierTools.js +112 -3
- package/dist/services/aiModifierTools.js.map +1 -1
- package/dist/services/aiProposalTools.d.ts.map +1 -1
- package/dist/services/aiProposalTools.js +25 -25
- package/dist/services/aiProposalTools.js.map +1 -1
- package/dist/services/aiTools.js +3 -3
- package/dist/services/aiTools.js.map +1 -1
- package/dist/services/announcement.d.ts +34 -34
- package/dist/services/assignment.d.ts +121 -111
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/assignment.js +4 -2
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/auth.d.ts +2 -0
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +13 -4
- package/dist/services/auth.js.map +1 -1
- package/dist/services/class.d.ts +10 -6
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +7 -3
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +5 -5
- package/dist/services/conversation.d.ts +6 -6
- package/dist/services/discussion.d.ts.map +1 -1
- package/dist/services/discussion.js +9 -2
- package/dist/services/discussion.js.map +1 -1
- package/dist/services/embedding.d.ts +19 -1
- package/dist/services/embedding.d.ts.map +1 -1
- package/dist/services/embedding.js +154 -8
- package/dist/services/embedding.js.map +1 -1
- package/dist/services/event.d.ts +20 -18
- package/dist/services/event.d.ts.map +1 -1
- package/dist/services/file.d.ts +4 -4
- package/dist/services/folder.d.ts.map +1 -1
- package/dist/services/folder.js +32 -2
- package/dist/services/folder.js.map +1 -1
- package/dist/services/labChat.d.ts +3 -3
- package/dist/services/marketing.d.ts +1 -14
- package/dist/services/marketing.d.ts.map +1 -1
- package/dist/services/marketing.js +5 -5
- package/dist/services/marketing.js.map +1 -1
- package/dist/services/notification.d.ts +4 -4
- package/dist/services/openaiDocumentGen.d.ts +37 -0
- package/dist/services/openaiDocumentGen.d.ts.map +1 -0
- package/dist/services/openaiDocumentGen.js +262 -0
- package/dist/services/openaiDocumentGen.js.map +1 -0
- package/dist/services/school.d.ts +4 -0
- package/dist/services/school.d.ts.map +1 -1
- package/dist/services/search.d.ts +1 -1
- package/dist/services/search.d.ts.map +1 -1
- package/dist/services/search.js +27 -2
- package/dist/services/search.js.map +1 -1
- package/dist/services/userPrivacy.d.ts +86 -0
- package/dist/services/userPrivacy.d.ts.map +1 -0
- package/dist/services/userPrivacy.js +184 -0
- package/dist/services/userPrivacy.js.map +1 -0
- package/dist/services/worksheet.d.ts +66 -49
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +48 -3
- package/dist/services/worksheet.js.map +1 -1
- package/dist/utils/email.d.ts.map +1 -1
- package/dist/utils/email.js +7 -3
- package/dist/utils/email.js.map +1 -1
- package/dist/workers/processors/embedContent.d.ts.map +1 -1
- package/dist/workers/processors/embedContent.js +16 -25
- package/dist/workers/processors/embedContent.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260610140000_expand_embedding_source_types/migration.sql +4 -0
- package/prisma/migrations/20260611120000_add_user_terms_acceptance/migration.sql +3 -0
- package/prisma/schema.prisma +6 -0
- package/src/instrument.ts +1 -1
- package/src/lib/inferDocumentFormat.ts +58 -0
- package/src/lib/legal.ts +2 -0
- package/src/models/auth.ts +4 -0
- package/src/models/marketing.ts +10 -2
- package/src/pipelines/aiLabChat.ts +198 -74
- package/src/pipelines/aiLabChatContract.ts +7 -17
- package/src/pipelines/labChatPrompt.ts +64 -14
- package/src/routers/auth.ts +13 -0
- package/src/routers/embedding.ts +44 -39
- package/src/routers/user.ts +26 -0
- package/src/routes/aiStream.ts +47 -9
- package/src/services/aiChatStream.ts +133 -11
- package/src/services/aiModifierTools.ts +154 -1
- package/src/services/aiProposalTools.ts +27 -25
- package/src/services/aiTools.ts +1 -1
- package/src/services/assignment.ts +3 -0
- package/src/services/auth.ts +14 -2
- package/src/services/class.ts +7 -1
- package/src/services/discussion.ts +13 -0
- package/src/services/embedding.ts +167 -6
- package/src/services/folder.ts +31 -0
- package/src/services/marketing.ts +3 -3
- package/src/services/openaiDocumentGen.ts +319 -0
- package/src/services/search.ts +25 -1
- package/src/services/userPrivacy.ts +196 -0
- package/src/services/worksheet.ts +68 -1
- package/src/utils/email.ts +5 -1
- package/src/workers/processors/embedContent.ts +18 -22
- package/tests/helpers/registerInput.ts +20 -0
- package/tests/integration/globalSetup.ts +10 -18
- package/tests/integration/routers/auth.test.ts +13 -18
- package/tests/unit/lib/inferDocumentFormat.test.ts +33 -0
- package/tests/unit/services/aiChatStream.test.ts +92 -0
- package/tests/unit/services/openaiDocumentGen.test.ts +65 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyuB3B,CAAC"}
|
package/dist/routers/auth.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8CxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DrB,CAAC"}
|
package/dist/routers/auth.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
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]="d1a28eb6-8a65-51d4-91b1-0850796f9caf")}catch(e){}}();
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { TRPCError } from "@trpc/server";
|
|
5
5
|
import { createTRPCRouter, protectedProcedure, publicProcedure, } from "../trpc.js";
|
|
6
|
+
import { CURRENT_TERMS_VERSION } from "../lib/legal.js";
|
|
6
7
|
import { register, login, logout, check, resendVerificationEmail, verify, requestPasswordReset, resetPassword, } from "../services/auth.js";
|
|
7
8
|
const loginSchema = z.object({
|
|
8
9
|
username: z.string(),
|
|
@@ -14,6 +15,16 @@ const registerSchema = z
|
|
|
14
15
|
email: z.string().email("Invalid email address"),
|
|
15
16
|
password: z.string().min(6, "Password must be at least 6 characters"),
|
|
16
17
|
confirmPassword: z.string(),
|
|
18
|
+
agreeToTerms: z.literal(true, {
|
|
19
|
+
errorMap: () => ({
|
|
20
|
+
message: "You must accept the Terms of Service and Privacy Policy",
|
|
21
|
+
}),
|
|
22
|
+
}),
|
|
23
|
+
termsVersion: z.literal(CURRENT_TERMS_VERSION, {
|
|
24
|
+
errorMap: () => ({
|
|
25
|
+
message: "Please accept the current Terms of Service and Privacy Policy",
|
|
26
|
+
}),
|
|
27
|
+
}),
|
|
17
28
|
})
|
|
18
29
|
.refine((data) => data.password === data.confirmPassword, {
|
|
19
30
|
message: "Passwords don't match",
|
|
@@ -26,6 +37,8 @@ export const authRouter = createTRPCRouter({
|
|
|
26
37
|
username: input.username,
|
|
27
38
|
email: input.email,
|
|
28
39
|
password: input.password,
|
|
40
|
+
agreeToTerms: input.agreeToTerms,
|
|
41
|
+
termsVersion: input.termsVersion,
|
|
29
42
|
})),
|
|
30
43
|
login: publicProcedure
|
|
31
44
|
.input(loginSchema)
|
|
@@ -71,4 +84,4 @@ export const authRouter = createTRPCRouter({
|
|
|
71
84
|
.mutation(({ input }) => resetPassword(input.token, input.password)),
|
|
72
85
|
});
|
|
73
86
|
//# sourceMappingURL=auth.js.map
|
|
74
|
-
//# debugId=
|
|
87
|
+
//# debugId=d1a28eb6-8a65-51d4-91b1-0850796f9caf
|
package/dist/routers/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sources":["routers/auth.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { TRPCError } from \"@trpc/server\";\nimport {\n createTRPCRouter,\n protectedProcedure,\n publicProcedure,\n} from \"../trpc.js\";\nimport {\n register,\n login,\n logout,\n check,\n resendVerificationEmail,\n verify,\n requestPasswordReset,\n resetPassword,\n} from \"../services/auth.js\";\n\nconst loginSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\n\nconst registerSchema = z\n .object({\n username: z.string().min(3, \"Username must be at least 3 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n });\n\nexport const authRouter = createTRPCRouter({\n register: publicProcedure\n .input(registerSchema)\n .mutation(({ input }) =>\n register({\n username: input.username,\n email: input.email,\n password: input.password,\n })\n ),\n\n login: publicProcedure\n .input(loginSchema)\n .mutation(({ input }) => login(input)),\n\n logout: protectedProcedure.mutation(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return logout(ctx.user.id);\n }),\n\n check: protectedProcedure.query(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return check(ctx.user.id);\n }),\n\n resendVerificationEmail: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => resendVerificationEmail(input.email)),\n\n verify: publicProcedure\n .input(z.object({ token: z.string() }))\n .mutation(({ input }) => verify(input.token)),\n\n requestPasswordReset: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => requestPasswordReset(input.email)),\n\n resetPassword: publicProcedure\n .input(\n z\n .object({\n token: z.string(),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n })\n )\n .mutation(({ input }) => resetPassword(input.token, input.password)),\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,QAAQ,EACR,KAAK,EACL,MAAM,EACN,KAAK,EACL,uBAAuB,EACvB,MAAM,EACN,oBAAoB,EACpB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;IACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;IAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;IACrE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["routers/auth.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { TRPCError } from \"@trpc/server\";\nimport {\n createTRPCRouter,\n protectedProcedure,\n publicProcedure,\n} from \"../trpc.js\";\nimport { CURRENT_TERMS_VERSION } from \"../lib/legal.js\";\nimport {\n register,\n login,\n logout,\n check,\n resendVerificationEmail,\n verify,\n requestPasswordReset,\n resetPassword,\n} from \"../services/auth.js\";\n\nconst loginSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\n\nconst registerSchema = z\n .object({\n username: z.string().min(3, \"Username must be at least 3 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n agreeToTerms: z.literal(true, {\n errorMap: () => ({\n message: \"You must accept the Terms of Service and Privacy Policy\",\n }),\n }),\n termsVersion: z.literal(CURRENT_TERMS_VERSION, {\n errorMap: () => ({\n message: \"Please accept the current Terms of Service and Privacy Policy\",\n }),\n }),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n });\n\nexport const authRouter = createTRPCRouter({\n register: publicProcedure\n .input(registerSchema)\n .mutation(({ input }) =>\n register({\n username: input.username,\n email: input.email,\n password: input.password,\n agreeToTerms: input.agreeToTerms,\n termsVersion: input.termsVersion,\n })\n ),\n\n login: publicProcedure\n .input(loginSchema)\n .mutation(({ input }) => login(input)),\n\n logout: protectedProcedure.mutation(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return logout(ctx.user.id);\n }),\n\n check: protectedProcedure.query(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return check(ctx.user.id);\n }),\n\n resendVerificationEmail: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => resendVerificationEmail(input.email)),\n\n verify: publicProcedure\n .input(z.object({ token: z.string() }))\n .mutation(({ input }) => verify(input.token)),\n\n requestPasswordReset: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => requestPasswordReset(input.email)),\n\n resetPassword: publicProcedure\n .input(\n z\n .object({\n token: z.string(),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n })\n )\n .mutation(({ input }) => resetPassword(input.token, input.password)),\n});\n"],"names":[],"mappings":"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","debug_id":"d1a28eb6-8a65-51d4-91b1-0850796f9caf"}
|
package/dist/routers/class.d.ts
CHANGED
|
@@ -297,6 +297,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
297
297
|
email: string;
|
|
298
298
|
password: string;
|
|
299
299
|
verified: boolean;
|
|
300
|
+
termsAcceptedAt: Date | null;
|
|
301
|
+
termsVersion: string | null;
|
|
300
302
|
schoolId: string | null;
|
|
301
303
|
}[];
|
|
302
304
|
students: {
|
|
@@ -305,6 +307,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
305
307
|
email: string;
|
|
306
308
|
password: string;
|
|
307
309
|
verified: boolean;
|
|
310
|
+
termsAcceptedAt: Date | null;
|
|
311
|
+
termsVersion: string | null;
|
|
308
312
|
schoolId: string | null;
|
|
309
313
|
}[];
|
|
310
314
|
} & {
|
|
@@ -359,7 +363,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
359
363
|
input: {
|
|
360
364
|
[x: string]: unknown;
|
|
361
365
|
classId: string;
|
|
362
|
-
type: "
|
|
366
|
+
type: "student" | "teacher";
|
|
363
367
|
userId: string;
|
|
364
368
|
};
|
|
365
369
|
output: {
|
|
@@ -377,7 +381,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
377
381
|
studentsCanReply: boolean;
|
|
378
382
|
};
|
|
379
383
|
user: {
|
|
380
|
-
type: "
|
|
384
|
+
type: "student" | "teacher";
|
|
381
385
|
id: string;
|
|
382
386
|
username: string;
|
|
383
387
|
};
|
|
@@ -479,8 +483,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
479
483
|
id: string;
|
|
480
484
|
createdAt: Date;
|
|
481
485
|
assignmentId: string;
|
|
482
|
-
modifiedAt: Date;
|
|
483
486
|
studentId: string;
|
|
487
|
+
modifiedAt: Date;
|
|
484
488
|
extendedResponse: string | null;
|
|
485
489
|
gradeReceived: number | null;
|
|
486
490
|
recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
|
|
@@ -515,8 +519,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
515
519
|
id: string;
|
|
516
520
|
createdAt: Date;
|
|
517
521
|
assignmentId: string;
|
|
518
|
-
modifiedAt: Date;
|
|
519
522
|
studentId: string;
|
|
523
|
+
modifiedAt: Date;
|
|
520
524
|
extendedResponse: string | null;
|
|
521
525
|
gradeReceived: number | null;
|
|
522
526
|
recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
|
|
@@ -744,7 +748,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
744
748
|
input: {
|
|
745
749
|
[x: string]: unknown;
|
|
746
750
|
classId: string;
|
|
747
|
-
type: "HOMEWORK" | "QUIZ" | "TEST" | "PROJECT" | "ESSAY" | "
|
|
751
|
+
type: "DISCUSSION" | "HOMEWORK" | "QUIZ" | "TEST" | "PROJECT" | "ESSAY" | "PRESENTATION" | "LAB" | "OTHER";
|
|
748
752
|
title: string;
|
|
749
753
|
instructions: string;
|
|
750
754
|
dueDate?: Date | undefined;
|
|
@@ -1017,11 +1021,11 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1017
1021
|
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
1018
1022
|
options: import("@prisma/client/runtime/library.js").JsonValue;
|
|
1019
1023
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue;
|
|
1020
|
-
|
|
1021
|
-
worksheetId: string;
|
|
1024
|
+
points: number;
|
|
1022
1025
|
question: string;
|
|
1026
|
+
worksheetId: string;
|
|
1027
|
+
order: number | null;
|
|
1023
1028
|
answer: string;
|
|
1024
|
-
points: number;
|
|
1025
1029
|
}[];
|
|
1026
1030
|
}[];
|
|
1027
1031
|
markSchemes: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuStB,CAAC"}
|
|
@@ -39,8 +39,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
39
39
|
content: string;
|
|
40
40
|
assignmentId: string | null;
|
|
41
41
|
submissionId: string | null;
|
|
42
|
-
modifiedAt: Date | null;
|
|
43
42
|
announcementId: string | null;
|
|
43
|
+
modifiedAt: Date | null;
|
|
44
44
|
isPinned: boolean;
|
|
45
45
|
author: {
|
|
46
46
|
id: string;
|
|
@@ -75,8 +75,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
75
75
|
content: string;
|
|
76
76
|
assignmentId: string | null;
|
|
77
77
|
submissionId: string | null;
|
|
78
|
-
modifiedAt: Date | null;
|
|
79
78
|
announcementId: string | null;
|
|
79
|
+
modifiedAt: Date | null;
|
|
80
80
|
authorId: string;
|
|
81
81
|
isPinned: boolean;
|
|
82
82
|
parentCommentId: string | null;
|
|
@@ -95,8 +95,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
95
95
|
content: string;
|
|
96
96
|
assignmentId: string | null;
|
|
97
97
|
submissionId: string | null;
|
|
98
|
-
modifiedAt: Date | null;
|
|
99
98
|
announcementId: string | null;
|
|
99
|
+
modifiedAt: Date | null;
|
|
100
100
|
authorId: string;
|
|
101
101
|
isPinned: boolean;
|
|
102
102
|
parentCommentId: string | null;
|
|
@@ -115,8 +115,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
115
115
|
content: string;
|
|
116
116
|
assignmentId: string | null;
|
|
117
117
|
submissionId: string | null;
|
|
118
|
-
modifiedAt: Date | null;
|
|
119
118
|
announcementId: string | null;
|
|
119
|
+
modifiedAt: Date | null;
|
|
120
120
|
authorId: string;
|
|
121
121
|
isPinned: boolean;
|
|
122
122
|
parentCommentId: string | null;
|
|
@@ -144,8 +144,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
144
144
|
content: string;
|
|
145
145
|
assignmentId: string | null;
|
|
146
146
|
submissionId: string | null;
|
|
147
|
-
modifiedAt: Date | null;
|
|
148
147
|
announcementId: string | null;
|
|
148
|
+
modifiedAt: Date | null;
|
|
149
149
|
authorId: string;
|
|
150
150
|
isPinned: boolean;
|
|
151
151
|
parentCommentId: string | null;
|
|
@@ -40,8 +40,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
40
40
|
} & {
|
|
41
41
|
id: string;
|
|
42
42
|
userId: string;
|
|
43
|
-
conversationId: string;
|
|
44
43
|
role: import(".prisma/client").$Enums.ConversationRole;
|
|
44
|
+
conversationId: string;
|
|
45
45
|
joinedAt: Date;
|
|
46
46
|
hiddenAt: Date | null;
|
|
47
47
|
lastViewedAt: Date | null;
|
|
@@ -61,9 +61,9 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
61
61
|
id: string;
|
|
62
62
|
createdAt: Date;
|
|
63
63
|
content: string;
|
|
64
|
+
senderId: string;
|
|
64
65
|
conversationId: string;
|
|
65
66
|
runJobId: string | null;
|
|
66
|
-
senderId: string;
|
|
67
67
|
};
|
|
68
68
|
unreadCount: number;
|
|
69
69
|
unreadMentionCount: number;
|
|
@@ -104,8 +104,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
104
104
|
} & {
|
|
105
105
|
id: string;
|
|
106
106
|
userId: string;
|
|
107
|
-
conversationId: string;
|
|
108
107
|
role: import(".prisma/client").$Enums.ConversationRole;
|
|
108
|
+
conversationId: string;
|
|
109
109
|
joinedAt: Date;
|
|
110
110
|
hiddenAt: Date | null;
|
|
111
111
|
lastViewedAt: Date | null;
|
|
@@ -138,8 +138,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
138
138
|
} & {
|
|
139
139
|
id: string;
|
|
140
140
|
userId: string;
|
|
141
|
-
conversationId: string;
|
|
142
141
|
role: import(".prisma/client").$Enums.ConversationRole;
|
|
142
|
+
conversationId: string;
|
|
143
143
|
joinedAt: Date;
|
|
144
144
|
hiddenAt: Date | null;
|
|
145
145
|
lastViewedAt: Date | null;
|
|
@@ -182,8 +182,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
182
182
|
} & {
|
|
183
183
|
id: string;
|
|
184
184
|
userId: string;
|
|
185
|
-
conversationId: string;
|
|
186
185
|
role: import(".prisma/client").$Enums.ConversationRole;
|
|
186
|
+
conversationId: string;
|
|
187
187
|
joinedAt: Date;
|
|
188
188
|
hiddenAt: Date | null;
|
|
189
189
|
lastViewedAt: Date | null;
|
|
@@ -217,8 +217,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
217
217
|
} & {
|
|
218
218
|
id: string;
|
|
219
219
|
userId: string;
|
|
220
|
-
conversationId: string;
|
|
221
220
|
role: import(".prisma/client").$Enums.ConversationRole;
|
|
221
|
+
conversationId: string;
|
|
222
222
|
joinedAt: Date;
|
|
223
223
|
hiddenAt: Date | null;
|
|
224
224
|
lastViewedAt: Date | null;
|
|
@@ -19,7 +19,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
19
19
|
list: import("@trpc/server").TRPCQueryProcedure<{
|
|
20
20
|
input: {
|
|
21
21
|
classId: string;
|
|
22
|
-
type?: "
|
|
22
|
+
type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
|
|
23
23
|
sort?: "recent" | "activity" | "top" | undefined;
|
|
24
24
|
cursor?: string | undefined;
|
|
25
25
|
search?: string | undefined;
|
|
@@ -165,7 +165,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
165
165
|
classId: string;
|
|
166
166
|
title: string;
|
|
167
167
|
body: string;
|
|
168
|
-
type?: "
|
|
168
|
+
type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
|
|
169
169
|
tagIds?: string[] | undefined;
|
|
170
170
|
attachmentIds?: string[] | undefined;
|
|
171
171
|
};
|
|
@@ -258,7 +258,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
258
258
|
update: import("@trpc/server").TRPCMutationProcedure<{
|
|
259
259
|
input: {
|
|
260
260
|
discussionId: string;
|
|
261
|
-
type?: "
|
|
261
|
+
type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
|
|
262
262
|
title?: string | undefined;
|
|
263
263
|
body?: string | undefined;
|
|
264
264
|
allowReplies?: boolean | undefined;
|
|
@@ -28,7 +28,7 @@ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
28
28
|
query: string;
|
|
29
29
|
classId: string;
|
|
30
30
|
limit?: number | undefined;
|
|
31
|
-
sourceTypes?: ("
|
|
31
|
+
sourceTypes?: ("FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "SECTION" | "DISCUSSION" | "SUBMISSION" | "SYLLABUS")[] | undefined;
|
|
32
32
|
};
|
|
33
33
|
output: import("../services/embedding.js").EmbeddingSearchResult[];
|
|
34
34
|
meta: object;
|
|
@@ -40,7 +40,7 @@ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
40
40
|
reindex: import("@trpc/server").TRPCMutationProcedure<{
|
|
41
41
|
input: {
|
|
42
42
|
classId: string;
|
|
43
|
-
sourceType: "
|
|
43
|
+
sourceType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "SECTION" | "DISCUSSION" | "SUBMISSION" | "SYLLABUS";
|
|
44
44
|
sourceId: string;
|
|
45
45
|
};
|
|
46
46
|
output: {
|
|
@@ -61,6 +61,10 @@ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
61
61
|
assignments: number;
|
|
62
62
|
worksheets: number;
|
|
63
63
|
announcements: number;
|
|
64
|
+
discussions: number;
|
|
65
|
+
submissions: number;
|
|
66
|
+
syllabus: number;
|
|
67
|
+
files: number;
|
|
64
68
|
};
|
|
65
69
|
};
|
|
66
70
|
meta: object;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.d.ts","sourceRoot":"/","sources":["routers/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"/","sources":["routers/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;IAC1B;;OAEG;;;;;;;;;;;IAiCH;;;OAGG;;;;;;;;;;;;IA+BH;;;OAGG;;;;;;;;;;;;;;;;;;GAyEH,CAAC"}
|
|
@@ -3,13 +3,17 @@
|
|
|
3
3
|
* Provides search and indexing triggers for class content.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
!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]="
|
|
6
|
+
!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]="6aa753e1-b0da-52b8-9e5c-afa887df290b")}catch(e){}}();
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { createTRPCRouter, protectedProcedure } from '../trpc.js';
|
|
9
9
|
import { searchEmbeddings } from '../services/embedding.js';
|
|
10
10
|
import { enqueueRunJob } from '../workers/queues.js';
|
|
11
11
|
import { prisma } from '../lib/prisma.js';
|
|
12
12
|
import { TRPCError } from '@trpc/server';
|
|
13
|
+
const sourceTypeEnum = z.enum([
|
|
14
|
+
'FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT',
|
|
15
|
+
'SECTION', 'DISCUSSION', 'SUBMISSION', 'SYLLABUS',
|
|
16
|
+
]);
|
|
13
17
|
export const embeddingRouter = createTRPCRouter({
|
|
14
18
|
/**
|
|
15
19
|
* Semantic search over class materials.
|
|
@@ -19,10 +23,9 @@ export const embeddingRouter = createTRPCRouter({
|
|
|
19
23
|
classId: z.string(),
|
|
20
24
|
query: z.string().min(1).max(500),
|
|
21
25
|
limit: z.number().min(1).max(20).default(5),
|
|
22
|
-
sourceTypes: z.array(
|
|
26
|
+
sourceTypes: z.array(sourceTypeEnum).optional(),
|
|
23
27
|
}))
|
|
24
28
|
.query(async ({ input, ctx }) => {
|
|
25
|
-
// Verify user has access to the class
|
|
26
29
|
const userInClass = await prisma.class.findFirst({
|
|
27
30
|
where: {
|
|
28
31
|
id: input.classId,
|
|
@@ -50,11 +53,10 @@ export const embeddingRouter = createTRPCRouter({
|
|
|
50
53
|
reindex: protectedProcedure
|
|
51
54
|
.input(z.object({
|
|
52
55
|
classId: z.string(),
|
|
53
|
-
sourceType:
|
|
56
|
+
sourceType: sourceTypeEnum,
|
|
54
57
|
sourceId: z.string(),
|
|
55
58
|
}))
|
|
56
59
|
.mutation(async ({ input, ctx }) => {
|
|
57
|
-
// Verify teacher access
|
|
58
60
|
const teacherInClass = await prisma.class.findFirst({
|
|
59
61
|
where: {
|
|
60
62
|
id: input.classId,
|
|
@@ -92,42 +94,44 @@ export const embeddingRouter = createTRPCRouter({
|
|
|
92
94
|
if (!teacherInClass) {
|
|
93
95
|
throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });
|
|
94
96
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
where: { classId: input.classId },
|
|
98
|
-
select: { id: true },
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
97
|
+
const [assignments, worksheets, announcements, discussions, submissions, classData, classFiles] = await Promise.all([
|
|
98
|
+
prisma.assignment.findMany({ where: { classId: input.classId }, select: { id: true } }),
|
|
99
|
+
prisma.worksheet.findMany({ where: { classId: input.classId }, select: { id: true } }),
|
|
100
|
+
prisma.announcement.findMany({ where: { classId: input.classId }, select: { id: true } }),
|
|
101
|
+
prisma.discussion.findMany({ where: { classId: input.classId }, select: { id: true } }),
|
|
102
|
+
prisma.submission.findMany({
|
|
103
|
+
where: { assignment: { classId: input.classId }, gradeReceived: { not: null } },
|
|
104
|
+
select: { id: true },
|
|
105
|
+
}),
|
|
106
|
+
prisma.class.findUnique({ where: { id: input.classId }, select: { syllabus: true } }),
|
|
107
|
+
prisma.folder.findUnique({
|
|
108
|
+
where: { classId: input.classId },
|
|
109
|
+
select: { files: { select: { id: true }, where: { uploadStatus: 'COMPLETED' } } },
|
|
110
|
+
}),
|
|
111
|
+
]);
|
|
110
112
|
const jobs = [];
|
|
113
|
+
const opts = { classId: input.classId, userId: ctx.user.id };
|
|
111
114
|
for (const a of assignments) {
|
|
112
|
-
jobs.push(enqueueRunJob('EMBED_CONTENT', {
|
|
113
|
-
classId: input.classId,
|
|
114
|
-
sourceType: 'ASSIGNMENT',
|
|
115
|
-
sourceId: a.id,
|
|
116
|
-
}, { classId: input.classId, userId: ctx.user.id }));
|
|
115
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ASSIGNMENT', sourceId: a.id }, opts));
|
|
117
116
|
}
|
|
118
117
|
for (const w of worksheets) {
|
|
119
|
-
jobs.push(enqueueRunJob('EMBED_CONTENT', {
|
|
120
|
-
classId: input.classId,
|
|
121
|
-
sourceType: 'WORKSHEET',
|
|
122
|
-
sourceId: w.id,
|
|
123
|
-
}, { classId: input.classId, userId: ctx.user.id }));
|
|
118
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'WORKSHEET', sourceId: w.id }, opts));
|
|
124
119
|
}
|
|
125
120
|
for (const ann of announcements) {
|
|
126
|
-
jobs.push(enqueueRunJob('EMBED_CONTENT', {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
121
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ANNOUNCEMENT', sourceId: ann.id }, opts));
|
|
122
|
+
}
|
|
123
|
+
for (const d of discussions) {
|
|
124
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'DISCUSSION', sourceId: d.id }, opts));
|
|
125
|
+
}
|
|
126
|
+
for (const s of submissions) {
|
|
127
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SUBMISSION', sourceId: s.id }, opts));
|
|
128
|
+
}
|
|
129
|
+
if (classData?.syllabus) {
|
|
130
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SYLLABUS', sourceId: input.classId }, opts));
|
|
131
|
+
}
|
|
132
|
+
const files = classFiles?.files ?? [];
|
|
133
|
+
for (const f of files) {
|
|
134
|
+
jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'FILE', sourceId: f.id }, opts));
|
|
131
135
|
}
|
|
132
136
|
await Promise.allSettled(jobs);
|
|
133
137
|
return {
|
|
@@ -135,9 +139,13 @@ export const embeddingRouter = createTRPCRouter({
|
|
|
135
139
|
assignments: assignments.length,
|
|
136
140
|
worksheets: worksheets.length,
|
|
137
141
|
announcements: announcements.length,
|
|
142
|
+
discussions: discussions.length,
|
|
143
|
+
submissions: submissions.length,
|
|
144
|
+
syllabus: classData?.syllabus ? 1 : 0,
|
|
145
|
+
files: files.length,
|
|
138
146
|
},
|
|
139
147
|
};
|
|
140
148
|
}),
|
|
141
149
|
});
|
|
142
150
|
//# sourceMappingURL=embedding.js.map
|
|
143
|
-
//# debugId=
|
|
151
|
+
//# debugId=6aa753e1-b0da-52b8-9e5c-afa887df290b
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sources":["routers/embedding.ts"],"sourceRoot":"/","sourcesContent":["/**\n * tRPC router for embedding/RAG operations.\n * Provides search and indexing triggers for class content.\n */\nimport { z } from 'zod';\nimport { createTRPCRouter, protectedProcedure } from '../trpc.js';\nimport { searchEmbeddings, indexAssignment, indexWorksheet, indexAnnouncement } from '../services/embedding.js';\nimport { enqueueRunJob } from '../workers/queues.js';\nimport { prisma } from '../lib/prisma.js';\nimport { TRPCError } from '@trpc/server';\nimport type { EmbeddingSourceType } from '@prisma/client';\n\nexport const embeddingRouter = createTRPCRouter({\n /**\n * Semantic search over class materials.\n */\n search: protectedProcedure\n .input(z.object({\n classId: z.string(),\n query: z.string().min(1).max(500),\n limit: z.number().min(1).max(20).default(5),\n sourceTypes: z.array(z.enum(['FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION'])).optional(),\n }))\n .query(async ({ input, ctx }) => {\n // Verify user has access to the class\n const userInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n OR: [\n { teachers: { some: { id: ctx.user!.id } } },\n { students: { some: { id: ctx.user!.id } } },\n ],\n },\n });\n\n if (!userInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Access denied' });\n }\n\n const results = await searchEmbeddings({\n classId: input.classId,\n query: input.query,\n limit: input.limit,\n sourceTypes: input.sourceTypes as EmbeddingSourceType[] | undefined,\n });\n\n return results;\n }),\n\n /**\n * Trigger re-indexing of a specific resource.\n * Teachers only.\n */\n reindex: protectedProcedure\n .input(z.object({\n classId: z.string(),\n sourceType: z.enum(['FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION']),\n sourceId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n // Verify teacher access\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n const result = await enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: input.sourceType,\n sourceId: input.sourceId,\n }, {\n classId: input.classId,\n userId: ctx.user!.id,\n });\n\n return { runJobId: result.runJobId };\n }),\n\n /**\n * Bulk index all content for a class.\n * Teachers only. Useful for initial setup.\n */\n indexAll: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n // Enqueue all assignments\n const assignments = await prisma.assignment.findMany({\n where: { classId: input.classId },\n select: { id: true },\n });\n\n // Enqueue all worksheets\n const worksheets = await prisma.worksheet.findMany({\n where: { classId: input.classId },\n select: { id: true },\n });\n\n // Enqueue all announcements\n const announcements = await prisma.announcement.findMany({\n where: { classId: input.classId },\n select: { id: true },\n });\n\n const jobs: Promise<unknown>[] = [];\n\n for (const a of assignments) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: 'ASSIGNMENT',\n sourceId: a.id,\n }, { classId: input.classId, userId: ctx.user!.id }));\n }\n\n for (const w of worksheets) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: 'WORKSHEET',\n sourceId: w.id,\n }, { classId: input.classId, userId: ctx.user!.id }));\n }\n\n for (const ann of announcements) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: 'ANNOUNCEMENT',\n sourceId: ann.id,\n }, { classId: input.classId, userId: ctx.user!.id }));\n }\n\n await Promise.allSettled(jobs);\n\n return {\n queued: {\n assignments: assignments.length,\n worksheets: worksheets.length,\n announcements: announcements.length,\n },\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"2a73cd21-6669-5303-82a8-94d941a432bd"}
|
|
1
|
+
{"version":3,"file":"embedding.js","sources":["routers/embedding.ts"],"sourceRoot":"/","sourcesContent":["/**\n * tRPC router for embedding/RAG operations.\n * Provides search and indexing triggers for class content.\n */\nimport { z } from 'zod';\nimport { createTRPCRouter, protectedProcedure } from '../trpc.js';\nimport { searchEmbeddings } from '../services/embedding.js';\nimport { enqueueRunJob } from '../workers/queues.js';\nimport { prisma } from '../lib/prisma.js';\nimport { TRPCError } from '@trpc/server';\nimport type { EmbeddingSourceType } from '@prisma/client';\n\nconst sourceTypeEnum = z.enum([\n 'FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT',\n 'SECTION', 'DISCUSSION', 'SUBMISSION', 'SYLLABUS',\n]);\n\nexport const embeddingRouter = createTRPCRouter({\n /**\n * Semantic search over class materials.\n */\n search: protectedProcedure\n .input(z.object({\n classId: z.string(),\n query: z.string().min(1).max(500),\n limit: z.number().min(1).max(20).default(5),\n sourceTypes: z.array(sourceTypeEnum).optional(),\n }))\n .query(async ({ input, ctx }) => {\n const userInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n OR: [\n { teachers: { some: { id: ctx.user!.id } } },\n { students: { some: { id: ctx.user!.id } } },\n ],\n },\n });\n\n if (!userInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Access denied' });\n }\n\n const results = await searchEmbeddings({\n classId: input.classId,\n query: input.query,\n limit: input.limit,\n sourceTypes: input.sourceTypes as EmbeddingSourceType[] | undefined,\n });\n\n return results;\n }),\n\n /**\n * Trigger re-indexing of a specific resource.\n * Teachers only.\n */\n reindex: protectedProcedure\n .input(z.object({\n classId: z.string(),\n sourceType: sourceTypeEnum,\n sourceId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n const result = await enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: input.sourceType,\n sourceId: input.sourceId,\n }, {\n classId: input.classId,\n userId: ctx.user!.id,\n });\n\n return { runJobId: result.runJobId };\n }),\n\n /**\n * Bulk index all content for a class.\n * Teachers only. Useful for initial setup.\n */\n indexAll: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n const [assignments, worksheets, announcements, discussions, submissions, classData, classFiles] = await Promise.all([\n prisma.assignment.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.worksheet.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.announcement.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.discussion.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.submission.findMany({\n where: { assignment: { classId: input.classId }, gradeReceived: { not: null } },\n select: { id: true },\n }),\n prisma.class.findUnique({ where: { id: input.classId }, select: { syllabus: true } }),\n prisma.folder.findUnique({\n where: { classId: input.classId },\n select: { files: { select: { id: true }, where: { uploadStatus: 'COMPLETED' } } },\n }),\n ]);\n\n const jobs: Promise<unknown>[] = [];\n const opts = { classId: input.classId, userId: ctx.user!.id };\n\n for (const a of assignments) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ASSIGNMENT', sourceId: a.id }, opts));\n }\n for (const w of worksheets) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'WORKSHEET', sourceId: w.id }, opts));\n }\n for (const ann of announcements) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ANNOUNCEMENT', sourceId: ann.id }, opts));\n }\n for (const d of discussions) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'DISCUSSION', sourceId: d.id }, opts));\n }\n for (const s of submissions) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SUBMISSION', sourceId: s.id }, opts));\n }\n if (classData?.syllabus) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SYLLABUS', sourceId: input.classId }, opts));\n }\n const files = classFiles?.files ?? [];\n for (const f of files) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'FILE', sourceId: f.id }, opts));\n }\n\n await Promise.allSettled(jobs);\n\n return {\n queued: {\n assignments: assignments.length,\n worksheets: worksheets.length,\n announcements: announcements.length,\n discussions: discussions.length,\n submissions: submissions.length,\n syllabus: classData?.syllabus ? 1 : 0,\n files: files.length,\n },\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"6aa753e1-b0da-52b8-9e5c-afa887df290b"}
|