@rpcbase/server 0.538.0 → 0.540.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 (54) hide show
  1. package/dist/email-DK8uUU4X.js +8045 -0
  2. package/dist/email-DK8uUU4X.js.map +1 -0
  3. package/dist/handler--FFBJMl6.js +153 -0
  4. package/dist/handler--FFBJMl6.js.map +1 -0
  5. package/dist/handler-0rPClEv4.js +663 -0
  6. package/dist/handler-0rPClEv4.js.map +1 -0
  7. package/dist/handler-COnCnprN.js +203 -0
  8. package/dist/handler-COnCnprN.js.map +1 -0
  9. package/dist/handler-ClQF4MOn.js +931 -0
  10. package/dist/handler-ClQF4MOn.js.map +1 -0
  11. package/dist/index.js +4988 -4830
  12. package/dist/index.js.map +1 -1
  13. package/dist/notifications.js +199 -134
  14. package/dist/notifications.js.map +1 -1
  15. package/dist/queryExecutor-Bol_iR8f.js +453 -0
  16. package/dist/queryExecutor-Bol_iR8f.js.map +1 -0
  17. package/dist/render_resend_false-MiC__Smr.js +6 -0
  18. package/dist/render_resend_false-MiC__Smr.js.map +1 -0
  19. package/dist/rts/index.d.ts +0 -1
  20. package/dist/rts/index.d.ts.map +1 -1
  21. package/dist/rts/index.js +1003 -842
  22. package/dist/rts/index.js.map +1 -1
  23. package/dist/schemas-Cjdjgehl.js +4225 -0
  24. package/dist/schemas-Cjdjgehl.js.map +1 -0
  25. package/dist/shared-nE84Or5W.js +111 -0
  26. package/dist/shared-nE84Or5W.js.map +1 -0
  27. package/dist/ssrMiddleware.d.ts +1 -1
  28. package/dist/uploads.js +99 -84
  29. package/dist/uploads.js.map +1 -1
  30. package/package.json +9 -9
  31. package/dist/email-H8nTAGxe.js +0 -12449
  32. package/dist/email-H8nTAGxe.js.map +0 -1
  33. package/dist/handler-BBzEodA0.js +0 -182
  34. package/dist/handler-BBzEodA0.js.map +0 -1
  35. package/dist/handler-BLwgdQv-.js +0 -544
  36. package/dist/handler-BLwgdQv-.js.map +0 -1
  37. package/dist/handler-CZD5p1Jv.js +0 -28
  38. package/dist/handler-CZD5p1Jv.js.map +0 -1
  39. package/dist/handler-Cq6MsoD4.js +0 -124
  40. package/dist/handler-Cq6MsoD4.js.map +0 -1
  41. package/dist/handler-DBtnVvP2.js +0 -756
  42. package/dist/handler-DBtnVvP2.js.map +0 -1
  43. package/dist/queryExecutor-JadZcQSQ.js +0 -318
  44. package/dist/queryExecutor-JadZcQSQ.js.map +0 -1
  45. package/dist/render_resend-DQANggpW.js +0 -7
  46. package/dist/render_resend-DQANggpW.js.map +0 -1
  47. package/dist/rts/api/cleanup/handler.d.ts +0 -9
  48. package/dist/rts/api/cleanup/handler.d.ts.map +0 -1
  49. package/dist/rts/api/cleanup/index.d.ts +0 -11
  50. package/dist/rts/api/cleanup/index.d.ts.map +0 -1
  51. package/dist/schemas-BR3K5Luo.js +0 -3824
  52. package/dist/schemas-BR3K5Luo.js.map +0 -1
  53. package/dist/shared-DhZ_rDdo.js +0 -87
  54. package/dist/shared-DhZ_rDdo.js.map +0 -1
@@ -1,124 +0,0 @@
1
- import { a as object, i as number, n as array, r as boolean, s as string, t as _enum } from "./schemas-BR3K5Luo.js";
2
- import { ZRBRtsChangeOp, models } from "@rpcbase/db";
3
- import { buildAbilityFromSession } from "@rpcbase/db/acl";
4
- //#region src/rts/api/changes/index.ts
5
- var Route = "/api/rb/rts/changes";
6
- var requestSchema = object({
7
- sinceSeq: number().int().min(0).default(0),
8
- limit: number().int().min(1).max(5e3).default(2e3),
9
- modelNames: array(string().min(1)).optional()
10
- });
11
- object({
12
- ok: boolean(),
13
- needsFullResync: boolean().optional(),
14
- earliestSeq: number().int().min(0).optional(),
15
- latestSeq: number().int().min(0),
16
- changes: array(object({
17
- seq: number().int().min(1),
18
- modelName: string().min(1),
19
- op: _enum(["delete", "reset_model"]),
20
- docId: string().optional()
21
- }))
22
- });
23
- //#endregion
24
- //#region src/rts/api/changes/handler.ts
25
- var getTenantId = (ctx) => {
26
- const raw = ctx.req.query?.["rb-tenant-id"];
27
- const queryTenantId = Array.isArray(raw) ? raw[0] : raw;
28
- if (typeof queryTenantId === "string" && queryTenantId.trim()) return queryTenantId.trim();
29
- const sessionTenantId = ctx.req.session?.user?.currentTenantId;
30
- if (typeof sessionTenantId === "string" && sessionTenantId.trim()) return sessionTenantId.trim();
31
- return null;
32
- };
33
- var ensureAuthorized = (ctx, tenantId) => {
34
- const userId = ctx.req.session?.user?.id;
35
- if (!userId) return null;
36
- const signedInTenants = ctx.req.session?.user?.signedInTenants;
37
- const currentTenantId = ctx.req.session?.user?.currentTenantId;
38
- const hasTenantAccessFromList = Array.isArray(signedInTenants) && signedInTenants.includes(tenantId);
39
- const normalizedCurrentTenantId = typeof currentTenantId === "string" ? currentTenantId.trim() : "";
40
- if (!hasTenantAccessFromList && !(Boolean(normalizedCurrentTenantId) && normalizedCurrentTenantId === tenantId)) return null;
41
- return userId;
42
- };
43
- var getModelCtx = (_ctx, tenantId) => ({ req: { session: { user: { currentTenantId: tenantId } } } });
44
- var isRtsChangeRecord = (value) => {
45
- if (!value || typeof value !== "object") return false;
46
- const obj = value;
47
- const isOp = ZRBRtsChangeOp.safeParse(obj.op).success;
48
- return typeof obj.seq === "number" && typeof obj.modelName === "string" && isOp;
49
- };
50
- var changesHandler = async (payload, ctx) => {
51
- const parsed = requestSchema.safeParse(payload ?? {});
52
- if (!parsed.success) {
53
- ctx.res.status(400);
54
- return {
55
- ok: false,
56
- latestSeq: 0,
57
- changes: []
58
- };
59
- }
60
- const tenantId = getTenantId(ctx);
61
- if (!tenantId) {
62
- ctx.res.status(400);
63
- return {
64
- ok: false,
65
- latestSeq: 0,
66
- changes: []
67
- };
68
- }
69
- if (!ensureAuthorized(ctx, tenantId)) {
70
- ctx.res.status(401);
71
- return {
72
- ok: false,
73
- latestSeq: 0,
74
- changes: []
75
- };
76
- }
77
- const ability = buildAbilityFromSession({
78
- tenantId,
79
- session: ctx.req.session
80
- });
81
- const modelCtx = getModelCtx(ctx, tenantId);
82
- const [RtsChange, RtsCounter] = await Promise.all([models.get("RBRtsChange", modelCtx), models.get("RBRtsCounter", modelCtx)]);
83
- const counter = await RtsCounter.findOne({ _id: "rts" }, { seq: 1 }).lean();
84
- const latestSeq = Number(counter?.seq ?? 0) || 0;
85
- const { sinceSeq, limit, modelNames } = parsed.data;
86
- const requestedModelNames = Array.isArray(modelNames) && modelNames.length ? modelNames.map((m) => String(m)).filter(Boolean) : null;
87
- const allowedModelNames = requestedModelNames ? requestedModelNames.filter((m) => ability.can("read", m)) : Array.from(new Set((await RtsChange.distinct("modelName")).map((m) => String(m)).filter(Boolean).filter((m) => ability.can("read", m))));
88
- let earliestSeq;
89
- if (allowedModelNames.length) {
90
- const earliest = await RtsChange.findOne({ modelName: { $in: allowedModelNames } }, { seq: 1 }).sort({ seq: 1 }).lean();
91
- earliestSeq = earliest?.seq ? Number(earliest.seq) : void 0;
92
- }
93
- const needsFullResync = typeof earliestSeq === "number" && sinceSeq < earliestSeq - 1;
94
- const selector = {
95
- seq: { $gt: sinceSeq },
96
- modelName: { $in: allowedModelNames }
97
- };
98
- const changes = await RtsChange.find(selector, {
99
- _id: 0,
100
- seq: 1,
101
- modelName: 1,
102
- op: 1,
103
- docId: 1
104
- }).sort({ seq: 1 }).limit(limit).lean();
105
- return {
106
- ok: true,
107
- needsFullResync: needsFullResync || void 0,
108
- earliestSeq,
109
- latestSeq,
110
- changes: Array.isArray(changes) ? changes.filter(isRtsChangeRecord).filter((c) => ability.can("read", c.modelName)).map((c) => ({
111
- seq: Number(c.seq),
112
- modelName: String(c.modelName),
113
- op: c.op,
114
- docId: c.docId ? String(c.docId) : void 0
115
- })) : []
116
- };
117
- };
118
- var handler_default = (api) => {
119
- api.post(Route, changesHandler);
120
- };
121
- //#endregion
122
- export { handler_default as default };
123
-
124
- //# sourceMappingURL=handler-Cq6MsoD4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler-Cq6MsoD4.js","names":["z","Route","requestSchema","object","sinceSeq","number","int","min","default","limit","max","modelNames","array","string","optional","RequestPayload","infer","responseSchema","ok","boolean","needsFullResync","earliestSeq","latestSeq","changes","seq","modelName","op","enum","docId","ResponsePayload","Api","ApiHandler","Ctx","models","ZRBRtsChangeOp","IRBRtsChange","IRBRtsCounter","LoadModelCtx","buildAbilityFromSession","AclSubjectType","Model","Changes","SessionUser","id","currentTenantId","signedInTenants","RtsCounterDoc","RtsChangeDoc","getTenantId","ctx","raw","req","query","queryTenantId","Array","isArray","trim","sessionTenantId","session","user","ensureAuthorized","tenantId","userId","hasTenantAccessFromList","includes","normalizedCurrentTenantId","hasTenantAccessFromCurrent","Boolean","getModelCtx","_ctx","isRtsChangeRecord","value","obj","Partial","isOp","safeParse","op","success","seq","modelName","changesHandler","RequestPayload","ResponsePayload","payload","Promise","parsed","requestSchema","res","status","ok","latestSeq","changes","ability","modelCtx","RtsChange","RtsCounter","all","get","counter","findOne","_id","lean","Number","sinceSeq","limit","modelNames","data","requestedModelNames","length","map","m","String","filter","allowedModelNames","can","from","Set","distinct","earliestSeq","earliest","$in","sort","undefined","needsFullResync","selector","Record","$gt","find","docId","c","api","post","Route"],"sources":["../src/rts/api/changes/index.ts","../src/rts/api/changes/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const Route = \"/api/rb/rts/changes\"\n\nexport const requestSchema = z.object({\n sinceSeq: z.number().int().min(0).default(0),\n limit: z.number().int().min(1).max(5000).default(2000),\n modelNames: z.array(z.string().min(1)).optional(),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n ok: z.boolean(),\n needsFullResync: z.boolean().optional(),\n earliestSeq: z.number().int().min(0).optional(),\n latestSeq: z.number().int().min(0),\n changes: z.array(z.object({\n seq: z.number().int().min(1),\n modelName: z.string().min(1),\n op: z.enum([\"delete\", \"reset_model\"]),\n docId: z.string().optional(),\n })),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n\n","import { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models, ZRBRtsChangeOp, type IRBRtsChange, type IRBRtsCounter, type LoadModelCtx } from \"@rpcbase/db\"\nimport { buildAbilityFromSession, type AclSubjectType } from \"@rpcbase/db/acl\"\nimport type { Model } from \"mongoose\"\n\nimport * as Changes from \"./index\"\n\n\ntype SessionUser = {\n id?: string\n currentTenantId?: string\n signedInTenants?: string[]\n}\n\ntype RtsCounterDoc = IRBRtsCounter\ntype RtsChangeDoc = IRBRtsChange\n\nconst getTenantId = (ctx: Ctx<SessionUser>): string | null => {\n const raw = ctx.req.query?.[\"rb-tenant-id\"]\n const queryTenantId = Array.isArray(raw) ? raw[0] : raw\n if (typeof queryTenantId === \"string\" && queryTenantId.trim()) return queryTenantId.trim()\n\n const sessionTenantId = ctx.req.session?.user?.currentTenantId\n if (typeof sessionTenantId === \"string\" && sessionTenantId.trim()) return sessionTenantId.trim()\n\n return null\n}\n\nconst ensureAuthorized = (ctx: Ctx<SessionUser>, tenantId: string): string | null => {\n const userId = ctx.req.session?.user?.id\n if (!userId) return null\n\n const signedInTenants = ctx.req.session?.user?.signedInTenants\n const currentTenantId = ctx.req.session?.user?.currentTenantId\n\n const hasTenantAccessFromList = Array.isArray(signedInTenants) && signedInTenants.includes(tenantId)\n\n const normalizedCurrentTenantId = typeof currentTenantId === \"string\" ? currentTenantId.trim() : \"\"\n const hasTenantAccessFromCurrent = Boolean(normalizedCurrentTenantId) && normalizedCurrentTenantId === tenantId\n\n if (!hasTenantAccessFromList && !hasTenantAccessFromCurrent) return null\n return userId\n}\n\nconst getModelCtx = (_ctx: Ctx<SessionUser>, tenantId: string): LoadModelCtx => ({\n req: {\n session: {\n user: {\n currentTenantId: tenantId,\n },\n },\n },\n})\n\nconst isRtsChangeRecord = (value: unknown): value is RtsChangeDoc => {\n if (!value || typeof value !== \"object\") return false\n const obj = value as Partial<RtsChangeDoc>\n const isOp = ZRBRtsChangeOp.safeParse(obj.op).success\n return typeof obj.seq === \"number\" && typeof obj.modelName === \"string\" && isOp\n}\n\nconst changesHandler: ApiHandler<Changes.RequestPayload, Changes.ResponsePayload, SessionUser> = async(\n payload,\n ctx,\n): Promise<Changes.ResponsePayload> => {\n const parsed = Changes.requestSchema.safeParse(payload ?? {})\n if (!parsed.success) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const tenantId = getTenantId(ctx)\n if (!tenantId) {\n ctx.res.status(400)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const userId = ensureAuthorized(ctx, tenantId)\n if (!userId) {\n ctx.res.status(401)\n return { ok: false, latestSeq: 0, changes: [] }\n }\n\n const ability = buildAbilityFromSession({ tenantId, session: ctx.req.session })\n\n const modelCtx = getModelCtx(ctx, tenantId)\n\n const [RtsChange, RtsCounter] = await Promise.all([\n models.get(\"RBRtsChange\", modelCtx) as Promise<Model<RtsChangeDoc>>,\n models.get(\"RBRtsCounter\", modelCtx) as Promise<Model<RtsCounterDoc>>,\n ])\n\n const counter = await RtsCounter.findOne({ _id: \"rts\" }, { seq: 1 }).lean()\n const latestSeq = Number(counter?.seq ?? 0) || 0\n\n const { sinceSeq, limit, modelNames } = parsed.data\n\n const requestedModelNames = Array.isArray(modelNames) && modelNames.length\n ? modelNames.map((m) => String(m)).filter(Boolean)\n : null\n\n const allowedModelNames = requestedModelNames\n ? requestedModelNames.filter((m) => ability.can(\"read\", m as AclSubjectType))\n : Array.from(\n new Set(\n (await RtsChange.distinct(\"modelName\"))\n .map((m) => String(m))\n .filter(Boolean)\n .filter((m) => ability.can(\"read\", m as AclSubjectType)),\n ),\n )\n\n let earliestSeq: number | undefined\n if (allowedModelNames.length) {\n const earliest = await RtsChange.findOne({ modelName: { $in: allowedModelNames } }, { seq: 1 }).sort({ seq: 1 }).lean()\n earliestSeq = earliest?.seq ? Number(earliest.seq) : undefined\n }\n\n const needsFullResync = typeof earliestSeq === \"number\" && sinceSeq < earliestSeq - 1\n\n const selector: Record<string, unknown> = { seq: { $gt: sinceSeq }, modelName: { $in: allowedModelNames } }\n\n const changes = await RtsChange\n .find(selector, { _id: 0, seq: 1, modelName: 1, op: 1, docId: 1 })\n .sort({ seq: 1 })\n .limit(limit)\n .lean()\n\n return {\n ok: true,\n needsFullResync: needsFullResync || undefined,\n earliestSeq,\n latestSeq,\n changes: Array.isArray(changes)\n ? changes\n .filter(isRtsChangeRecord)\n .filter((c) => ability.can(\"read\", c.modelName as AclSubjectType))\n .map((c) => ({\n seq: Number(c.seq),\n modelName: String(c.modelName),\n op: c.op,\n docId: c.docId ? String(c.docId) : undefined,\n }))\n : [],\n }\n}\n\nexport default (api: Api<SessionUser>) => {\n api.post(Changes.Route, changesHandler)\n}\n"],"mappings":"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"}