@meridianjs/meridian 1.6.0 → 1.8.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.
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/reporting/time-logs/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAsDhD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/reporting/time-logs/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBA+DhD,CAAA"}
@@ -1,6 +1,6 @@
1
1
  export const GET = async (req, res) => {
2
2
  const issueService = req.scope.resolve("issueModuleService");
3
- const { user_id, project_id, workspace_id, from, to } = req.query;
3
+ const { user_id, project_id, workspace_id, workspace_ids, from, to } = req.query;
4
4
  const roles = req.user?.roles ?? [];
5
5
  const permissions = req.user?.permissions ?? [];
6
6
  const isPrivileged = roles.includes("super-admin") || roles.includes("admin") || permissions.includes("workspace:admin");
@@ -9,8 +9,16 @@ export const GET = async (req, res) => {
9
9
  filters.user_id = user_id;
10
10
  if (project_id)
11
11
  filters.project_id = project_id;
12
- if (workspace_id)
13
- filters.workspace_id = workspace_id;
12
+ // Support both single workspace_id and comma-separated workspace_ids
13
+ const wsIds = workspace_ids
14
+ ? workspace_ids.split(",").filter(Boolean)
15
+ : workspace_id
16
+ ? [workspace_id]
17
+ : [];
18
+ if (wsIds.length === 1)
19
+ filters.workspace_id = wsIds[0];
20
+ else if (wsIds.length > 1)
21
+ filters.workspace_id = wsIds;
14
22
  if (from || to) {
15
23
  const dateFilter = {};
16
24
  if (from)
@@ -19,32 +27,33 @@ export const GET = async (req, res) => {
19
27
  dateFilter.$lte = new Date(to);
20
28
  filters.logged_date = dateFilter;
21
29
  }
22
- if (!isPrivileged && workspace_id) {
30
+ if (!isPrivileged && wsIds.length > 0) {
23
31
  const userId = req.user?.id;
24
32
  const workspaceMemberService = req.scope.resolve("workspaceMemberModuleService");
25
- const membership = await workspaceMemberService.getMembership(workspace_id, userId);
26
- if (!membership) {
27
- res.status(403).json({ error: { message: "Forbidden" } });
28
- return;
29
- }
30
33
  const teamMemberService = req.scope.resolve("teamMemberModuleService");
31
34
  const projectMemberService = req.scope.resolve("projectMemberModuleService");
32
- const userTeamIds = await teamMemberService.getUserTeamIds(userId);
33
- const accessibleProjectIds = await projectMemberService.getAccessibleProjectIds(userId, userTeamIds);
35
+ // Verify membership in each requested workspace, collect accessible projects
36
+ const allAccessibleProjectIds = [];
37
+ for (const wid of wsIds) {
38
+ const membership = await workspaceMemberService.getMembership(wid, userId);
39
+ if (!membership)
40
+ continue; // skip workspaces user isn't a member of
41
+ const userTeamIds = await teamMemberService.getUserTeamIds(userId);
42
+ const projectIds = await projectMemberService.getAccessibleProjectIds(userId, userTeamIds);
43
+ allAccessibleProjectIds.push(...projectIds);
44
+ }
34
45
  if (project_id) {
35
- // Requested a specific project — deny if not accessible
36
- if (!accessibleProjectIds.includes(project_id)) {
46
+ if (!allAccessibleProjectIds.includes(project_id)) {
37
47
  res.json({ time_logs: [], total_minutes: 0 });
38
48
  return;
39
49
  }
40
50
  }
41
51
  else {
42
- // Scope to accessible projects only
43
- if (accessibleProjectIds.length === 0) {
52
+ if (allAccessibleProjectIds.length === 0) {
44
53
  res.json({ time_logs: [], total_minutes: 0 });
45
54
  return;
46
55
  }
47
- filters.project_id = accessibleProjectIds;
56
+ filters.project_id = allAccessibleProjectIds;
48
57
  }
49
58
  }
50
59
  const time_logs = await issueService.listTimeLogsForReporting(filters);
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/reporting/time-logs/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/reporting/time-logs/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/users/invitations/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAuChD,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/users/invitations/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvC,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,kBAgDhD,CAAA"}
@@ -3,7 +3,14 @@ export const GET = async (req, res) => {
3
3
  requireRoles("super-admin", "admin")(req, res, async () => {
4
4
  const invitationService = req.scope.resolve("invitationModuleService");
5
5
  const workspaceService = req.scope.resolve("workspaceModuleService");
6
- const [invitations] = await invitationService.listAndCountInvitations({}, { limit: 500 });
6
+ const limit = Math.min(Number(req.query.limit) || 20, 100);
7
+ const offset = Number(req.query.offset) || 0;
8
+ const q = typeof req.query.q === "string" ? req.query.q.trim() : "";
9
+ const filters = { status: "pending" };
10
+ if (q) {
11
+ filters.email = { $ilike: `%${q}%` };
12
+ }
13
+ const [invitations, totalCount] = await invitationService.listAndCountInvitations(filters, { limit, offset });
7
14
  // Enrich with workspace name where applicable
8
15
  const workspaceCache = new Map();
9
16
  const enriched = await Promise.all(invitations.map(async (inv) => {
@@ -32,7 +39,7 @@ export const GET = async (req, res) => {
32
39
  created_at: inv.created_at,
33
40
  };
34
41
  }));
35
- res.json({ invitations: enriched, count: enriched.length });
42
+ res.json({ invitations: enriched, count: totalCount, limit, offset });
36
43
  });
37
44
  };
38
45
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/users/invitations/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,EAAE;IACnD,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAQ,CAAA;QAC7E,MAAM,gBAAgB,GAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;QAE5E,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,iBAAiB,CAAC,uBAAuB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAEzF,8CAA8C;QAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;QAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,WAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAQ,EAAE,EAAE;YAC5C,IAAI,cAAc,GAAkB,IAAI,CAAA;YACxC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;wBACrE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;oBAC/C,CAAC;oBAAC,MAAM,CAAC;wBACP,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;oBACxD,CAAC;gBACH,CAAC;gBACD,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAA;YAC/D,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;gBACtC,cAAc;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;gBAClC,UAAU,EAAE,GAAG,CAAC,UAAU;aAC3B,CAAA;QACH,CAAC,CAAC,CACH,CAAA;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/users/invitations/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Response, NextFunction } from "express";
2
+ /**
3
+ * Lightweight endpoint that returns ALL users with only the fields needed
4
+ * for lookup maps and dropdowns. No pagination — intended for in-app
5
+ * reference data (user names, initials, avatars).
6
+ */
7
+ export declare const GET: (req: any, res: Response, next: NextFunction) => Promise<void>;
8
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/api/admin/users/map/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAepE,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Lightweight endpoint that returns ALL users with only the fields needed
3
+ * for lookup maps and dropdowns. No pagination — intended for in-app
4
+ * reference data (user names, initials, avatars).
5
+ */
6
+ export const GET = async (req, res, next) => {
7
+ try {
8
+ const userService = req.scope.resolve("userModuleService");
9
+ const users = await userService.listUsers({});
10
+ const mapped = users.map((u) => ({
11
+ id: u.id,
12
+ email: u.email,
13
+ first_name: u.first_name,
14
+ last_name: u.last_name,
15
+ avatar_url: u.avatar_url ?? null,
16
+ }));
17
+ res.json({ users: mapped });
18
+ }
19
+ catch (err) {
20
+ next(err);
21
+ }
22
+ };
23
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../../src/api/admin/users/map/route.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QACjE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAI,KAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;SACjC,CAAC,CAAC,CAAA;QACH,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/users/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAErD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAWpE,CAAA"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/users/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAErD,eAAO,MAAM,GAAG,GAAU,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,kBAsBpE,CAAA"}
@@ -3,7 +3,16 @@ export const GET = async (req, res, next) => {
3
3
  const userService = req.scope.resolve("userModuleService");
4
4
  const limit = Math.min(Number(req.query.limit) || 20, 100);
5
5
  const offset = Number(req.query.offset) || 0;
6
- const [users, count] = await userService.listAndCountUsers({}, { limit, offset });
6
+ const q = typeof req.query.q === "string" ? req.query.q.trim() : "";
7
+ const filters = {};
8
+ if (q) {
9
+ filters.$or = [
10
+ { email: { $ilike: `%${q}%` } },
11
+ { first_name: { $ilike: `%${q}%` } },
12
+ { last_name: { $ilike: `%${q}%` } },
13
+ ];
14
+ }
15
+ const [users, count] = await userService.listAndCountUsers(filters, { limit, offset });
7
16
  const safeUsers = users.map(({ password_hash: _, ...u }) => u);
8
17
  res.json({ users: safeUsers, count, limit, offset });
9
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/users/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACjF,MAAM,SAAS,GAAI,KAAe,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACzE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/api/admin/users/route.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAEnE,MAAM,OAAO,GAA4B,EAAE,CAAA;QAC3C,IAAI,CAAC,EAAE,CAAC;YACN,OAAO,CAAC,GAAG,GAAG;gBACZ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;gBAC/B,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;gBACpC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;aACpC,CAAA;QACH,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACtF,MAAM,SAAS,GAAI,KAAe,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QACzE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridianjs/meridian",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Default API routes, workflows, links, and subscribers for Meridian applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -20,13 +20,13 @@
20
20
  "prepublishOnly": "cd ../.. && npm run check:routes && cd packages/meridian && npm run build"
21
21
  },
22
22
  "dependencies": {
23
- "@meridianjs/framework": "^1.6.0",
24
- "@meridianjs/framework-utils": "^1.6.0",
25
- "@meridianjs/workflow-engine": "^1.6.0",
26
- "@meridianjs/types": "^1.6.0",
23
+ "@meridianjs/framework": "^1.8.0",
24
+ "@meridianjs/framework-utils": "^1.8.0",
25
+ "@meridianjs/workflow-engine": "^1.8.0",
26
+ "@meridianjs/types": "^1.8.0",
27
27
  "@meridianjs/user": "^1.0.0",
28
28
  "@meridianjs/workspace": "^1.1.0",
29
- "@meridianjs/auth": "^1.6.0",
29
+ "@meridianjs/auth": "^1.8.0",
30
30
  "@meridianjs/project": "^1.0.0",
31
31
  "@meridianjs/issue": "^1.0.0",
32
32
  "@meridianjs/sprint": "^1.0.0",