@chaaskit/server 0.1.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 (189) hide show
  1. package/dist/api/admin.js +438 -0
  2. package/dist/api/admin.js.map +1 -0
  3. package/dist/api/agents.js +21 -0
  4. package/dist/api/agents.js.map +1 -0
  5. package/dist/api/api-keys.js +122 -0
  6. package/dist/api/api-keys.js.map +1 -0
  7. package/dist/api/auth.js +399 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/chat.js +900 -0
  10. package/dist/api/chat.js.map +1 -0
  11. package/dist/api/config.js +91 -0
  12. package/dist/api/config.js.map +1 -0
  13. package/dist/api/documents.js +237 -0
  14. package/dist/api/documents.js.map +1 -0
  15. package/dist/api/export.js +107 -0
  16. package/dist/api/export.js.map +1 -0
  17. package/dist/api/health.js +25 -0
  18. package/dist/api/health.js.map +1 -0
  19. package/dist/api/mcp-server.js +84 -0
  20. package/dist/api/mcp-server.js.map +1 -0
  21. package/dist/api/mcp.js +400 -0
  22. package/dist/api/mcp.js.map +1 -0
  23. package/dist/api/mentions.js +94 -0
  24. package/dist/api/mentions.js.map +1 -0
  25. package/dist/api/oauth.js +366 -0
  26. package/dist/api/oauth.js.map +1 -0
  27. package/dist/api/payments.js +473 -0
  28. package/dist/api/payments.js.map +1 -0
  29. package/dist/api/projects.js +301 -0
  30. package/dist/api/projects.js.map +1 -0
  31. package/dist/api/scheduled-prompts.js +617 -0
  32. package/dist/api/scheduled-prompts.js.map +1 -0
  33. package/dist/api/search.js +85 -0
  34. package/dist/api/search.js.map +1 -0
  35. package/dist/api/share.js +188 -0
  36. package/dist/api/share.js.map +1 -0
  37. package/dist/api/slack.js +468 -0
  38. package/dist/api/slack.js.map +1 -0
  39. package/dist/api/teams.js +693 -0
  40. package/dist/api/teams.js.map +1 -0
  41. package/dist/api/templates.js +134 -0
  42. package/dist/api/templates.js.map +1 -0
  43. package/dist/api/threads.js +323 -0
  44. package/dist/api/threads.js.map +1 -0
  45. package/dist/api/upload.js +57 -0
  46. package/dist/api/upload.js.map +1 -0
  47. package/dist/api/user.js +111 -0
  48. package/dist/api/user.js.map +1 -0
  49. package/dist/api/v1/openai.js +245 -0
  50. package/dist/api/v1/openai.js.map +1 -0
  51. package/dist/app.js +168 -0
  52. package/dist/app.js.map +1 -0
  53. package/dist/bin/cli.js +57 -0
  54. package/dist/bin/cli.js.map +1 -0
  55. package/dist/commands/db-sync.js +108 -0
  56. package/dist/commands/db-sync.js.map +1 -0
  57. package/dist/config/loader.js +374 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/documents/extractors.js +136 -0
  60. package/dist/documents/extractors.js.map +1 -0
  61. package/dist/extensions/glob.js +53 -0
  62. package/dist/extensions/glob.js.map +1 -0
  63. package/dist/extensions/loader.js +72 -0
  64. package/dist/extensions/loader.js.map +1 -0
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/loaders/index.js +75 -0
  68. package/dist/loaders/index.js.map +1 -0
  69. package/dist/mcp/client.js +551 -0
  70. package/dist/mcp/client.js.map +1 -0
  71. package/dist/mcp/server.js +335 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/middleware/apiKeyAuth.js +136 -0
  74. package/dist/middleware/apiKeyAuth.js.map +1 -0
  75. package/dist/middleware/auth.js +192 -0
  76. package/dist/middleware/auth.js.map +1 -0
  77. package/dist/middleware/errorHandler.js +41 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/mcpServerAuth.js +164 -0
  80. package/dist/middleware/mcpServerAuth.js.map +1 -0
  81. package/dist/middleware/requestLogger.js +9 -0
  82. package/dist/middleware/requestLogger.js.map +1 -0
  83. package/dist/middleware/team.js +132 -0
  84. package/dist/middleware/team.js.map +1 -0
  85. package/dist/oauth/server.js +410 -0
  86. package/dist/oauth/server.js.map +1 -0
  87. package/dist/queue/cli.js +93 -0
  88. package/dist/queue/cli.js.map +1 -0
  89. package/dist/queue/handlers/index.js +91 -0
  90. package/dist/queue/handlers/index.js.map +1 -0
  91. package/dist/queue/handlers/scheduled-prompt.js +270 -0
  92. package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
  93. package/dist/queue/index.js +91 -0
  94. package/dist/queue/index.js.map +1 -0
  95. package/dist/queue/providers/memory.js +296 -0
  96. package/dist/queue/providers/memory.js.map +1 -0
  97. package/dist/queue/providers/sqs.js +275 -0
  98. package/dist/queue/providers/sqs.js.map +1 -0
  99. package/dist/queue/scheduler.js +355 -0
  100. package/dist/queue/scheduler.js.map +1 -0
  101. package/dist/queue/types.js +5 -0
  102. package/dist/queue/types.js.map +1 -0
  103. package/dist/queue/worker.js +230 -0
  104. package/dist/queue/worker.js.map +1 -0
  105. package/dist/registry/index.js +40 -0
  106. package/dist/registry/index.js.map +1 -0
  107. package/dist/server.js +207 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/services/agent.js +530 -0
  110. package/dist/services/agent.js.map +1 -0
  111. package/dist/services/agents.js +194 -0
  112. package/dist/services/agents.js.map +1 -0
  113. package/dist/services/documents.js +507 -0
  114. package/dist/services/documents.js.map +1 -0
  115. package/dist/services/email/index.js +91 -0
  116. package/dist/services/email/index.js.map +1 -0
  117. package/dist/services/email/providers/ses.js +97 -0
  118. package/dist/services/email/providers/ses.js.map +1 -0
  119. package/dist/services/email/templates.js +194 -0
  120. package/dist/services/email/templates.js.map +1 -0
  121. package/dist/services/email/types.js +5 -0
  122. package/dist/services/email/types.js.map +1 -0
  123. package/dist/services/encryption.js +69 -0
  124. package/dist/services/encryption.js.map +1 -0
  125. package/dist/services/oauth-discovery.js +226 -0
  126. package/dist/services/oauth-discovery.js.map +1 -0
  127. package/dist/services/pendingConfirmation.js +105 -0
  128. package/dist/services/pendingConfirmation.js.map +1 -0
  129. package/dist/services/scheduledPrompts.js +70 -0
  130. package/dist/services/scheduledPrompts.js.map +1 -0
  131. package/dist/services/slack/client.js +174 -0
  132. package/dist/services/slack/client.js.map +1 -0
  133. package/dist/services/slack/events.js +189 -0
  134. package/dist/services/slack/events.js.map +1 -0
  135. package/dist/services/slack/index.js +6 -0
  136. package/dist/services/slack/index.js.map +1 -0
  137. package/dist/services/slack/notifications.js +124 -0
  138. package/dist/services/slack/notifications.js.map +1 -0
  139. package/dist/services/slack/signature.js +74 -0
  140. package/dist/services/slack/signature.js.map +1 -0
  141. package/dist/services/slack/thread-context.js +191 -0
  142. package/dist/services/slack/thread-context.js.map +1 -0
  143. package/dist/services/toolConfirmation.js +55 -0
  144. package/dist/services/toolConfirmation.js.map +1 -0
  145. package/dist/services/usage.js +241 -0
  146. package/dist/services/usage.js.map +1 -0
  147. package/dist/ssr/build.js +90 -0
  148. package/dist/ssr/build.js.map +1 -0
  149. package/dist/ssr/components/SSRMessageList.js +120 -0
  150. package/dist/ssr/components/SSRMessageList.js.map +1 -0
  151. package/dist/ssr/entry.client.js +8 -0
  152. package/dist/ssr/entry.client.js.map +1 -0
  153. package/dist/ssr/entry.server.js +71 -0
  154. package/dist/ssr/entry.server.js.map +1 -0
  155. package/dist/ssr/handler.js +51 -0
  156. package/dist/ssr/handler.js.map +1 -0
  157. package/dist/ssr/root.js +184 -0
  158. package/dist/ssr/root.js.map +1 -0
  159. package/dist/ssr/routes/login.js +140 -0
  160. package/dist/ssr/routes/login.js.map +1 -0
  161. package/dist/ssr/routes/pricing.js +195 -0
  162. package/dist/ssr/routes/pricing.js.map +1 -0
  163. package/dist/ssr/routes/privacy.js +39 -0
  164. package/dist/ssr/routes/privacy.js.map +1 -0
  165. package/dist/ssr/routes/register.js +148 -0
  166. package/dist/ssr/routes/register.js.map +1 -0
  167. package/dist/ssr/routes/shared.$shareId.js +153 -0
  168. package/dist/ssr/routes/shared.$shareId.js.map +1 -0
  169. package/dist/ssr/routes/terms.js +39 -0
  170. package/dist/ssr/routes/terms.js.map +1 -0
  171. package/dist/storage/index.js +43 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/providers/database.js +38 -0
  174. package/dist/storage/providers/database.js.map +1 -0
  175. package/dist/storage/providers/filesystem.js +51 -0
  176. package/dist/storage/providers/filesystem.js.map +1 -0
  177. package/dist/storage/types.js +2 -0
  178. package/dist/storage/types.js.map +1 -0
  179. package/dist/tools/documents.js +336 -0
  180. package/dist/tools/documents.js.map +1 -0
  181. package/dist/tools/get-plan-usage.js +82 -0
  182. package/dist/tools/get-plan-usage.js.map +1 -0
  183. package/dist/tools/index.js +106 -0
  184. package/dist/tools/index.js.map +1 -0
  185. package/dist/tools/types.js +2 -0
  186. package/dist/tools/types.js.map +1 -0
  187. package/dist/tools/web-scrape.js +145 -0
  188. package/dist/tools/web-scrape.js.map +1 -0
  189. package/package.json +93 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { ZodError } from 'zod';
2
+ import { HTTP_STATUS } from '@chaaskit/shared';
3
+ export class AppError extends Error {
4
+ statusCode;
5
+ code;
6
+ constructor(statusCode, message, code) {
7
+ super(message);
8
+ this.statusCode = statusCode;
9
+ this.code = code;
10
+ this.name = 'AppError';
11
+ }
12
+ }
13
+ export function errorHandler(err, req, res, _next) {
14
+ console.error('Error:', err);
15
+ if (err instanceof AppError) {
16
+ res.status(err.statusCode).json({
17
+ error: {
18
+ message: err.message,
19
+ code: err.code,
20
+ },
21
+ });
22
+ return;
23
+ }
24
+ if (err instanceof ZodError) {
25
+ res.status(HTTP_STATUS.BAD_REQUEST).json({
26
+ error: {
27
+ message: 'Validation error',
28
+ code: 'VALIDATION_ERROR',
29
+ details: err.errors,
30
+ },
31
+ });
32
+ return;
33
+ }
34
+ res.status(HTTP_STATUS.INTERNAL_SERVER_ERROR).json({
35
+ error: {
36
+ message: 'Internal server error',
37
+ code: 'INTERNAL_ERROR',
38
+ },
39
+ });
40
+ }
41
+ //# sourceMappingURL=errorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IAEA;IAHT,YACS,UAAkB,EACzB,OAAe,EACR,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,eAAU,GAAV,UAAU,CAAQ;QAElB,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAC1B,GAAU,EACV,GAAY,EACZ,GAAa,EACb,KAAmB;IAEnB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE7B,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC9B,KAAK,EAAE;gBACL,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;aACf;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;YACvC,KAAK,EAAE;gBACL,OAAO,EAAE,kBAAkB;gBAC3B,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,GAAG,CAAC,MAAM;aACpB;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC;QACjD,KAAK,EAAE;YACL,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,gBAAgB;SACvB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * MCP Server Authentication Middleware
3
+ *
4
+ * Authenticates requests to the MCP server endpoint using:
5
+ * 1. API keys (Bearer token matching API key format)
6
+ * 2. OAuth tokens (Phase 2 - to be added)
7
+ *
8
+ * Returns 401 with WWW-Authenticate header if not authorized.
9
+ */
10
+ import bcrypt from 'bcryptjs';
11
+ import { db } from '@chaaskit/db';
12
+ import { HTTP_STATUS } from '@chaaskit/shared';
13
+ import { getConfig } from '../config/loader.js';
14
+ /**
15
+ * Build the OAuth authorization server URL for WWW-Authenticate header
16
+ */
17
+ function getAuthorizationServerUrl() {
18
+ const apiUrl = process.env.API_URL || 'http://localhost:3000';
19
+ return `${apiUrl}/.well-known/oauth-authorization-server`;
20
+ }
21
+ /**
22
+ * Validate an API key and return user info if valid
23
+ */
24
+ async function validateApiKey(apiKey) {
25
+ const config = getConfig();
26
+ const keyPrefix = config.api?.keyPrefix || 'sk-';
27
+ // Check if it looks like our API key format
28
+ if (!apiKey.startsWith(keyPrefix)) {
29
+ return null;
30
+ }
31
+ // Find keys by prefix and check hash
32
+ const storedPrefixLength = keyPrefix.length + 6;
33
+ const searchPrefix = apiKey.slice(0, storedPrefixLength);
34
+ const candidates = await db.apiKey.findMany({
35
+ where: { keyPrefix: searchPrefix },
36
+ select: {
37
+ id: true,
38
+ keyHash: true,
39
+ userId: true,
40
+ teamId: true,
41
+ expiresAt: true,
42
+ },
43
+ });
44
+ for (const candidate of candidates) {
45
+ if (await bcrypt.compare(apiKey, candidate.keyHash)) {
46
+ // Check expiration
47
+ if (candidate.expiresAt && candidate.expiresAt < new Date()) {
48
+ return null;
49
+ }
50
+ // If team-scoped, verify user is still a member
51
+ if (candidate.teamId) {
52
+ const membership = await db.teamMember.findFirst({
53
+ where: { userId: candidate.userId, teamId: candidate.teamId },
54
+ });
55
+ if (!membership) {
56
+ return null;
57
+ }
58
+ }
59
+ // Update lastUsedAt (fire and forget)
60
+ db.apiKey
61
+ .update({
62
+ where: { id: candidate.id },
63
+ data: { lastUsedAt: new Date() },
64
+ })
65
+ .catch(() => { });
66
+ return {
67
+ userId: candidate.userId,
68
+ teamId: candidate.teamId || undefined,
69
+ };
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ /**
75
+ * Validate an OAuth access token and return user info if valid
76
+ */
77
+ async function validateOAuthToken(token) {
78
+ // Hash the token to look it up
79
+ const crypto = await import('crypto');
80
+ const tokenHash = crypto.createHash('sha256').update(token).digest('hex');
81
+ const oauthToken = await db.oAuthToken.findUnique({
82
+ where: { tokenHash },
83
+ select: {
84
+ id: true,
85
+ userId: true,
86
+ expiresAt: true,
87
+ revokedAt: true,
88
+ client: {
89
+ select: {
90
+ isActive: true,
91
+ },
92
+ },
93
+ },
94
+ });
95
+ if (!oauthToken) {
96
+ return null;
97
+ }
98
+ // Check if token is expired
99
+ if (oauthToken.expiresAt < new Date()) {
100
+ return null;
101
+ }
102
+ // Check if token is revoked
103
+ if (oauthToken.revokedAt) {
104
+ return null;
105
+ }
106
+ // Check if client is still active
107
+ if (!oauthToken.client.isActive) {
108
+ return null;
109
+ }
110
+ return {
111
+ userId: oauthToken.userId,
112
+ };
113
+ }
114
+ /**
115
+ * MCP Server Authentication Middleware
116
+ *
117
+ * Checks for Bearer token in Authorization header and validates it as either
118
+ * an API key or OAuth access token.
119
+ */
120
+ export async function mcpServerAuth(req, res, next) {
121
+ const config = getConfig();
122
+ const serverConfig = config.mcp?.server;
123
+ // Check if MCP server is enabled
124
+ if (!serverConfig?.enabled) {
125
+ res.status(HTTP_STATUS.NOT_FOUND).json({
126
+ error: 'MCP server is not enabled',
127
+ });
128
+ return;
129
+ }
130
+ const authHeader = req.headers.authorization;
131
+ if (!authHeader?.startsWith('Bearer ')) {
132
+ // No auth provided - return 401 with WWW-Authenticate
133
+ res.status(HTTP_STATUS.UNAUTHORIZED);
134
+ res.setHeader('WWW-Authenticate', `Bearer resource_metadata="${getAuthorizationServerUrl()}"`);
135
+ res.json({
136
+ error: 'unauthorized',
137
+ error_description: 'Bearer token required',
138
+ });
139
+ return;
140
+ }
141
+ const token = authHeader.slice(7); // Remove "Bearer "
142
+ // Try API key validation first
143
+ const apiKeyResult = await validateApiKey(token);
144
+ if (apiKeyResult) {
145
+ req.mcpContext = apiKeyResult;
146
+ return next();
147
+ }
148
+ // Try OAuth token validation if OAuth is enabled
149
+ if (serverConfig.oauth?.enabled) {
150
+ const oauthResult = await validateOAuthToken(token);
151
+ if (oauthResult) {
152
+ req.mcpContext = oauthResult;
153
+ return next();
154
+ }
155
+ }
156
+ // No valid token found
157
+ res.status(HTTP_STATUS.UNAUTHORIZED);
158
+ res.setHeader('WWW-Authenticate', `Bearer resource_metadata="${getAuthorizationServerUrl()}", error="invalid_token"`);
159
+ res.json({
160
+ error: 'invalid_token',
161
+ error_description: 'The access token is invalid or expired',
162
+ });
163
+ }
164
+ //# sourceMappingURL=mcpServerAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServerAuth.js","sourceRoot":"","sources":["../../src/middleware/mcpServerAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export function requestLogger(req, res, next) {
2
+ const start = Date.now();
3
+ res.on('finish', () => {
4
+ const duration = Date.now() - start;
5
+ console.log(`${req.method} ${req.path} ${res.statusCode} ${duration}ms`);
6
+ });
7
+ next();
8
+ }
9
+ //# sourceMappingURL=requestLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLogger.js","sourceRoot":"","sources":["../../src/middleware/requestLogger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACpC,OAAO,CAAC,GAAG,CACT,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,UAAU,IAAI,QAAQ,IAAI,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,132 @@
1
+ import { db } from '@chaaskit/db';
2
+ import { AppError } from './errorHandler.js';
3
+ import { HTTP_STATUS } from '@chaaskit/shared';
4
+ const ROLE_HIERARCHY = {
5
+ owner: 4,
6
+ admin: 3,
7
+ member: 2,
8
+ viewer: 1,
9
+ };
10
+ /**
11
+ * Middleware factory that requires the user to have at least the specified role in a team.
12
+ * Expects teamId to be in req.params.teamId
13
+ */
14
+ export function requireTeamRole(minRole) {
15
+ return async (req, res, next) => {
16
+ try {
17
+ if (!req.user) {
18
+ throw new AppError(HTTP_STATUS.UNAUTHORIZED, 'Authentication required');
19
+ }
20
+ const teamId = req.params.teamId;
21
+ if (!teamId) {
22
+ throw new AppError(HTTP_STATUS.BAD_REQUEST, 'Team ID is required');
23
+ }
24
+ // Check if team exists and is not archived
25
+ const team = await db.team.findUnique({
26
+ where: { id: teamId },
27
+ select: { id: true, archivedAt: true },
28
+ });
29
+ if (!team) {
30
+ throw new AppError(HTTP_STATUS.NOT_FOUND, 'Team not found');
31
+ }
32
+ if (team.archivedAt) {
33
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'Team is archived');
34
+ }
35
+ // Get user's membership in this team
36
+ const membership = await db.teamMember.findUnique({
37
+ where: {
38
+ teamId_userId: {
39
+ teamId,
40
+ userId: req.user.id,
41
+ },
42
+ },
43
+ include: {
44
+ user: {
45
+ select: {
46
+ id: true,
47
+ email: true,
48
+ name: true,
49
+ avatarUrl: true,
50
+ },
51
+ },
52
+ },
53
+ });
54
+ if (!membership) {
55
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'You are not a member of this team');
56
+ }
57
+ const userRoleLevel = ROLE_HIERARCHY[membership.role] || 0;
58
+ const requiredRoleLevel = ROLE_HIERARCHY[minRole];
59
+ if (userRoleLevel < requiredRoleLevel) {
60
+ throw new AppError(HTTP_STATUS.FORBIDDEN, `This action requires at least ${minRole} role`);
61
+ }
62
+ req.teamMember = {
63
+ id: membership.id,
64
+ teamId: membership.teamId,
65
+ userId: membership.userId,
66
+ role: membership.role,
67
+ createdAt: membership.createdAt,
68
+ user: membership.user,
69
+ };
70
+ next();
71
+ }
72
+ catch (error) {
73
+ if (error instanceof AppError) {
74
+ next(error);
75
+ return;
76
+ }
77
+ next(new AppError(HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Team authorization failed'));
78
+ }
79
+ };
80
+ }
81
+ /**
82
+ * Middleware to verify user has access to a team thread.
83
+ * Expects threadId to be in req.params.threadId or req.body.threadId
84
+ */
85
+ export async function requireTeamThreadAccess(req, res, next) {
86
+ try {
87
+ if (!req.user) {
88
+ throw new AppError(HTTP_STATUS.UNAUTHORIZED, 'Authentication required');
89
+ }
90
+ const threadId = req.params.threadId || req.body.threadId;
91
+ if (!threadId) {
92
+ next();
93
+ return;
94
+ }
95
+ const thread = await db.thread.findUnique({
96
+ where: { id: threadId },
97
+ select: { id: true, teamId: true, userId: true },
98
+ });
99
+ if (!thread) {
100
+ throw new AppError(HTTP_STATUS.NOT_FOUND, 'Thread not found');
101
+ }
102
+ // If it's a personal thread, check ownership
103
+ if (!thread.teamId) {
104
+ if (thread.userId !== req.user.id) {
105
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'You do not have access to this thread');
106
+ }
107
+ next();
108
+ return;
109
+ }
110
+ // If it's a team thread, check membership
111
+ const membership = await db.teamMember.findUnique({
112
+ where: {
113
+ teamId_userId: {
114
+ teamId: thread.teamId,
115
+ userId: req.user.id,
116
+ },
117
+ },
118
+ });
119
+ if (!membership) {
120
+ throw new AppError(HTTP_STATUS.FORBIDDEN, 'You do not have access to this team thread');
121
+ }
122
+ next();
123
+ }
124
+ catch (error) {
125
+ if (error instanceof AppError) {
126
+ next(error);
127
+ return;
128
+ }
129
+ next(new AppError(HTTP_STATUS.INTERNAL_SERVER_ERROR, 'Thread authorization failed'));
130
+ }
131
+ }
132
+ //# sourceMappingURL=team.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/middleware/team.ts"],"names":[],"mappings":"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"}