@meridianjs/meridian 1.30.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/admin/events/route.d.ts.map +1 -1
- package/dist/api/admin/events/route.js +15 -8
- package/dist/api/admin/events/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +34 -31
- package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/attachments/route.js +25 -22
- package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/comments/route.js +20 -17
- package/dist/api/admin/issues/[id]/comments/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +63 -60
- package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/route.js +20 -17
- package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -1
- package/dist/api/admin/issues/[id]/time-logs/timer/route.js +27 -24
- package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/access/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/access/route.js +15 -2
- package/dist/api/admin/projects/[id]/access/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts +4 -0
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js +116 -0
- package/dist/api/admin/projects/[id]/access-requests/[requestId]/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/access-requests/route.d.ts +5 -0
- package/dist/api/admin/projects/[id]/access-requests/route.d.ts.map +1 -0
- package/dist/api/admin/projects/[id]/access-requests/route.js +153 -0
- package/dist/api/admin/projects/[id]/access-requests/route.js.map +1 -0
- package/dist/api/admin/projects/[id]/health/[updateId]/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/health/[updateId]/route.js +78 -73
- package/dist/api/admin/projects/[id]/health/[updateId]/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/health/[updateId]/send/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/health/[updateId]/send/route.js +68 -65
- package/dist/api/admin/projects/[id]/health/[updateId]/send/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/health/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/health/route.js +33 -30
- package/dist/api/admin/projects/[id]/health/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/share/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/share/route.js +44 -39
- package/dist/api/admin/projects/[id]/share/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js +77 -72
- package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/reorder/route.js +20 -17
- package/dist/api/admin/projects/[id]/statuses/reorder/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/statuses/route.js +23 -20
- package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -1
- package/dist/api/admin/projects/[id]/task-lists/route.d.ts.map +1 -1
- package/dist/api/admin/projects/[id]/task-lists/route.js +22 -19
- package/dist/api/admin/projects/[id]/task-lists/route.js.map +1 -1
- package/dist/api/admin/projects/route.d.ts.map +1 -1
- package/dist/api/admin/projects/route.js +55 -22
- package/dist/api/admin/projects/route.js.map +1 -1
- package/dist/api/admin/task-lists/[id]/route.d.ts.map +1 -1
- package/dist/api/admin/task-lists/[id]/route.js +44 -39
- package/dist/api/admin/task-lists/[id]/route.js.map +1 -1
- package/dist/api/admin/time-logs/active-timer/route.d.ts.map +1 -1
- package/dist/api/admin/time-logs/active-timer/route.js +14 -11
- package/dist/api/admin/time-logs/active-timer/route.js.map +1 -1
- package/dist/api/admin/users/route.d.ts.map +1 -1
- package/dist/api/admin/users/route.js +1 -11
- package/dist/api/admin/users/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts +4 -0
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.d.ts.map +1 -0
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js +94 -0
- package/dist/api/admin/workspaces/[id]/access-requests/[requestId]/route.js.map +1 -0
- package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts +4 -0
- package/dist/api/admin/workspaces/[id]/access-requests/route.d.ts.map +1 -0
- package/dist/api/admin/workspaces/[id]/access-requests/route.js +111 -0
- package/dist/api/admin/workspaces/[id]/access-requests/route.js.map +1 -0
- package/dist/api/admin/workspaces/[id]/invitations/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/invitations/route.js +47 -44
- package/dist/api/admin/workspaces/[id]/invitations/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/batch/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/batch/route.js +16 -6
- package/dist/api/admin/workspaces/[id]/members/batch/route.js.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/[id]/members/route.js +13 -6
- package/dist/api/admin/workspaces/[id]/members/route.js.map +1 -1
- package/dist/api/admin/workspaces/my-access-requests/route.d.ts +3 -0
- package/dist/api/admin/workspaces/my-access-requests/route.d.ts.map +1 -0
- package/dist/api/admin/workspaces/my-access-requests/route.js +20 -0
- package/dist/api/admin/workspaces/my-access-requests/route.js.map +1 -0
- package/dist/api/admin/workspaces/route.d.ts.map +1 -1
- package/dist/api/admin/workspaces/route.js +24 -0
- package/dist/api/admin/workspaces/route.js.map +1 -1
- package/dist/api/admin/workspaces/search/route.d.ts +3 -0
- package/dist/api/admin/workspaces/search/route.d.ts.map +1 -0
- package/dist/api/admin/workspaces/search/route.js +20 -0
- package/dist/api/admin/workspaces/search/route.js.map +1 -0
- package/dist/api/auth/_apply-pending-invites.d.ts +12 -0
- package/dist/api/auth/_apply-pending-invites.d.ts.map +1 -0
- package/dist/api/auth/_apply-pending-invites.js +68 -0
- package/dist/api/auth/_apply-pending-invites.js.map +1 -0
- package/dist/api/auth/google/callback/route.d.ts.map +1 -1
- package/dist/api/auth/google/callback/route.js +20 -0
- package/dist/api/auth/google/callback/route.js.map +1 -1
- package/dist/api/auth/invite/[token]/route.d.ts.map +1 -1
- package/dist/api/auth/invite/[token]/route.js +13 -5
- package/dist/api/auth/invite/[token]/route.js.map +1 -1
- package/dist/api/auth/register/route.d.ts.map +1 -1
- package/dist/api/auth/register/route.js +16 -0
- package/dist/api/auth/register/route.js.map +1 -1
- package/dist/subscribers/project-access-request-resolved.d.ts +12 -0
- package/dist/subscribers/project-access-request-resolved.d.ts.map +1 -0
- package/dist/subscribers/project-access-request-resolved.js +55 -0
- package/dist/subscribers/project-access-request-resolved.js.map +1 -0
- package/dist/subscribers/project-access-requested.d.ts +11 -0
- package/dist/subscribers/project-access-requested.d.ts.map +1 -0
- package/dist/subscribers/project-access-requested.js +12 -0
- package/dist/subscribers/project-access-requested.js.map +1 -0
- package/dist/subscribers/workspace-access-request-resolved.d.ts +12 -0
- package/dist/subscribers/workspace-access-request-resolved.d.ts.map +1 -0
- package/dist/subscribers/workspace-access-request-resolved.js +60 -0
- package/dist/subscribers/workspace-access-request-resolved.js.map +1 -0
- package/dist/subscribers/workspace-access-requested.d.ts +13 -0
- package/dist/subscribers/workspace-access-requested.d.ts.map +1 -0
- package/dist/subscribers/workspace-access-requested.js +44 -0
- package/dist/subscribers/workspace-access-requested.js.map +1 -0
- package/package.json +19 -19
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const GET = async (req, res) => {
|
|
2
|
+
const workspaceService = req.scope.resolve("workspaceModuleService");
|
|
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
|
+
: workspaces;
|
|
9
|
+
const limited = filtered.slice(0, 20);
|
|
10
|
+
// Check membership and pending request for each workspace
|
|
11
|
+
const results = await Promise.all(limited.map(async (w) => {
|
|
12
|
+
const isMember = await workspaceMemberService.isMember(w.id, req.user?.id);
|
|
13
|
+
const hasPendingRequest = !isMember
|
|
14
|
+
? !!(await workspaceMemberService.getPendingRequest(w.id, req.user?.id))
|
|
15
|
+
: false;
|
|
16
|
+
return { id: w.id, name: w.name, slug: w.slug, is_private: w.is_private, is_member: isMember, has_pending_request: hasPendingRequest };
|
|
17
|
+
}));
|
|
18
|
+
res.json({ workspaces: results });
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +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,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjE,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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finds all pending invitations for the given email, applies their workspace
|
|
3
|
+
* memberships / roles / app roles to the user, and marks each as "accepted".
|
|
4
|
+
*
|
|
5
|
+
* Returns `true` if any invitations were applied (caller should re-sign the
|
|
6
|
+
* JWT to reflect the updated role/permissions).
|
|
7
|
+
*
|
|
8
|
+
* Non-fatal — never throws. Registration must succeed even if invite
|
|
9
|
+
* processing fails.
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyPendingInvites(scope: any, userId: string, email: string): Promise<boolean>;
|
|
12
|
+
//# sourceMappingURL=_apply-pending-invites.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const ROLE_RANK = {
|
|
2
|
+
"super-admin": 3,
|
|
3
|
+
"admin": 2,
|
|
4
|
+
"moderator": 1,
|
|
5
|
+
"member": 0,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Finds all pending invitations for the given email, applies their workspace
|
|
9
|
+
* memberships / roles / app roles to the user, and marks each as "accepted".
|
|
10
|
+
*
|
|
11
|
+
* Returns `true` if any invitations were applied (caller should re-sign the
|
|
12
|
+
* JWT to reflect the updated role/permissions).
|
|
13
|
+
*
|
|
14
|
+
* Non-fatal — never throws. Registration must succeed even if invite
|
|
15
|
+
* processing fails.
|
|
16
|
+
*/
|
|
17
|
+
export async function applyPendingInvites(scope, userId, email) {
|
|
18
|
+
try {
|
|
19
|
+
const invitationService = scope.resolve("invitationModuleService");
|
|
20
|
+
const workspaceMemberService = scope.resolve("workspaceMemberModuleService");
|
|
21
|
+
const userService = scope.resolve("userModuleService");
|
|
22
|
+
const normalizedEmail = email.toLowerCase().trim();
|
|
23
|
+
const [invitations] = await invitationService.listAndCountInvitations({ email: normalizedEmail, status: "pending" }, { limit: 100 });
|
|
24
|
+
if (!invitations || invitations.length === 0)
|
|
25
|
+
return false;
|
|
26
|
+
let highestRole = "member";
|
|
27
|
+
for (const inv of invitations) {
|
|
28
|
+
// Create workspace membership
|
|
29
|
+
if (inv.workspace_id) {
|
|
30
|
+
const wsRole = inv.role === "member" ? "member" : "admin";
|
|
31
|
+
await workspaceMemberService.ensureMember(inv.workspace_id, userId, wsRole).catch(() => { });
|
|
32
|
+
}
|
|
33
|
+
// Track highest role across all invitations
|
|
34
|
+
if ((ROLE_RANK[inv.role] ?? 0) > (ROLE_RANK[highestRole] ?? 0)) {
|
|
35
|
+
highestRole = inv.role;
|
|
36
|
+
}
|
|
37
|
+
// Apply app_role_id from invitation (or default to "User" system role)
|
|
38
|
+
try {
|
|
39
|
+
if (inv.app_role_id) {
|
|
40
|
+
await userService.updateUser(userId, { app_role_id: inv.app_role_id });
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const appRoleService = scope.resolve("appRoleModuleService");
|
|
44
|
+
const [userRoles] = await appRoleService.listAndCountAppRoles({ name: "User", is_system: true }, { limit: 1 });
|
|
45
|
+
if (userRoles.length > 0) {
|
|
46
|
+
await userService.updateUser(userId, { app_role_id: userRoles[0].id });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Non-fatal
|
|
52
|
+
}
|
|
53
|
+
// Mark invitation as accepted
|
|
54
|
+
await invitationService.updateInvitation(inv.id, { status: "accepted" }).catch(() => { });
|
|
55
|
+
}
|
|
56
|
+
// Upgrade user's system role if any invitation grants a higher one
|
|
57
|
+
const user = await userService.retrieveUser(userId).catch(() => null);
|
|
58
|
+
if (user && (ROLE_RANK[highestRole] ?? 0) > (ROLE_RANK[user.role] ?? 0)) {
|
|
59
|
+
await userService.updateUser(userId, { role: highestRole }).catch(() => { });
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Entire block is non-fatal — registration must not fail
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=_apply-pending-invites.js.map
|
|
@@ -0,0 +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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/auth/google/callback/route.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/auth/google/callback/route.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKvC;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAoNhD,CAAA"}
|
|
@@ -2,6 +2,7 @@ import jwt from "jsonwebtoken";
|
|
|
2
2
|
import { randomBytes } from "node:crypto";
|
|
3
3
|
import { storeExchangeCode } from "../_exchange-store.js";
|
|
4
4
|
import { validateEmailDomain } from "../../register/_domain-check.js";
|
|
5
|
+
import { applyPendingInvites } from "../../_apply-pending-invites.js";
|
|
5
6
|
/**
|
|
6
7
|
* GET /auth/google/callback?code=...&state=...
|
|
7
8
|
* Handles the Google OAuth redirect. Absent googleOAuthService → 501.
|
|
@@ -181,6 +182,25 @@ export const GET = async (req, res) => {
|
|
|
181
182
|
// Non-fatal
|
|
182
183
|
}
|
|
183
184
|
}
|
|
185
|
+
else {
|
|
186
|
+
// No explicit invite flow — check for pending invitations by email
|
|
187
|
+
// (user registered via Google OAuth without clicking an invite link)
|
|
188
|
+
try {
|
|
189
|
+
const userService = req.scope.resolve("userModuleService");
|
|
190
|
+
const existing = await userService.retrieveUserByEmail(profile.email).catch(() => null);
|
|
191
|
+
if (existing?.id) {
|
|
192
|
+
const applied = await applyPendingInvites(req.scope, existing.id, profile.email);
|
|
193
|
+
if (applied) {
|
|
194
|
+
// Re-sign the JWT with a fresh DB read so the token reflects the upgraded role/permissions
|
|
195
|
+
const authService = req.scope.resolve("authModuleService");
|
|
196
|
+
authResult = await authService.issueToken(existing.id);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Non-fatal
|
|
202
|
+
}
|
|
203
|
+
}
|
|
184
204
|
// Issue a one-time code instead of putting the JWT in the redirect URL.
|
|
185
205
|
// The JWT in a redirect URL (even as a hash fragment) appears in the server's
|
|
186
206
|
// access log on the 302 Location header. The frontend exchanges this short-lived
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/auth/google/callback/route.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/auth/google/callback/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAEvC,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,
|
|
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;AAEvC,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,kBA6FjD,CAAA"}
|
|
@@ -103,15 +103,23 @@ export const POST = async (req, res) => {
|
|
|
103
103
|
const wsRole = invitation.role === "member" ? "member" : "admin";
|
|
104
104
|
await workspaceMemberService.ensureMember(invitation.workspace_id, authResult.user.id, wsRole);
|
|
105
105
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
try {
|
|
107
|
+
const userService = req.scope.resolve("userModuleService");
|
|
108
|
+
if (invitation.app_role_id) {
|
|
109
109
|
await userService.updateUser(authResult.user.id, { app_role_id: invitation.app_role_id });
|
|
110
110
|
}
|
|
111
|
-
|
|
112
|
-
//
|
|
111
|
+
else {
|
|
112
|
+
// Default to "User" system role when invitation has no specific app role
|
|
113
|
+
const appRoleService = req.scope.resolve("appRoleModuleService");
|
|
114
|
+
const [userRoles] = await appRoleService.listAndCountAppRoles({ name: "User", is_system: true }, { limit: 1 });
|
|
115
|
+
if (userRoles.length > 0) {
|
|
116
|
+
await userService.updateUser(authResult.user.id, { app_role_id: userRoles[0].id });
|
|
117
|
+
}
|
|
113
118
|
}
|
|
114
119
|
}
|
|
120
|
+
catch {
|
|
121
|
+
// Non-fatal — member joined, just couldn't assign app role
|
|
122
|
+
}
|
|
115
123
|
await invitationService.updateInvitation(invitation.id, { status: "accepted" });
|
|
116
124
|
res.status(201).json(authResult);
|
|
117
125
|
};
|
|
@@ -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/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/auth/register/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAavC,eAAO,MAAM,IAAI,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAiEjD,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { consumeOtp } from "./_otp-store.js";
|
|
3
3
|
import { validateEmailDomain } from "./_domain-check.js";
|
|
4
|
+
import { applyPendingInvites } from "../_apply-pending-invites.js";
|
|
4
5
|
const registerSchema = z.object({
|
|
5
6
|
email: z.string().email(),
|
|
6
7
|
password: z.string().min(8, "Password must be at least 8 characters"),
|
|
@@ -51,6 +52,21 @@ export const POST = async (req, res) => {
|
|
|
51
52
|
}
|
|
52
53
|
const authService = req.scope.resolve("authModuleService");
|
|
53
54
|
const response = await authService.register(result.data);
|
|
55
|
+
// Auto-apply any pending invitations for this email
|
|
56
|
+
if (response.user?.id) {
|
|
57
|
+
const applied = await applyPendingInvites(req.scope, response.user.id, result.data.email);
|
|
58
|
+
if (applied) {
|
|
59
|
+
// Re-sign the JWT with a fresh DB read so the token reflects the upgraded role/permissions
|
|
60
|
+
try {
|
|
61
|
+
const freshAuth = await authService.issueToken(response.user.id);
|
|
62
|
+
response.token = freshAuth.token;
|
|
63
|
+
response.user = freshAuth.user;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Non-fatal — user still registered, they can log in to get the updated token
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
54
70
|
res.status(201).json(response);
|
|
55
71
|
};
|
|
56
72
|
//# sourceMappingURL=route.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/auth/register/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/auth/register/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAElE,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IACzB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;IACrE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;IACjE,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3E,MAAM,YAAY,GAAG,SAAS,KAAK,CAAC,CAAA;IAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAQ,CAAA;QACjD,MAAM,SAAS,GAAG,MAAM,EAAE,aAAa,EAAE,YAAY,CAAA;QACrD,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,OAAO,EAAE,sEAAsE,EAAE;aAC3F,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAA;QAChC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,cAAc,CAAC,CAAA;YACzD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;gBACvE,OAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,EAAE,CAAC,CAAA;YAC7E,OAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjD,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,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,CAAA;QAClF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,sCAAsC,EAAE,EAAE,CAAC,CAAA;YACpF,OAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;IACjE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAExD,oDAAoD;IACpD,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzF,IAAI,OAAO,EAAE,CAAC;YACZ,2FAA2F;YAC3F,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAChE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;gBAChC,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAA;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,8EAA8E;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
|
|
2
|
+
interface ProjectAccessRequestResolvedData {
|
|
3
|
+
project_id: string;
|
|
4
|
+
project_name: string;
|
|
5
|
+
workspace_id: string;
|
|
6
|
+
user_id: string;
|
|
7
|
+
action: "approve" | "deny";
|
|
8
|
+
}
|
|
9
|
+
export default function handler({ event, container }: SubscriberArgs<ProjectAccessRequestResolvedData>): Promise<void>;
|
|
10
|
+
export declare const config: SubscriberConfig;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=project-access-request-resolved.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access-request-resolved.d.ts","sourceRoot":"","sources":["../../src/subscribers/project-access-request-resolved.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,gCAAgC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;CAC3B;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,gCAAgC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD3H;AAED,eAAO,MAAM,MAAM,EAAE,gBAA+D,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { sseManager } from "@meridianjs/framework";
|
|
2
|
+
import { buildEmail, buildProjectUrl, resolveTemplate } from "./_email-helper.js";
|
|
3
|
+
export default async function handler({ event, container }) {
|
|
4
|
+
const data = event.data;
|
|
5
|
+
// SSE: update the admin's access-requests badge and the requester's notification bell
|
|
6
|
+
sseManager.broadcast(data.workspace_id, "project.access_request_resolved", {
|
|
7
|
+
project_id: data.project_id,
|
|
8
|
+
action: data.action,
|
|
9
|
+
});
|
|
10
|
+
sseManager.broadcast(data.workspace_id, "notification.created", {});
|
|
11
|
+
try {
|
|
12
|
+
const emailService = container.resolve("emailService");
|
|
13
|
+
const userService = container.resolve("userModuleService");
|
|
14
|
+
const config = container.resolve("config");
|
|
15
|
+
const appUrl = config?.appUrl ?? process.env.APP_URL ?? "http://localhost:9001";
|
|
16
|
+
const user = await userService.retrieveUser(data.user_id).catch(() => null);
|
|
17
|
+
if (!user?.email)
|
|
18
|
+
return;
|
|
19
|
+
const approved = data.action === "approve";
|
|
20
|
+
const projectUrl = await buildProjectUrl(container, appUrl, data.project_id, data.workspace_id);
|
|
21
|
+
const tpl = resolveTemplate(container, "project.access_request_resolved", {
|
|
22
|
+
project: { name: data.project_name },
|
|
23
|
+
user,
|
|
24
|
+
approved,
|
|
25
|
+
});
|
|
26
|
+
await emailService.send({
|
|
27
|
+
to: user.email,
|
|
28
|
+
subject: tpl?.subject ?? (approved
|
|
29
|
+
? `You've been granted access to "${data.project_name}"`
|
|
30
|
+
: `Your request to join "${data.project_name}" was not approved`),
|
|
31
|
+
text: tpl?.text ?? (approved
|
|
32
|
+
? `Your request to join the project "${data.project_name}" has been approved. View it here: ${projectUrl}`
|
|
33
|
+
: `Your request to join the project "${data.project_name}" was reviewed and not approved at this time.`),
|
|
34
|
+
html: tpl?.html ?? buildEmail(approved ? {
|
|
35
|
+
preheader: `Your access to ${data.project_name} has been approved`,
|
|
36
|
+
heading: `Access granted to "${data.project_name}"`,
|
|
37
|
+
body: `Your request to join the project <strong>${data.project_name}</strong> has been approved. You can now view and collaborate on the project.`,
|
|
38
|
+
ctaText: "View Project",
|
|
39
|
+
ctaUrl: projectUrl,
|
|
40
|
+
} : {
|
|
41
|
+
preheader: `Your access request for ${data.project_name}`,
|
|
42
|
+
heading: `Access request for "${data.project_name}"`,
|
|
43
|
+
body: `Your request to join the project <strong>${data.project_name}</strong> was reviewed and not approved at this time. Please reach out to a project manager if you think this is a mistake.`,
|
|
44
|
+
ctaText: "Open Meridian",
|
|
45
|
+
ctaUrl: appUrl,
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const logger = container.resolve("logger");
|
|
51
|
+
logger.error(`[email] project.access_request_resolved: ${err instanceof Error ? err.message : String(err)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export const config = { event: "project.access_request_resolved" };
|
|
55
|
+
//# sourceMappingURL=project-access-request-resolved.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access-request-resolved.js","sourceRoot":"","sources":["../../src/subscribers/project-access-request-resolved.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAUjF,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAoD;IAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IAEvB,sFAAsF;IACtF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,iCAAiC,EAAE;QACzE,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAA;IACF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAA;IAEnE,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,MAAM,GAAS,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAQ,CAAA;QACvD,MAAM,MAAM,GAAW,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAuB,CAAA;QAEvF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC3E,IAAI,CAAC,IAAI,EAAE,KAAK;YAAE,OAAM;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAA;QAC1C,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAE/F,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,iCAAiC,EAAE;YACxE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;YACpC,IAAI;YACJ,QAAQ;SACT,CAAC,CAAA;QAEF,MAAM,YAAY,CAAC,IAAI,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC,KAAK;YACd,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,CAAC,QAAQ;gBAChC,CAAC,CAAC,kCAAkC,IAAI,CAAC,YAAY,GAAG;gBACxD,CAAC,CAAC,yBAAyB,IAAI,CAAC,YAAY,oBAAoB,CAAC;YACnE,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ;gBAC1B,CAAC,CAAC,qCAAqC,IAAI,CAAC,YAAY,sCAAsC,UAAU,EAAE;gBAC1G,CAAC,CAAC,qCAAqC,IAAI,CAAC,YAAY,+CAA+C,CAAC;YAC1G,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvC,SAAS,EAAE,kBAAkB,IAAI,CAAC,YAAY,oBAAoB;gBAClE,OAAO,EAAE,sBAAsB,IAAI,CAAC,YAAY,GAAG;gBACnD,IAAI,EAAE,4CAA4C,IAAI,CAAC,YAAY,+EAA+E;gBAClJ,OAAO,EAAE,cAAc;gBACvB,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC,CAAC;gBACF,SAAS,EAAE,2BAA2B,IAAI,CAAC,YAAY,EAAE;gBACzD,OAAO,EAAE,uBAAuB,IAAI,CAAC,YAAY,GAAG;gBACpD,IAAI,EAAE,4CAA4C,IAAI,CAAC,YAAY,6HAA6H;gBAChM,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE,MAAM;aACf,CAAC;SACH,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAQ,CAAA;QACjD,MAAM,CAAC,KAAK,CAAC,4CAA4C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC9G,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
|
|
2
|
+
interface ProjectAccessRequestedData {
|
|
3
|
+
project_id: string;
|
|
4
|
+
workspace_id: string;
|
|
5
|
+
user_id: string;
|
|
6
|
+
request_id: string;
|
|
7
|
+
}
|
|
8
|
+
export default function handler({ event }: SubscriberArgs<ProjectAccessRequestedData>): Promise<void>;
|
|
9
|
+
export declare const config: SubscriberConfig;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=project-access-requested.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access-requested.d.ts","sourceRoot":"","sources":["../../src/subscribers/project-access-requested.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,UAAU,0BAA0B;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1G;AAED,eAAO,MAAM,MAAM,EAAE,gBAAwD,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { sseManager } from "@meridianjs/framework";
|
|
2
|
+
export default async function handler({ event }) {
|
|
3
|
+
const data = event.data;
|
|
4
|
+
// SSE: update the project access-requests badge for managers/admins
|
|
5
|
+
sseManager.broadcast(data.workspace_id, "project.access_requested", {
|
|
6
|
+
project_id: data.project_id,
|
|
7
|
+
request_id: data.request_id,
|
|
8
|
+
});
|
|
9
|
+
sseManager.broadcast(data.workspace_id, "notification.created", {});
|
|
10
|
+
}
|
|
11
|
+
export const config = { event: "project.access_requested" };
|
|
12
|
+
//# sourceMappingURL=project-access-requested.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access-requested.js","sourceRoot":"","sources":["../../src/subscribers/project-access-requested.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AASlD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAA8C;IACzF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IAEvB,oEAAoE;IACpE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,0BAA0B,EAAE;QAClE,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;IACF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
|
|
2
|
+
interface WorkspaceAccessRequestResolvedData {
|
|
3
|
+
workspace_id: string;
|
|
4
|
+
workspace_name: string;
|
|
5
|
+
workspace_slug: string;
|
|
6
|
+
user_id: string;
|
|
7
|
+
action: "approve" | "deny";
|
|
8
|
+
}
|
|
9
|
+
export default function handler({ event, container }: SubscriberArgs<WorkspaceAccessRequestResolvedData>): Promise<void>;
|
|
10
|
+
export declare const config: SubscriberConfig;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=workspace-access-request-resolved.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-access-request-resolved.d.ts","sourceRoot":"","sources":["../../src/subscribers/workspace-access-request-resolved.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,kCAAkC;IAC1C,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;CAC3B;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,kCAAkC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D7H;AAED,eAAO,MAAM,MAAM,EAAE,gBAAiE,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { sseManager } from "@meridianjs/framework";
|
|
2
|
+
import { buildEmail, resolveTemplate } from "./_email-helper.js";
|
|
3
|
+
export default async function handler({ event, container }) {
|
|
4
|
+
const data = event.data;
|
|
5
|
+
// SSE: update the admin's access-requests badge and the requester's notification bell
|
|
6
|
+
sseManager.broadcast(data.workspace_id, "workspace.access_request_resolved", {
|
|
7
|
+
action: data.action,
|
|
8
|
+
});
|
|
9
|
+
sseManager.broadcast(data.workspace_id, "notification.created", {});
|
|
10
|
+
// SSE: notify the requester directly (they may be on /awaiting-access with no workspace SSE)
|
|
11
|
+
sseManager.broadcast(`user:${data.user_id}`, "workspace.access_request_resolved", {
|
|
12
|
+
action: data.action,
|
|
13
|
+
workspace_id: data.workspace_id,
|
|
14
|
+
workspace_slug: data.workspace_slug,
|
|
15
|
+
});
|
|
16
|
+
try {
|
|
17
|
+
const emailService = container.resolve("emailService");
|
|
18
|
+
const userService = container.resolve("userModuleService");
|
|
19
|
+
const config = container.resolve("config");
|
|
20
|
+
const appUrl = config?.appUrl ?? process.env.APP_URL ?? "http://localhost:9001";
|
|
21
|
+
const user = await userService.retrieveUser(data.user_id).catch(() => null);
|
|
22
|
+
if (!user?.email)
|
|
23
|
+
return;
|
|
24
|
+
const approved = data.action === "approve";
|
|
25
|
+
const workspaceUrl = `${appUrl}/${data.workspace_slug}/projects`;
|
|
26
|
+
const tpl = resolveTemplate(container, "workspace.access_request_resolved", {
|
|
27
|
+
workspace: { name: data.workspace_name },
|
|
28
|
+
user,
|
|
29
|
+
approved,
|
|
30
|
+
});
|
|
31
|
+
await emailService.send({
|
|
32
|
+
to: user.email,
|
|
33
|
+
subject: tpl?.subject ?? (approved
|
|
34
|
+
? `You've been granted access to "${data.workspace_name}"`
|
|
35
|
+
: `Your request to join "${data.workspace_name}" was not approved`),
|
|
36
|
+
text: tpl?.text ?? (approved
|
|
37
|
+
? `Your request to join "${data.workspace_name}" has been approved. You can now access the workspace here: ${workspaceUrl}`
|
|
38
|
+
: `Your request to join "${data.workspace_name}" was reviewed and not approved at this time.`),
|
|
39
|
+
html: tpl?.html ?? buildEmail(approved ? {
|
|
40
|
+
preheader: `Your access to ${data.workspace_name} has been approved`,
|
|
41
|
+
heading: `You're in — welcome to "${data.workspace_name}"`,
|
|
42
|
+
body: `Your request to join <strong>${data.workspace_name}</strong> has been approved. You can now access the workspace and collaborate with your team.`,
|
|
43
|
+
ctaText: "Open Workspace",
|
|
44
|
+
ctaUrl: workspaceUrl,
|
|
45
|
+
} : {
|
|
46
|
+
preheader: `Your access request for ${data.workspace_name}`,
|
|
47
|
+
heading: `Access request for "${data.workspace_name}"`,
|
|
48
|
+
body: `Your request to join <strong>${data.workspace_name}</strong> was reviewed and not approved at this time. Please reach out to a workspace admin if you think this is a mistake.`,
|
|
49
|
+
ctaText: "Open Meridian",
|
|
50
|
+
ctaUrl: appUrl,
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const logger = container.resolve("logger");
|
|
56
|
+
logger.error(`[email] workspace.access_request_resolved: ${err instanceof Error ? err.message : String(err)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export const config = { event: "workspace.access_request_resolved" };
|
|
60
|
+
//# sourceMappingURL=workspace-access-request-resolved.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-access-request-resolved.js","sourceRoot":"","sources":["../../src/subscribers/workspace-access-request-resolved.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
|
|
2
|
+
interface WorkspaceAccessRequestedData {
|
|
3
|
+
access_request_id: string;
|
|
4
|
+
workspace_id: string;
|
|
5
|
+
user_id: string;
|
|
6
|
+
requester_name: string;
|
|
7
|
+
requester_email: string | null;
|
|
8
|
+
admin_user_ids: string[];
|
|
9
|
+
}
|
|
10
|
+
export default function handler({ event, container }: SubscriberArgs<WorkspaceAccessRequestedData>): Promise<void>;
|
|
11
|
+
export declare const config: SubscriberConfig;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=workspace-access-requested.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-access-requested.d.ts","sourceRoot":"","sources":["../../src/subscribers/workspace-access-requested.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,4BAA4B;IACpC,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,4BAA4B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CvH;AAED,eAAO,MAAM,MAAM,EAAE,gBAA0D,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { sseManager } from "@meridianjs/framework";
|
|
2
|
+
import { emailHtml, resolveTemplate } from "./_email-helper.js";
|
|
3
|
+
export default async function handler({ event, container }) {
|
|
4
|
+
const data = event.data;
|
|
5
|
+
// SSE broadcast so admins get real-time badge update
|
|
6
|
+
sseManager.broadcast(data.workspace_id, "workspace.access_requested", {
|
|
7
|
+
access_request_id: data.access_request_id,
|
|
8
|
+
});
|
|
9
|
+
sseManager.broadcast(data.workspace_id, "notification.created", {});
|
|
10
|
+
// Email all workspace admins
|
|
11
|
+
if (data.admin_user_ids.length === 0)
|
|
12
|
+
return;
|
|
13
|
+
try {
|
|
14
|
+
const emailService = container.resolve("emailService");
|
|
15
|
+
const workspaceSvc = container.resolve("workspaceModuleService");
|
|
16
|
+
const userSvc = container.resolve("userModuleService");
|
|
17
|
+
const workspace = await workspaceSvc.retrieveWorkspace(data.workspace_id);
|
|
18
|
+
if (!workspace)
|
|
19
|
+
return;
|
|
20
|
+
const appUrl = process.env.APP_URL ?? "http://localhost:9000";
|
|
21
|
+
const settingsUrl = `${appUrl}/${workspace.slug}/settings?tab=access-requests`;
|
|
22
|
+
const adminUsers = await userSvc.listUsersByIds(data.admin_user_ids);
|
|
23
|
+
const tpl = resolveTemplate(container, "workspace.access_requested", {
|
|
24
|
+
workspace: { name: workspace.name },
|
|
25
|
+
requester: { name: data.requester_name, email: data.requester_email },
|
|
26
|
+
});
|
|
27
|
+
await Promise.all([...adminUsers.values()].map(async (admin) => {
|
|
28
|
+
if (!admin.email)
|
|
29
|
+
return;
|
|
30
|
+
const subject = tpl?.subject ?? `${data.requester_name} requested access to "${workspace.name}"`;
|
|
31
|
+
const text = tpl?.text ?? `${data.requester_name} has requested access to "${workspace.name}".\n\nReview their request here: ${settingsUrl}`;
|
|
32
|
+
const html = tpl?.html ?? emailHtml(`<strong>${data.requester_name}</strong> has requested access to join <strong>${workspace.name}</strong>.<br/><br/>` +
|
|
33
|
+
`<a href="${settingsUrl}" style="display:inline-block;padding:10px 20px;background:#4f46e5;color:#fff;text-decoration:none;border-radius:6px;font-weight:600">Review Request</a><br/><br/>` +
|
|
34
|
+
`Or visit: <a href="${settingsUrl}">${settingsUrl}</a>`);
|
|
35
|
+
await emailService.send({ to: admin.email, subject, text, html });
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
const logger = container.resolve("logger");
|
|
40
|
+
logger.error(`[email] workspace.access_requested: ${err instanceof Error ? err.message : String(err)}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const config = { event: "workspace.access_requested" };
|
|
44
|
+
//# sourceMappingURL=workspace-access-requested.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-access-requested.js","sourceRoot":"","sources":["../../src/subscribers/workspace-access-requested.ts"],"names":[],"mappings":"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"}
|