@meridianjs/meridian 2.5.0 → 2.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 (266) hide show
  1. package/dist/api/admin/api-tokens/[id]/route.d.ts +3 -0
  2. package/dist/api/admin/api-tokens/[id]/route.d.ts.map +1 -0
  3. package/dist/api/admin/api-tokens/[id]/route.js +20 -0
  4. package/dist/api/admin/api-tokens/[id]/route.js.map +1 -0
  5. package/dist/api/admin/api-tokens/route.d.ts +15 -0
  6. package/dist/api/admin/api-tokens/route.d.ts.map +1 -0
  7. package/dist/api/admin/api-tokens/route.js +63 -0
  8. package/dist/api/admin/api-tokens/route.js.map +1 -0
  9. package/dist/api/admin/issues/[id]/activities/route.d.ts.map +1 -1
  10. package/dist/api/admin/issues/[id]/activities/route.js +4 -15
  11. package/dist/api/admin/issues/[id]/activities/route.js.map +1 -1
  12. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -1
  13. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +6 -1
  14. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -1
  15. package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -1
  16. package/dist/api/admin/issues/[id]/attachments/route.js +2 -19
  17. package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -1
  18. package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -1
  19. package/dist/api/admin/issues/[id]/comments/route.js +4 -20
  20. package/dist/api/admin/issues/[id]/comments/route.js.map +1 -1
  21. package/dist/api/admin/issues/[id]/related/route.d.ts.map +1 -1
  22. package/dist/api/admin/issues/[id]/related/route.js +4 -5
  23. package/dist/api/admin/issues/[id]/related/route.js.map +1 -1
  24. package/dist/api/admin/issues/[id]/relations/route.d.ts.map +1 -1
  25. package/dist/api/admin/issues/[id]/relations/route.js +4 -5
  26. package/dist/api/admin/issues/[id]/relations/route.js.map +1 -1
  27. package/dist/api/admin/issues/[id]/route.d.ts.map +1 -1
  28. package/dist/api/admin/issues/[id]/route.js +12 -12
  29. package/dist/api/admin/issues/[id]/route.js.map +1 -1
  30. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -1
  31. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +7 -2
  32. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -1
  33. package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -1
  34. package/dist/api/admin/issues/[id]/time-logs/route.js +1 -18
  35. package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -1
  36. package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -1
  37. package/dist/api/admin/issues/[id]/time-logs/timer/route.js +1 -18
  38. package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -1
  39. package/dist/api/admin/issues/route.d.ts.map +1 -1
  40. package/dist/api/admin/issues/route.js +20 -4
  41. package/dist/api/admin/issues/route.js.map +1 -1
  42. package/dist/api/admin/my/tasks/route.d.ts.map +1 -1
  43. package/dist/api/admin/my/tasks/route.js +22 -5
  44. package/dist/api/admin/my/tasks/route.js.map +1 -1
  45. package/dist/api/admin/org/calendar/route.d.ts.map +1 -1
  46. package/dist/api/admin/org/calendar/route.js +2 -1
  47. package/dist/api/admin/org/calendar/route.js.map +1 -1
  48. package/dist/api/admin/org/holidays/[holidayId]/route.d.ts.map +1 -1
  49. package/dist/api/admin/org/holidays/[holidayId]/route.js +3 -2
  50. package/dist/api/admin/org/holidays/[holidayId]/route.js.map +1 -1
  51. package/dist/api/admin/org/holidays/route.d.ts.map +1 -1
  52. package/dist/api/admin/org/holidays/route.js +2 -1
  53. package/dist/api/admin/org/holidays/route.js.map +1 -1
  54. package/dist/api/admin/projects/[id]/access/route.d.ts.map +1 -1
  55. package/dist/api/admin/projects/[id]/access/route.js +14 -11
  56. package/dist/api/admin/projects/[id]/access/route.js.map +1 -1
  57. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts.map +1 -1
  58. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js +3 -2
  59. package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js.map +1 -1
  60. package/dist/api/admin/projects/[id]/access-requests/route.d.ts.map +1 -1
  61. package/dist/api/admin/projects/[id]/access-requests/route.js +18 -19
  62. package/dist/api/admin/projects/[id]/access-requests/route.js.map +1 -1
  63. package/dist/api/admin/projects/[id]/activities/route.js +1 -1
  64. package/dist/api/admin/projects/[id]/activities/route.js.map +1 -1
  65. package/dist/api/admin/projects/[id]/health/[updateId]/route.d.ts.map +1 -1
  66. package/dist/api/admin/projects/[id]/health/[updateId]/route.js +3 -3
  67. package/dist/api/admin/projects/[id]/health/[updateId]/route.js.map +1 -1
  68. package/dist/api/admin/projects/[id]/health/route.d.ts.map +1 -1
  69. package/dist/api/admin/projects/[id]/health/route.js +3 -3
  70. package/dist/api/admin/projects/[id]/health/route.js.map +1 -1
  71. package/dist/api/admin/projects/[id]/members/batch/route.d.ts.map +1 -1
  72. package/dist/api/admin/projects/[id]/members/batch/route.js +3 -2
  73. package/dist/api/admin/projects/[id]/members/batch/route.js.map +1 -1
  74. package/dist/api/admin/projects/[id]/members/route.d.ts.map +1 -1
  75. package/dist/api/admin/projects/[id]/members/route.js +4 -3
  76. package/dist/api/admin/projects/[id]/members/route.js.map +1 -1
  77. package/dist/api/admin/projects/[id]/share/route.d.ts.map +1 -1
  78. package/dist/api/admin/projects/[id]/share/route.js +5 -4
  79. package/dist/api/admin/projects/[id]/share/route.js.map +1 -1
  80. package/dist/api/admin/projects/[id]/statuses/route.js +1 -1
  81. package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -1
  82. package/dist/api/admin/projects/by-identifier/[identifier]/access-requests/route.d.ts.map +1 -1
  83. package/dist/api/admin/projects/by-identifier/[identifier]/access-requests/route.js +4 -3
  84. package/dist/api/admin/projects/by-identifier/[identifier]/access-requests/route.js.map +1 -1
  85. package/dist/api/admin/projects/route.d.ts.map +1 -1
  86. package/dist/api/admin/projects/route.js +7 -5
  87. package/dist/api/admin/projects/route.js.map +1 -1
  88. package/dist/api/admin/reporting/members/route.d.ts.map +1 -1
  89. package/dist/api/admin/reporting/members/route.js +6 -5
  90. package/dist/api/admin/reporting/members/route.js.map +1 -1
  91. package/dist/api/admin/reporting/time-logs/route.d.ts.map +1 -1
  92. package/dist/api/admin/reporting/time-logs/route.js +31 -9
  93. package/dist/api/admin/reporting/time-logs/route.js.map +1 -1
  94. package/dist/api/admin/team/tasks/route.d.ts +3 -0
  95. package/dist/api/admin/team/tasks/route.d.ts.map +1 -0
  96. package/dist/api/admin/team/tasks/route.js +155 -0
  97. package/dist/api/admin/team/tasks/route.js.map +1 -0
  98. package/dist/api/admin/users/[id]/reactivate/route.d.ts.map +1 -1
  99. package/dist/api/admin/users/[id]/reactivate/route.js +2 -1
  100. package/dist/api/admin/users/[id]/reactivate/route.js.map +1 -1
  101. package/dist/api/admin/users/[id]/route.d.ts.map +1 -1
  102. package/dist/api/admin/users/[id]/route.js +6 -5
  103. package/dist/api/admin/users/[id]/route.js.map +1 -1
  104. package/dist/api/admin/users/[id]/sessions/route.d.ts.map +1 -1
  105. package/dist/api/admin/users/[id]/sessions/route.js +6 -5
  106. package/dist/api/admin/users/[id]/sessions/route.js.map +1 -1
  107. package/dist/api/admin/users/invitations/[inviteId]/resend/route.d.ts.map +1 -1
  108. package/dist/api/admin/users/invitations/[inviteId]/resend/route.js +3 -2
  109. package/dist/api/admin/users/invitations/[inviteId]/resend/route.js.map +1 -1
  110. package/dist/api/admin/users/invitations/[inviteId]/route.d.ts.map +1 -1
  111. package/dist/api/admin/users/invitations/[inviteId]/route.js +2 -1
  112. package/dist/api/admin/users/invitations/[inviteId]/route.js.map +1 -1
  113. package/dist/api/admin/users/invitations/route.d.ts.map +1 -1
  114. package/dist/api/admin/users/invitations/route.js +2 -1
  115. package/dist/api/admin/users/invitations/route.js.map +1 -1
  116. package/dist/api/admin/users/invite/route.d.ts.map +1 -1
  117. package/dist/api/admin/users/invite/route.js +5 -4
  118. package/dist/api/admin/users/invite/route.js.map +1 -1
  119. package/dist/api/admin/users/map/route.d.ts.map +1 -1
  120. package/dist/api/admin/users/map/route.js +8 -5
  121. package/dist/api/admin/users/map/route.js.map +1 -1
  122. package/dist/api/admin/users/me/avatar/route.js +1 -1
  123. package/dist/api/admin/users/me/avatar/route.js.map +1 -1
  124. package/dist/api/admin/users/me/google/route.js +1 -1
  125. package/dist/api/admin/users/me/google/route.js.map +1 -1
  126. package/dist/api/admin/users/me/password/send-otp/route.d.ts.map +1 -1
  127. package/dist/api/admin/users/me/password/send-otp/route.js +2 -1
  128. package/dist/api/admin/users/me/password/send-otp/route.js.map +1 -1
  129. package/dist/api/admin/users/route.d.ts.map +1 -1
  130. package/dist/api/admin/users/route.js +8 -1
  131. package/dist/api/admin/users/route.js.map +1 -1
  132. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts.map +1 -1
  133. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js +4 -3
  134. package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js.map +1 -1
  135. package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts.map +1 -1
  136. package/dist/api/admin/workspaces/[id]/access-requests/route.js +3 -2
  137. package/dist/api/admin/workspaces/[id]/access-requests/route.js.map +1 -1
  138. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.d.ts.map +1 -1
  139. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.js +4 -3
  140. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/resend/route.js.map +1 -1
  141. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.d.ts.map +1 -1
  142. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js +2 -2
  143. package/dist/api/admin/workspaces/[id]/invitations/[inviteId]/route.js.map +1 -1
  144. package/dist/api/admin/workspaces/[id]/invitations/route.d.ts.map +1 -1
  145. package/dist/api/admin/workspaces/[id]/invitations/route.js +6 -5
  146. package/dist/api/admin/workspaces/[id]/invitations/route.js.map +1 -1
  147. package/dist/api/admin/workspaces/[id]/members/[userId]/route.d.ts.map +1 -1
  148. package/dist/api/admin/workspaces/[id]/members/[userId]/route.js +5 -4
  149. package/dist/api/admin/workspaces/[id]/members/[userId]/route.js.map +1 -1
  150. package/dist/api/admin/workspaces/[id]/members/batch/route.d.ts.map +1 -1
  151. package/dist/api/admin/workspaces/[id]/members/batch/route.js +3 -2
  152. package/dist/api/admin/workspaces/[id]/members/batch/route.js.map +1 -1
  153. package/dist/api/admin/workspaces/[id]/members/route.d.ts.map +1 -1
  154. package/dist/api/admin/workspaces/[id]/members/route.js +3 -2
  155. package/dist/api/admin/workspaces/[id]/members/route.js.map +1 -1
  156. package/dist/api/admin/workspaces/route.d.ts.map +1 -1
  157. package/dist/api/admin/workspaces/route.js +5 -3
  158. package/dist/api/admin/workspaces/route.js.map +1 -1
  159. package/dist/api/admin/workspaces/search/route.d.ts.map +1 -1
  160. package/dist/api/admin/workspaces/search/route.js +25 -16
  161. package/dist/api/admin/workspaces/search/route.js.map +1 -1
  162. package/dist/api/auth/_apply-pending-invites.d.ts.map +1 -1
  163. package/dist/api/auth/_apply-pending-invites.js +6 -5
  164. package/dist/api/auth/_apply-pending-invites.js.map +1 -1
  165. package/dist/api/auth/forgot-password/route.d.ts.map +1 -1
  166. package/dist/api/auth/forgot-password/route.js +2 -1
  167. package/dist/api/auth/forgot-password/route.js.map +1 -1
  168. package/dist/api/auth/invite/[token]/route.d.ts.map +1 -1
  169. package/dist/api/auth/invite/[token]/route.js +15 -5
  170. package/dist/api/auth/invite/[token]/route.js.map +1 -1
  171. package/dist/api/auth/register/send-otp/route.d.ts.map +1 -1
  172. package/dist/api/auth/register/send-otp/route.js +2 -1
  173. package/dist/api/auth/register/send-otp/route.js.map +1 -1
  174. package/dist/api/utils/issue-access.d.ts +16 -0
  175. package/dist/api/utils/issue-access.d.ts.map +1 -0
  176. package/dist/api/utils/issue-access.js +38 -0
  177. package/dist/api/utils/issue-access.js.map +1 -0
  178. package/dist/api/utils/project-access.d.ts +2 -0
  179. package/dist/api/utils/project-access.d.ts.map +1 -1
  180. package/dist/api/utils/project-access.js +11 -8
  181. package/dist/api/utils/project-access.js.map +1 -1
  182. package/dist/api/utils/request.d.ts +30 -0
  183. package/dist/api/utils/request.d.ts.map +1 -0
  184. package/dist/api/utils/request.js +11 -0
  185. package/dist/api/utils/request.js.map +1 -0
  186. package/dist/api/utils/workspace-access.d.ts.map +1 -1
  187. package/dist/api/utils/workspace-access.js +6 -7
  188. package/dist/api/utils/workspace-access.js.map +1 -1
  189. package/dist/index.d.ts +6 -0
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/index.js +6 -0
  192. package/dist/index.js.map +1 -1
  193. package/dist/subscribers/comment-created.d.ts.map +1 -1
  194. package/dist/subscribers/comment-created.js +3 -1
  195. package/dist/subscribers/comment-created.js.map +1 -1
  196. package/dist/subscribers/issue-assigned.d.ts.map +1 -1
  197. package/dist/subscribers/issue-assigned.js +3 -1
  198. package/dist/subscribers/issue-assigned.js.map +1 -1
  199. package/dist/subscribers/issue-created.d.ts.map +1 -1
  200. package/dist/subscribers/issue-created.js +2 -1
  201. package/dist/subscribers/issue-created.js.map +1 -1
  202. package/dist/subscribers/issue-mentioned.d.ts.map +1 -1
  203. package/dist/subscribers/issue-mentioned.js +2 -1
  204. package/dist/subscribers/issue-mentioned.js.map +1 -1
  205. package/dist/subscribers/issue-status-changed.d.ts +1 -0
  206. package/dist/subscribers/issue-status-changed.d.ts.map +1 -1
  207. package/dist/subscribers/issue-status-changed.js +3 -1
  208. package/dist/subscribers/issue-status-changed.js.map +1 -1
  209. package/dist/subscribers/password-otp-requested.d.ts.map +1 -1
  210. package/dist/subscribers/password-otp-requested.js +2 -1
  211. package/dist/subscribers/password-otp-requested.js.map +1 -1
  212. package/dist/subscribers/password-reset-requested.d.ts.map +1 -1
  213. package/dist/subscribers/password-reset-requested.js +2 -1
  214. package/dist/subscribers/password-reset-requested.js.map +1 -1
  215. package/dist/subscribers/project-access-request-cancelled.d.ts.map +1 -1
  216. package/dist/subscribers/project-access-request-cancelled.js +2 -1
  217. package/dist/subscribers/project-access-request-cancelled.js.map +1 -1
  218. package/dist/subscribers/project-access-request-resolved.d.ts.map +1 -1
  219. package/dist/subscribers/project-access-request-resolved.js +2 -1
  220. package/dist/subscribers/project-access-request-resolved.js.map +1 -1
  221. package/dist/subscribers/project-access-requested.d.ts.map +1 -1
  222. package/dist/subscribers/project-access-requested.js +2 -1
  223. package/dist/subscribers/project-access-requested.js.map +1 -1
  224. package/dist/subscribers/project-member-added.d.ts.map +1 -1
  225. package/dist/subscribers/project-member-added.js +2 -1
  226. package/dist/subscribers/project-member-added.js.map +1 -1
  227. package/dist/subscribers/registration-otp-requested.d.ts.map +1 -1
  228. package/dist/subscribers/registration-otp-requested.js +2 -1
  229. package/dist/subscribers/registration-otp-requested.js.map +1 -1
  230. package/dist/subscribers/workspace-access-request-cancelled.d.ts.map +1 -1
  231. package/dist/subscribers/workspace-access-request-cancelled.js +2 -1
  232. package/dist/subscribers/workspace-access-request-cancelled.js.map +1 -1
  233. package/dist/subscribers/workspace-access-request-resolved.d.ts.map +1 -1
  234. package/dist/subscribers/workspace-access-request-resolved.js +2 -1
  235. package/dist/subscribers/workspace-access-request-resolved.js.map +1 -1
  236. package/dist/subscribers/workspace-access-requested.d.ts.map +1 -1
  237. package/dist/subscribers/workspace-access-requested.js +2 -1
  238. package/dist/subscribers/workspace-access-requested.js.map +1 -1
  239. package/dist/subscribers/workspace-member-added.d.ts.map +1 -1
  240. package/dist/subscribers/workspace-member-added.js +2 -1
  241. package/dist/subscribers/workspace-member-added.js.map +1 -1
  242. package/dist/subscribers/workspace-member-invited.d.ts.map +1 -1
  243. package/dist/subscribers/workspace-member-invited.js +2 -1
  244. package/dist/subscribers/workspace-member-invited.js.map +1 -1
  245. package/dist/workflows/assign-issue.d.ts.map +1 -1
  246. package/dist/workflows/assign-issue.js +2 -1
  247. package/dist/workflows/assign-issue.js.map +1 -1
  248. package/dist/workflows/complete-sprint.d.ts.map +1 -1
  249. package/dist/workflows/complete-sprint.js +2 -1
  250. package/dist/workflows/complete-sprint.js.map +1 -1
  251. package/dist/workflows/create-invitation.d.ts.map +1 -1
  252. package/dist/workflows/create-invitation.js +2 -1
  253. package/dist/workflows/create-invitation.js.map +1 -1
  254. package/dist/workflows/create-issue.d.ts.map +1 -1
  255. package/dist/workflows/create-issue.js +2 -1
  256. package/dist/workflows/create-issue.js.map +1 -1
  257. package/dist/workflows/create-project.d.ts.map +1 -1
  258. package/dist/workflows/create-project.js +2 -1
  259. package/dist/workflows/create-project.js.map +1 -1
  260. package/dist/workflows/transfer-project.d.ts.map +1 -1
  261. package/dist/workflows/transfer-project.js +28 -17
  262. package/dist/workflows/transfer-project.js.map +1 -1
  263. package/dist/workflows/update-issue-status.d.ts.map +1 -1
  264. package/dist/workflows/update-issue-status.js +3 -2
  265. package/dist/workflows/update-issue-status.js.map +1 -1
  266. package/package.json +7 -6
@@ -1,17 +1,19 @@
1
1
  import { requirePermission } from "@meridianjs/auth";
2
+ import { ROLES } from "@meridianjs/types";
3
+ import { isGlobalAdmin } from "../../utils/project-access.js";
2
4
  export const GET = async (req, res) => {
3
5
  const workspaceService = req.scope.resolve("workspaceModuleService");
4
6
  const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
5
7
  const limit = Number(req.query.limit) || 200;
6
8
  const offset = Number(req.query.offset) || 0;
7
9
  const roles = req.user?.roles ?? [];
8
- const isPrivileged = roles.includes("super-admin") || roles.includes("admin");
10
+ const isPrivileged = isGlobalAdmin(req);
9
11
  // Always fetch the user's workspace memberships (needed for private workspace filtering)
10
12
  const userWorkspaceIds = await workspaceMemberService.getWorkspaceIdsForUser(req.user.id);
11
13
  if (isPrivileged) {
12
14
  const [workspaces, count] = await workspaceService.listAndCountWorkspaces({}, { limit, offset });
13
15
  // Super-admin org-scope bypass: return all workspaces unfiltered
14
- if (roles.includes("super-admin") && req.query.org_scope === "true") {
16
+ if (roles.includes(ROLES.SUPER_ADMIN) && req.query.org_scope === "true") {
15
17
  res.json({ workspaces, count, limit, offset });
16
18
  return;
17
19
  }
@@ -60,7 +62,7 @@ export const POST = async (req, res, next) => {
60
62
  });
61
63
  // Auto-create workspace membership for the creator (admin role)
62
64
  if (req.user?.id) {
63
- await workspaceMemberService.ensureMember(workspace.id, req.user.id, "admin");
65
+ await workspaceMemberService.ensureMember(workspace.id, req.user.id, ROLES.ADMIN);
64
66
  // Assign "Workspace Admin" app role to the creator
65
67
  try {
66
68
  const appRoleService = req.scope.resolve("appRoleModuleService");
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/workspaces/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/workspaces/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAE7D,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;IAC3E,MAAM,sBAAsB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAQ,CAAA;IACvF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAE5C,MAAM,KAAK,GAAa,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAA;IAC7C,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAEvC,yFAAyF;IACzF,MAAM,gBAAgB,GAAG,MAAM,sBAAsB,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEzF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAChG,iEAAiE;QACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YACxE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC9C,OAAM;QACR,CAAC;QACD,yDAAyD;QACzD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAChC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACjD,CAAA;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACzE,OAAM;IACR,CAAC;IAED,+CAA+C;IAC/C,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACrD,OAAM;IACR,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CACvE,EAAE,EAAE,EAAE,gBAAgB,EAAE,EACxB,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAA;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACxE,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QACzD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;YAC3E,MAAM,sBAAsB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAQ,CAAA;YACvF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;YAE3C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;gBAChE,OAAM;YACR,CAAC;YAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAEvD,qEAAqE;YACrE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAA;YACrE,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE;wBACL,OAAO,EAAE,sBAAsB,QAAQ,CAAC,IAAI,mBAAmB;wBAC/D,IAAI,EAAE,kBAAkB;wBACxB,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;qBACzE;iBACF,CAAC,CAAA;gBACF,OAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;gBACjB,IAAI;gBACJ,IAAI,EAAE,IAAI,IAAI,MAAM;gBACpB,UAAU,EAAE,UAAU,IAAI,KAAK;aAChC,CAAC,CAAA;YAEF,gEAAgE;YAChE,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;gBACjB,MAAM,sBAAsB,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;gBAEjF,mDAAmD;gBACnD,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;oBACvE,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;oBACjE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;oBACrH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,MAAM,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;oBACzE,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,6CAA6C;gBAC/C,CAAC;YACH,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/workspaces/search/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAiChD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/workspaces/search/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAoChD,CAAA"}
@@ -1,21 +1,30 @@
1
1
  export const GET = async (req, res) => {
2
2
  const workspaceService = req.scope.resolve("workspaceModuleService");
3
3
  const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
4
- const q = (req.query.q ?? "").trim().toLowerCase();
5
- const [workspaces] = await workspaceService.listAndCountWorkspaces({ is_private: false }, { limit: 100 });
6
- const filtered = q
7
- ? workspaces.filter((w) => w.name.toLowerCase().includes(q) ||
8
- w.slug.toLowerCase().includes(q))
9
- : workspaces;
10
- const limited = filtered.slice(0, 20);
11
- // Check membership and pending request for each workspace
12
- const results = await Promise.all(limited.map(async (w) => {
13
- const isMember = await workspaceMemberService.isMember(w.id, req.user?.id);
14
- const hasPendingRequest = !isMember
15
- ? !!(await workspaceMemberService.getPendingRequest(w.id, req.user?.id))
16
- : false;
17
- return { id: w.id, name: w.name, slug: w.slug, is_private: w.is_private, is_member: isMember, has_pending_request: hasPendingRequest };
18
- }));
19
- res.json({ workspaces: results });
4
+ const q = (req.query.q ?? "").trim();
5
+ // Push the text search into SQL rather than loading 100 rows and filtering in JS.
6
+ const filters = { is_private: false };
7
+ if (q) {
8
+ const term = `%${q}%`;
9
+ filters.$or = [{ name: { $ilike: term } }, { slug: { $ilike: term } }];
10
+ }
11
+ const [workspaces] = await workspaceService.listAndCountWorkspaces(filters, { limit: 20 });
12
+ // Batch the membership + pending-request lookups into two queries total
13
+ // instead of two per result row.
14
+ const userId = req.user?.id;
15
+ const memberWsIds = new Set(await workspaceMemberService.getWorkspaceIdsForUser(userId));
16
+ const pendingWsIds = new Set((await workspaceMemberService.getUserPendingRequests(userId)).map((r) => r.workspace_id));
17
+ const results = workspaces.map((w) => {
18
+ const isMember = memberWsIds.has(w.id);
19
+ return {
20
+ id: w.id,
21
+ name: w.name,
22
+ slug: w.slug,
23
+ is_private: w.is_private,
24
+ is_member: isMember,
25
+ has_pending_request: !isMember && pendingWsIds.has(w.id),
26
+ };
27
+ });
28
+ res.json({ workspaces: results, count: results.length });
20
29
  };
21
30
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/workspaces/search/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;IAC3E,MAAM,sBAAsB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAQ,CAAA;IAEvF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAE5D,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CAChE,EAAE,UAAU,EAAE,KAAK,EAAE,EACrB,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC;QAChB,CAAC,CAAC,UAAU,CAAC,MAAM,CACf,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnC;QACH,CAAC,CAAC,UAAU,CAAA;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAErC,0DAA0D;IAC1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAM,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC1E,MAAM,iBAAiB,GAAG,CAAC,QAAQ;YACjC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,KAAK,CAAA;QACT,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAA;IACxI,CAAC,CAAC,CACH,CAAA;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;AACnC,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/workspaces/search/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;IAC3E,MAAM,sBAAsB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAQ,CAAA;IAEvF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAE9C,kFAAkF;IAClF,MAAM,OAAO,GAA4B,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;IAC9D,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAA;QACrB,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,gBAAgB,CAAC,sBAAsB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;IAE1F,wEAAwE;IACxE,iCAAiC;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;IAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,MAAM,sBAAsB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;IAChG,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,CAAC,MAAM,sBAAsB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAC9F,CAAA;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACtC,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,QAAQ;YACnB,mBAAmB,EAAE,CAAC,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AAC1D,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"_apply-pending-invites.d.ts","sourceRoot":"","sources":["../../../src/api/auth/_apply-pending-invites.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CA6DlB"}
1
+ {"version":3,"file":"_apply-pending-invites.d.ts","sourceRoot":"","sources":["../../../src/api/auth/_apply-pending-invites.ts"],"names":[],"mappings":"AAQA;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CA6DlB"}
@@ -1,8 +1,9 @@
1
+ import { ROLES } from "@meridianjs/types";
1
2
  const ROLE_RANK = {
2
- "super-admin": 3,
3
- "admin": 2,
3
+ [ROLES.SUPER_ADMIN]: 3,
4
+ [ROLES.ADMIN]: 2,
4
5
  "moderator": 1,
5
- "member": 0,
6
+ [ROLES.MEMBER]: 0,
6
7
  };
7
8
  /**
8
9
  * Finds all pending invitations for the given email, applies their workspace
@@ -23,11 +24,11 @@ export async function applyPendingInvites(scope, userId, email) {
23
24
  const [invitations] = await invitationService.listAndCountInvitations({ email: normalizedEmail, status: "pending" }, { limit: 100 });
24
25
  if (!invitations || invitations.length === 0)
25
26
  return false;
26
- let highestRole = "member";
27
+ let highestRole = ROLES.MEMBER;
27
28
  for (const inv of invitations) {
28
29
  // Create workspace membership
29
30
  if (inv.workspace_id) {
30
- const wsRole = inv.role === "member" ? "member" : "admin";
31
+ const wsRole = inv.role === ROLES.MEMBER ? ROLES.MEMBER : ROLES.ADMIN;
31
32
  await workspaceMemberService.ensureMember(inv.workspace_id, userId, wsRole).catch(() => { });
32
33
  }
33
34
  // Track highest role across all invitations
@@ -1 +1 @@
1
- {"version":3,"file":"_apply-pending-invites.js","sourceRoot":"","sources":["../../../src/api/auth/_apply-pending-invites.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_apply-pending-invites.js","sourceRoot":"","sources":["../../../src/api/auth/_apply-pending-invites.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/auth/forgot-password/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMvC;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA4BjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/auth/forgot-password/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAOvC;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA4BjD,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { EVENTS } from "@meridianjs/types";
2
3
  const forgotPasswordSchema = z.object({
3
4
  email: z.string().email(),
4
5
  });
@@ -19,7 +20,7 @@ export const POST = async (req, res) => {
19
20
  try {
20
21
  const eventBus = req.scope.resolve("eventBus");
21
22
  await eventBus.emit({
22
- name: "password.reset_requested",
23
+ name: EVENTS.PASSWORD_RESET_REQUESTED,
23
24
  data: {
24
25
  user_id: resetInfo.userId,
25
26
  email: resetInfo.email,
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/auth/forgot-password/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;CAC1B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAC7G,OAAM;IACR,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;IACjE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAE3E,0DAA0D;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;YACrD,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE;oBACJ,OAAO,EAAE,SAAS,CAAC,MAAM;oBACzB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;iBACvB;aACF,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC,CAAA;AACtG,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/auth/forgot-password/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;CAC1B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAC7G,OAAM;IACR,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;IACjE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAE3E,0DAA0D;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;YACrD,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,MAAM,CAAC,wBAAwB;gBACrC,IAAI,EAAE;oBACJ,OAAO,EAAE,SAAS,CAAC,MAAM;oBACzB,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,KAAK,EAAE,SAAS,CAAC,KAAK;iBACvB;aACF,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC,CAAA;AACtG,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/auth/invite/[token]/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,qGAAqG;AACrG,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAsChD,CAAA;AASD;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA+EjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/auth/invite/[token]/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,qGAAqG;AACrG,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAsChD,CAAA;AASD;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAwFjD,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { assignDefaultUserRole } from "../../../utils/assign-default-role.js";
3
+ import { ROLES } from "@meridianjs/types";
3
4
  /** Public endpoint — no auth middleware. Returns invitation + workspace name for the accept page. */
4
5
  export const GET = async (req, res) => {
5
6
  const invitationService = req.scope.resolve("invitationModuleService");
@@ -70,12 +71,20 @@ export const POST = async (req, res) => {
70
71
  });
71
72
  return;
72
73
  }
74
+ // Atomically claim the invitation BEFORE doing any work — two concurrent
75
+ // POSTs with the same token would otherwise both pass the pending check
76
+ // and double-spend it.
77
+ const claimed = await invitationService.claimInvitation(invitation.id);
78
+ if (!claimed) {
79
+ res.status(410).json({ error: { message: "Invitation has already been accepted" } });
80
+ return;
81
+ }
73
82
  let authResult;
74
83
  try {
75
- // Check for a previously soft-deleted account with this email.
76
- // retrieveUserByEmail finds deleted records too (no deleted_at filter).
84
+ // Check for a previously soft-deleted account with this email so we can
85
+ // restore it. The IncludingDeleted variant makes that intent explicit.
77
86
  const userService = req.scope.resolve("userModuleService");
78
- const existingUser = await userService.retrieveUserByEmail(parsed.data.email);
87
+ const existingUser = await userService.retrieveUserByEmailIncludingDeleted(parsed.data.email);
79
88
  if (existingUser?.deleted_at) {
80
89
  // Restore the old account — preserves their user ID, issue history, comments, etc.
81
90
  authResult = await authService.restoreFromInvite(existingUser.id, {
@@ -96,16 +105,17 @@ export const POST = async (req, res) => {
96
105
  }
97
106
  }
98
107
  catch (err) {
108
+ // Registration failed — release the claim so the invitee can retry.
109
+ await invitationService.reopenInvitation(invitation.id).catch(() => { });
99
110
  res.status(err.status ?? 500).json({ error: { message: err.message ?? "Registration failed" } });
100
111
  return;
101
112
  }
102
113
  if (invitation.workspace_id) {
103
114
  // workspace_member.role only supports "admin" | "member" — map super-admin → admin
104
- const wsRole = invitation.role === "member" ? "member" : "admin";
115
+ const wsRole = invitation.role === ROLES.MEMBER ? ROLES.MEMBER : ROLES.ADMIN;
105
116
  await workspaceMemberService.ensureMember(invitation.workspace_id, authResult.user.id, wsRole);
106
117
  }
107
118
  await assignDefaultUserRole(req, authResult.user.id, invitation.app_role_id);
108
- await invitationService.updateInvitation(invitation.id, { status: "accepted" });
109
119
  res.status(201).json(authResult);
110
120
  };
111
121
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/auth/invite/[token]/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/auth/invite/[token]/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/auth/register/send-otp/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAQvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAqDjD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/auth/register/send-otp/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AASvC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAqDjD,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { generateAndStoreOtp } from "../_otp-store.js";
3
3
  import { validateEmailDomain } from "../_domain-check.js";
4
+ import { EVENTS } from "@meridianjs/types";
4
5
  const schema = z.object({
5
6
  email: z.string().email(),
6
7
  });
@@ -47,7 +48,7 @@ export const POST = async (req, res) => {
47
48
  }
48
49
  try {
49
50
  const eventBus = req.scope.resolve("eventBus");
50
- await eventBus.emit({ name: "registration.otp_requested", data: { email, otp } });
51
+ await eventBus.emit({ name: EVENTS.REGISTRATION_OTP_REQUESTED, data: { email, otp } });
51
52
  }
52
53
  catch {
53
54
  // Non-fatal — OTP is stored, email may not send
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/auth/register/send-otp/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/auth/register/send-otp/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Response } from "express";
2
+ /**
3
+ * Loads the issue at req.params.id and enforces project-level access.
4
+ *
5
+ * Returns the issue when the caller may proceed. Sends the response (404 when
6
+ * the issue is missing, 403 when access is denied) and returns null otherwise.
7
+ *
8
+ * Fails closed: an issue whose project row cannot be resolved (dangling
9
+ * project_id) is only accessible to global admins.
10
+ *
11
+ * Usage:
12
+ * const issue = await assertIssueAccess(req, res)
13
+ * if (!issue) return
14
+ */
15
+ export declare function assertIssueAccess(req: any, res: Response): Promise<any | null>;
16
+ //# sourceMappingURL=issue-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-access.d.ts","sourceRoot":"","sources":["../../../src/api/utils/issue-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAwBpF"}
@@ -0,0 +1,38 @@
1
+ import { hasProjectAccess, isGlobalAdmin } from "./project-access.js";
2
+ /**
3
+ * Loads the issue at req.params.id and enforces project-level access.
4
+ *
5
+ * Returns the issue when the caller may proceed. Sends the response (404 when
6
+ * the issue is missing, 403 when access is denied) and returns null otherwise.
7
+ *
8
+ * Fails closed: an issue whose project row cannot be resolved (dangling
9
+ * project_id) is only accessible to global admins.
10
+ *
11
+ * Usage:
12
+ * const issue = await assertIssueAccess(req, res)
13
+ * if (!issue) return
14
+ */
15
+ export async function assertIssueAccess(req, res) {
16
+ const issueService = req.scope.resolve("issueModuleService");
17
+ const issue = await issueService.retrieveIssue(req.params.id).catch(() => null);
18
+ if (!issue) {
19
+ res.status(404).json({ error: { message: "Issue not found" } });
20
+ return null;
21
+ }
22
+ if (issue.project_id) {
23
+ const projectService = req.scope.resolve("projectModuleService");
24
+ const project = await projectService.retrieveProject(issue.project_id).catch(() => null);
25
+ if (!project) {
26
+ if (!isGlobalAdmin(req)) {
27
+ res.status(403).json({ error: { message: "Forbidden" } });
28
+ return null;
29
+ }
30
+ }
31
+ else if (!(await hasProjectAccess(req, project))) {
32
+ res.status(403).json({ error: { message: "Forbidden" } });
33
+ return null;
34
+ }
35
+ }
36
+ return issue;
37
+ }
38
+ //# sourceMappingURL=issue-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-access.js","sourceRoot":"","sources":["../../../src/api/utils/issue-access.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAErE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAQ,EAAE,GAAa;IAC7D,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAA;QAC/D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAQ,CAAA;QACvE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAExF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;gBACzD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;YACzD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -5,6 +5,8 @@
5
5
  * const allowed = await hasProjectAccess(req, project)
6
6
  * if (!allowed) { res.status(403).json({ error: { message: "Forbidden" } }); return }
7
7
  */
8
+ /** True when the caller holds an org-wide admin role. */
9
+ export declare function isGlobalAdmin(req: any): boolean;
8
10
  export declare function hasProjectAccess(req: any, project: {
9
11
  id: string;
10
12
  workspace_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"project-access.d.ts","sourceRoot":"","sources":["../../../src/api/utils/project-access.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBhH;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,SAAS,EAAE,QAAQ,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAsBzD"}
1
+ {"version":3,"file":"project-access.d.ts","sourceRoot":"","sources":["../../../src/api/utils/project-access.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAG/C;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAehH;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,SAAS,EAAE,QAAQ,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBzD"}
@@ -1,3 +1,4 @@
1
+ import { PRIVILEGED_ROLES, ROLES, PROJECT_ROLES } from "@meridianjs/types";
1
2
  /**
2
3
  * Shared project access check.
3
4
  *
@@ -5,9 +6,13 @@
5
6
  * const allowed = await hasProjectAccess(req, project)
6
7
  * if (!allowed) { res.status(403).json({ error: { message: "Forbidden" } }); return }
7
8
  */
8
- export async function hasProjectAccess(req, project) {
9
+ /** True when the caller holds an org-wide admin role. */
10
+ export function isGlobalAdmin(req) {
9
11
  const roles = req.user?.roles ?? [];
10
- if (roles.includes("super-admin") || roles.includes("admin"))
12
+ return roles.some((r) => PRIVILEGED_ROLES.includes(r));
13
+ }
14
+ export async function hasProjectAccess(req, project) {
15
+ if (isGlobalAdmin(req))
11
16
  return true;
12
17
  const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
13
18
  const teamMemberService = req.scope.resolve("teamMemberModuleService");
@@ -16,7 +21,7 @@ export async function hasProjectAccess(req, project) {
16
21
  const membership = await workspaceMemberService.getMembership(project.workspace_id, userId);
17
22
  if (!membership)
18
23
  return false;
19
- if (membership.role === "admin")
24
+ if (membership.role === ROLES.ADMIN)
20
25
  return true;
21
26
  const userTeamIds = await teamMemberService.getUserTeamIds(userId);
22
27
  const accessibleProjectIds = await projectMemberService.getAccessibleProjectIds(userId, userTeamIds);
@@ -34,18 +39,16 @@ export async function resolveProjectAndAccess(req, res) {
34
39
  res.status(404).json({ error: { message: "Project not found" } });
35
40
  return null;
36
41
  }
37
- const roles = req.user?.roles ?? [];
38
- const isGlobalAdmin = roles.includes("super-admin") || roles.includes("admin");
39
- if (isGlobalAdmin)
42
+ if (isGlobalAdmin(req))
40
43
  return { project, isAuthorized: true };
41
44
  const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
42
45
  const wsMembership = await workspaceMemberService.getMembership(project.workspace_id, req.user?.id);
43
- if (wsMembership?.role === "admin")
46
+ if (wsMembership?.role === ROLES.ADMIN)
44
47
  return { project, isAuthorized: true };
45
48
  const projectMemberService = req.scope.resolve("projectMemberModuleService");
46
49
  const members = await projectMemberService.listProjectMembers(project.id);
47
50
  const myMembership = members.find((m) => m.user_id === req.user?.id);
48
- if (myMembership?.role === "manager")
51
+ if (myMembership?.role === PROJECT_ROLES.MANAGER)
49
52
  return { project, isAuthorized: true };
50
53
  return { project, isAuthorized: false };
51
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project-access.js","sourceRoot":"","sources":["../../../src/api/utils/project-access.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-access.js","sourceRoot":"","sources":["../../../src/api/utils/project-access.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Request } from "express";
2
+ import type { MeridianContainer } from "@meridianjs/types";
3
+ /**
4
+ * The authenticated request shape shared by all /admin routes.
5
+ *
6
+ * `req.user` is populated by authenticateJWT; `req.scope` is the per-request
7
+ * Awilix container. Routes are written against `any` today — prefer this type
8
+ * on new/edited handlers so service lookups and req.user access are checked.
9
+ */
10
+ export interface AuthenticatedUser {
11
+ id: string;
12
+ workspaceId: string | null;
13
+ roles: string[];
14
+ permissions: string[];
15
+ }
16
+ export interface MeridianRequest extends Request {
17
+ user?: AuthenticatedUser;
18
+ scope: MeridianContainer;
19
+ }
20
+ /**
21
+ * Resolve a module service from the request scope with a return type.
22
+ * Replaces the pervasive `req.scope.resolve("xService") as any`.
23
+ *
24
+ * @example
25
+ * const issues = resolveService<IssueModuleService>(req, "issueModuleService")
26
+ */
27
+ export declare function resolveService<T = any>(req: {
28
+ scope: MeridianContainer;
29
+ }, token: string): T;
30
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/api/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,KAAK,EAAE,iBAAiB,CAAA;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAE3F"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Resolve a module service from the request scope with a return type.
3
+ * Replaces the pervasive `req.scope.resolve("xService") as any`.
4
+ *
5
+ * @example
6
+ * const issues = resolveService<IssueModuleService>(req, "issueModuleService")
7
+ */
8
+ export function resolveService(req, token) {
9
+ return req.scope.resolve(token);
10
+ }
11
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/api/utils/request.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAU,GAAiC,EAAE,KAAa;IACtF,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAM,CAAA;AACtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-access.d.ts","sourceRoot":"","sources":["../../../src/api/utils/workspace-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBrF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBpF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAGtD;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBjG"}
1
+ {"version":3,"file":"workspace-access.d.ts","sourceRoot":"","sources":["../../../src/api/utils/workspace-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBrF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBpF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAGtD;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBjG"}
@@ -1,3 +1,5 @@
1
+ import { ROLES } from "@meridianjs/types";
2
+ import { isGlobalAdmin } from "./project-access.js";
1
3
  /**
2
4
  * Shared workspace access check. Verifies the workspace exists and the caller
3
5
  * has access (public workspace for admins, or membership for private/members).
@@ -10,8 +12,7 @@ export async function assertWorkspaceAccess(req, res) {
10
12
  res.status(404).json({ error: { message: "Workspace not found" } });
11
13
  return false;
12
14
  }
13
- const roles = req.user?.roles ?? [];
14
- const isPrivileged = roles.includes("super-admin") || roles.includes("admin");
15
+ const isPrivileged = isGlobalAdmin(req);
15
16
  if (workspace.is_private || !isPrivileged) {
16
17
  const membership = await workspaceMemberService.getMembership(req.params.id, req.user?.id);
17
18
  if (!membership) {
@@ -32,12 +33,10 @@ export async function assertWorkspaceAdmin(req, res) {
32
33
  res.status(404).json({ error: { message: "Workspace not found" } });
33
34
  return false;
34
35
  }
35
- const roles = req.user?.roles ?? [];
36
- const isGlobalAdmin = roles.includes("super-admin") || roles.includes("admin");
37
- if (isGlobalAdmin)
36
+ if (isGlobalAdmin(req))
38
37
  return true;
39
38
  const membership = await workspaceMemberService.getMembership(req.params.id, req.user?.id);
40
- if (!membership || membership.role !== "admin") {
39
+ if (!membership || membership.role !== ROLES.ADMIN) {
41
40
  res.status(403).json({ error: { message: "Workspace admin access required" } });
42
41
  return false;
43
42
  }
@@ -45,7 +44,7 @@ export async function assertWorkspaceAdmin(req, res) {
45
44
  }
46
45
  export function isSuperAdminOrgScope(req) {
47
46
  const roles = req.user?.roles ?? [];
48
- return roles.includes("super-admin") && req.query.org_scope === "true";
47
+ return roles.includes(ROLES.SUPER_ADMIN) && req.query.org_scope === "true";
49
48
  }
50
49
  /**
51
50
  * Returns workspace IDs the caller can access (public + private where member).
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-access.js","sourceRoot":"","sources":["../../../src/api/utils/workspace-access.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-access.js","sourceRoot":"","sources":["../../../src/api/utils/workspace-access.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  import type { PluginRegistrationContext } from "@meridianjs/types";
2
2
  export { transferProjectWorkflow } from "./workflows/transfer-project.js";
3
3
  export type { TransferProjectInput } from "./workflows/transfer-project.js";
4
+ export { createIssueWorkflow } from "./workflows/create-issue.js";
5
+ export type { CreateIssueInput } from "./workflows/create-issue.js";
6
+ export { updateIssueStatusWorkflow } from "./workflows/update-issue-status.js";
7
+ export { assignIssueWorkflow } from "./workflows/assign-issue.js";
8
+ export { hasProjectAccess, isGlobalAdmin } from "./api/utils/project-access.js";
9
+ export { getAccessibleWorkspaceIds } from "./api/utils/workspace-access.js";
4
10
  /**
5
11
  * Tells the Meridian plugin loader where to find this package's
6
12
  * api/, links/, subscribers/, and jobs/ directories.