@m5kdev/backend 0.6.0 → 0.7.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 (45) hide show
  1. package/dist/src/modules/ai/ai.service.d.ts +11 -13
  2. package/dist/src/modules/ai/ai.service.js +6 -6
  3. package/dist/src/modules/ai/ai.trpc.d.ts +1 -1
  4. package/dist/src/modules/auth/auth.lib.d.ts +4 -8
  5. package/dist/src/modules/auth/auth.lib.js +2 -2
  6. package/dist/src/modules/auth/auth.service.d.ts +17 -47
  7. package/dist/src/modules/auth/auth.service.js +79 -66
  8. package/dist/src/modules/auth/auth.trpc.d.ts +1 -1
  9. package/dist/src/modules/base/base.actor.d.ts +68 -0
  10. package/dist/src/modules/base/base.actor.js +99 -0
  11. package/dist/src/modules/base/base.actor.test.d.ts +1 -0
  12. package/dist/src/modules/base/base.actor.test.js +58 -0
  13. package/dist/src/modules/base/base.grants.d.ts +3 -7
  14. package/dist/src/modules/base/base.grants.js +22 -10
  15. package/dist/src/modules/base/base.grants.test.js +16 -45
  16. package/dist/src/modules/base/base.procedure.d.ts +17 -20
  17. package/dist/src/modules/base/base.procedure.js +36 -24
  18. package/dist/src/modules/base/base.service.d.ts +7 -19
  19. package/dist/src/modules/base/base.service.js +19 -12
  20. package/dist/src/modules/base/base.service.test.js +89 -61
  21. package/dist/src/modules/billing/billing.service.d.ts +4 -25
  22. package/dist/src/modules/billing/billing.service.js +6 -6
  23. package/dist/src/modules/billing/billing.trpc.d.ts +2 -2
  24. package/dist/src/modules/billing/billing.trpc.js +4 -6
  25. package/dist/src/modules/connect/connect.service.d.ts +19 -11
  26. package/dist/src/modules/connect/connect.service.js +10 -8
  27. package/dist/src/modules/connect/connect.trpc.d.ts +2 -2
  28. package/dist/src/modules/recurrence/recurrence.service.d.ts +36 -6
  29. package/dist/src/modules/recurrence/recurrence.service.js +13 -10
  30. package/dist/src/modules/recurrence/recurrence.trpc.d.ts +1 -1
  31. package/dist/src/modules/social/social.service.d.ts +3 -4
  32. package/dist/src/modules/social/social.service.js +3 -3
  33. package/dist/src/modules/tag/tag.service.d.ts +16 -12
  34. package/dist/src/modules/tag/tag.service.js +4 -4
  35. package/dist/src/modules/tag/tag.trpc.d.ts +1 -1
  36. package/dist/src/modules/workflow/workflow.service.d.ts +48 -8
  37. package/dist/src/modules/workflow/workflow.service.js +6 -6
  38. package/dist/src/modules/workflow/workflow.trpc.d.ts +2 -2
  39. package/dist/src/types.d.ts +4 -4
  40. package/dist/src/utils/trpc.d.ts +31 -41
  41. package/dist/src/utils/trpc.js +95 -0
  42. package/dist/src/utils/trpc.test.d.ts +1 -0
  43. package/dist/src/utils/trpc.test.js +154 -0
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +3 -3
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const server_1 = require("@trpc/server");
4
+ const trpc_1 = require("./trpc");
5
+ jest.mock("better-auth/node", () => ({
6
+ fromNodeHeaders: (headers) => headers,
7
+ }));
8
+ function expectTRPCCode(fn, code) {
9
+ try {
10
+ fn();
11
+ throw new Error(`Expected TRPC error with code ${code}`);
12
+ }
13
+ catch (error) {
14
+ expect(error).toBeInstanceOf(server_1.TRPCError);
15
+ expect(error.code).toBe(code);
16
+ }
17
+ }
18
+ function createUser(overrides = {}) {
19
+ return {
20
+ id: "user-1",
21
+ role: "member",
22
+ email: "user@example.com",
23
+ emailVerified: true,
24
+ name: "User One",
25
+ createdAt: new Date(),
26
+ updatedAt: new Date(),
27
+ onboarding: null,
28
+ preferences: null,
29
+ flags: null,
30
+ stripeCustomerId: null,
31
+ paymentCustomerId: null,
32
+ paymentPlanTier: null,
33
+ paymentPlanExpiresAt: null,
34
+ ...overrides,
35
+ };
36
+ }
37
+ function createSession(overrides = {}) {
38
+ return {
39
+ id: "session-1",
40
+ userId: "user-1",
41
+ expiresAt: new Date(Date.now() + 60_000),
42
+ createdAt: new Date(),
43
+ updatedAt: new Date(),
44
+ token: "token",
45
+ ipAddress: null,
46
+ userAgent: null,
47
+ activeOrganizationId: null,
48
+ activeOrganizationRole: null,
49
+ activeTeamId: null,
50
+ activeTeamRole: null,
51
+ ...overrides,
52
+ };
53
+ }
54
+ function createRequestContext(overrides = {}) {
55
+ const user = overrides.user ?? createUser();
56
+ const session = overrides.session ?? createSession();
57
+ const actor = overrides.actor ??
58
+ (user && session
59
+ ? {
60
+ userId: user.id,
61
+ userRole: user.role,
62
+ organizationId: session.activeOrganizationId,
63
+ organizationRole: session.activeOrganizationRole,
64
+ teamId: session.activeTeamId,
65
+ teamRole: session.activeTeamRole,
66
+ }
67
+ : null);
68
+ return {
69
+ user,
70
+ session,
71
+ actor,
72
+ ...overrides,
73
+ };
74
+ }
75
+ describe("trpc auth helpers", () => {
76
+ it("stores a user-scoped actor on the request context while copying session ids", async () => {
77
+ const user = createUser();
78
+ const session = createSession({
79
+ activeOrganizationId: "org-1",
80
+ activeOrganizationRole: "owner",
81
+ activeTeamId: "team-1",
82
+ activeTeamRole: "manager",
83
+ });
84
+ const auth = {
85
+ api: {
86
+ getSession: jest.fn().mockResolvedValue({ user, session }),
87
+ },
88
+ };
89
+ const createContext = (0, trpc_1.createAuthContext)(auth);
90
+ const ctx = await createContext({
91
+ req: { headers: {} },
92
+ });
93
+ expect(ctx.actor).toEqual({
94
+ userId: "user-1",
95
+ userRole: "member",
96
+ organizationId: "org-1",
97
+ organizationRole: "owner",
98
+ teamId: "team-1",
99
+ teamRole: "manager",
100
+ });
101
+ });
102
+ it("throws FORBIDDEN when a broader actor scope is required than the session allows", () => {
103
+ const actor = (0, trpc_1.requireRequestActor)(createRequestContext({
104
+ user: createUser(),
105
+ session: createSession(),
106
+ actor: {
107
+ userId: "user-1",
108
+ userRole: "member",
109
+ organizationId: null,
110
+ organizationRole: null,
111
+ teamId: null,
112
+ teamRole: null,
113
+ },
114
+ }));
115
+ expect(actor.userId).toBe("user-1");
116
+ expectTRPCCode(() => (0, trpc_1.requireRequestActor)(createRequestContext({
117
+ user: createUser(),
118
+ session: createSession(),
119
+ actor: {
120
+ userId: "user-1",
121
+ userRole: "member",
122
+ organizationId: null,
123
+ organizationRole: null,
124
+ teamId: null,
125
+ teamRole: null,
126
+ },
127
+ }), "organization"), "FORBIDDEN");
128
+ });
129
+ it("throws UNAUTHORIZED when request user access is missing", () => {
130
+ expectTRPCCode(() => (0, trpc_1.requireRequestUser)({
131
+ user: null,
132
+ session: null,
133
+ actor: null,
134
+ }), "UNAUTHORIZED");
135
+ });
136
+ it("verifies admin access from the raw request user", () => {
137
+ const ctx = createRequestContext({
138
+ user: createUser({ role: "admin" }),
139
+ actor: {
140
+ userId: "user-1",
141
+ userRole: "admin",
142
+ organizationId: "org-1",
143
+ organizationRole: "owner",
144
+ teamId: null,
145
+ teamRole: null,
146
+ },
147
+ });
148
+ expect((0, trpc_1.verifyAdminProcedureContext)(ctx).user.role).toBe("admin");
149
+ expectTRPCCode(() => (0, trpc_1.verifyAdminProcedureContext)(createRequestContext({
150
+ user: createUser({ role: "member" }),
151
+ actor: ctx.actor,
152
+ })), "FORBIDDEN");
153
+ });
154
+ });