@sudobility/entity_service 1.0.1

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 (72) hide show
  1. package/CLAUDE.md +124 -0
  2. package/dist/helpers/EntityHelper.cjs +234 -0
  3. package/dist/helpers/EntityHelper.d.ts +60 -0
  4. package/dist/helpers/EntityHelper.d.ts.map +1 -0
  5. package/dist/helpers/EntityHelper.js +234 -0
  6. package/dist/helpers/EntityHelper.js.map +1 -0
  7. package/dist/helpers/EntityMemberHelper.cjs +215 -0
  8. package/dist/helpers/EntityMemberHelper.d.ts +45 -0
  9. package/dist/helpers/EntityMemberHelper.d.ts.map +1 -0
  10. package/dist/helpers/EntityMemberHelper.js +215 -0
  11. package/dist/helpers/EntityMemberHelper.js.map +1 -0
  12. package/dist/helpers/InvitationHelper.cjs +251 -0
  13. package/dist/helpers/InvitationHelper.d.ts +59 -0
  14. package/dist/helpers/InvitationHelper.d.ts.map +1 -0
  15. package/dist/helpers/InvitationHelper.js +251 -0
  16. package/dist/helpers/InvitationHelper.js.map +1 -0
  17. package/dist/helpers/PermissionHelper.cjs +197 -0
  18. package/dist/helpers/PermissionHelper.d.ts +86 -0
  19. package/dist/helpers/PermissionHelper.d.ts.map +1 -0
  20. package/dist/helpers/PermissionHelper.js +197 -0
  21. package/dist/helpers/PermissionHelper.js.map +1 -0
  22. package/dist/helpers/index.cjs +15 -0
  23. package/dist/helpers/index.d.ts +8 -0
  24. package/dist/helpers/index.d.ts.map +1 -0
  25. package/dist/helpers/index.js +15 -0
  26. package/dist/helpers/index.js.map +1 -0
  27. package/dist/index.cjs +76 -0
  28. package/dist/index.d.ts +36 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +76 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/middleware/hono.cjs +148 -0
  33. package/dist/middleware/hono.d.ts +102 -0
  34. package/dist/middleware/hono.d.ts.map +1 -0
  35. package/dist/middleware/hono.js +148 -0
  36. package/dist/middleware/hono.js.map +1 -0
  37. package/dist/middleware/index.cjs +12 -0
  38. package/dist/middleware/index.d.ts +5 -0
  39. package/dist/middleware/index.d.ts.map +1 -0
  40. package/dist/middleware/index.js +12 -0
  41. package/dist/middleware/index.js.map +1 -0
  42. package/dist/migrations/001_add_entities.cjs +269 -0
  43. package/dist/migrations/001_add_entities.d.ts +29 -0
  44. package/dist/migrations/001_add_entities.d.ts.map +1 -0
  45. package/dist/migrations/001_add_entities.js +269 -0
  46. package/dist/migrations/001_add_entities.js.map +1 -0
  47. package/dist/migrations/index.cjs +10 -0
  48. package/dist/migrations/index.d.ts +5 -0
  49. package/dist/migrations/index.d.ts.map +1 -0
  50. package/dist/migrations/index.js +10 -0
  51. package/dist/migrations/index.js.map +1 -0
  52. package/dist/schema/entities.cjs +304 -0
  53. package/dist/schema/entities.d.ts +1047 -0
  54. package/dist/schema/entities.d.ts.map +1 -0
  55. package/dist/schema/entities.js +304 -0
  56. package/dist/schema/entities.js.map +1 -0
  57. package/dist/types/index.cjs +14 -0
  58. package/dist/types/index.d.ts +71 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +14 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/utils/index.cjs +21 -0
  63. package/dist/utils/index.d.ts +5 -0
  64. package/dist/utils/index.d.ts.map +1 -0
  65. package/dist/utils/index.js +21 -0
  66. package/dist/utils/index.js.map +1 -0
  67. package/dist/utils/slug-generator.cjs +92 -0
  68. package/dist/utils/slug-generator.d.ts +41 -0
  69. package/dist/utils/slug-generator.d.ts.map +1 -0
  70. package/dist/utils/slug-generator.js +92 -0
  71. package/dist/utils/slug-generator.js.map +1 -0
  72. package/package.json +78 -0
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Entity Service Library
4
+ * @description Shared backend library for multi-tenant entity/organization management
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import {
9
+ * createEntityHelpers,
10
+ * createEntityContextMiddleware,
11
+ * entities,
12
+ * entityMembers,
13
+ * entityInvitations,
14
+ * } from '@shapeshyft/entity-service';
15
+ *
16
+ * // Create helpers with your database config
17
+ * const helpers = createEntityHelpers({
18
+ * db: drizzleDb,
19
+ * entitiesTable: mySchema.entities,
20
+ * membersTable: mySchema.entityMembers,
21
+ * invitationsTable: mySchema.entityInvitations,
22
+ * usersTable: mySchema.users,
23
+ * });
24
+ *
25
+ * // Use in your routes
26
+ * const entity = await helpers.entity.getOrCreatePersonalEntity(userId, email);
27
+ * const members = await helpers.members.getMembers(entityId);
28
+ * ```
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.ROLE_PERMISSIONS = exports.InvitationStatus = exports.EntityRole = exports.EntityType = exports.rollbackEntityMigration = exports.runEntityMigration = exports.calculateInvitationExpiry = exports.validateSlug = exports.normalizeSlug = exports.generateInvitationToken = exports.generateEntitySlug = exports.createEntityHelpers = exports.createRequireRoleMiddleware = exports.createRequirePermissionMiddleware = exports.createEntityContextMiddleware = exports.PermissionHelper = exports.InvitationHelper = exports.EntityMemberHelper = exports.EntityHelper = exports.initEntityTables = exports.entityInvitations = exports.entityMembers = exports.entities = exports.createEntityInvitationsTablePublic = exports.createEntityInvitationsTable = exports.createEntityMembersTablePublic = exports.createEntityMembersTable = exports.createEntitiesTablePublic = exports.createEntitiesTable = void 0;
32
+ // Schema exports
33
+ var entities_1 = require("./schema/entities");
34
+ // Table factory functions
35
+ Object.defineProperty(exports, "createEntitiesTable", { enumerable: true, get: function () { return entities_1.createEntitiesTable; } });
36
+ Object.defineProperty(exports, "createEntitiesTablePublic", { enumerable: true, get: function () { return entities_1.createEntitiesTablePublic; } });
37
+ Object.defineProperty(exports, "createEntityMembersTable", { enumerable: true, get: function () { return entities_1.createEntityMembersTable; } });
38
+ Object.defineProperty(exports, "createEntityMembersTablePublic", { enumerable: true, get: function () { return entities_1.createEntityMembersTablePublic; } });
39
+ Object.defineProperty(exports, "createEntityInvitationsTable", { enumerable: true, get: function () { return entities_1.createEntityInvitationsTable; } });
40
+ Object.defineProperty(exports, "createEntityInvitationsTablePublic", { enumerable: true, get: function () { return entities_1.createEntityInvitationsTablePublic; } });
41
+ // Default tables (public schema)
42
+ Object.defineProperty(exports, "entities", { enumerable: true, get: function () { return entities_1.entities; } });
43
+ Object.defineProperty(exports, "entityMembers", { enumerable: true, get: function () { return entities_1.entityMembers; } });
44
+ Object.defineProperty(exports, "entityInvitations", { enumerable: true, get: function () { return entities_1.entityInvitations; } });
45
+ // Initialization
46
+ Object.defineProperty(exports, "initEntityTables", { enumerable: true, get: function () { return entities_1.initEntityTables; } });
47
+ // Helper exports
48
+ var helpers_1 = require("./helpers");
49
+ Object.defineProperty(exports, "EntityHelper", { enumerable: true, get: function () { return helpers_1.EntityHelper; } });
50
+ Object.defineProperty(exports, "EntityMemberHelper", { enumerable: true, get: function () { return helpers_1.EntityMemberHelper; } });
51
+ Object.defineProperty(exports, "InvitationHelper", { enumerable: true, get: function () { return helpers_1.InvitationHelper; } });
52
+ Object.defineProperty(exports, "PermissionHelper", { enumerable: true, get: function () { return helpers_1.PermissionHelper; } });
53
+ // Middleware exports
54
+ var middleware_1 = require("./middleware");
55
+ Object.defineProperty(exports, "createEntityContextMiddleware", { enumerable: true, get: function () { return middleware_1.createEntityContextMiddleware; } });
56
+ Object.defineProperty(exports, "createRequirePermissionMiddleware", { enumerable: true, get: function () { return middleware_1.createRequirePermissionMiddleware; } });
57
+ Object.defineProperty(exports, "createRequireRoleMiddleware", { enumerable: true, get: function () { return middleware_1.createRequireRoleMiddleware; } });
58
+ Object.defineProperty(exports, "createEntityHelpers", { enumerable: true, get: function () { return middleware_1.createEntityHelpers; } });
59
+ // Utility exports
60
+ var utils_1 = require("./utils");
61
+ Object.defineProperty(exports, "generateEntitySlug", { enumerable: true, get: function () { return utils_1.generateEntitySlug; } });
62
+ Object.defineProperty(exports, "generateInvitationToken", { enumerable: true, get: function () { return utils_1.generateInvitationToken; } });
63
+ Object.defineProperty(exports, "normalizeSlug", { enumerable: true, get: function () { return utils_1.normalizeSlug; } });
64
+ Object.defineProperty(exports, "validateSlug", { enumerable: true, get: function () { return utils_1.validateSlug; } });
65
+ Object.defineProperty(exports, "calculateInvitationExpiry", { enumerable: true, get: function () { return utils_1.calculateInvitationExpiry; } });
66
+ // Migration exports
67
+ var migrations_1 = require("./migrations");
68
+ Object.defineProperty(exports, "runEntityMigration", { enumerable: true, get: function () { return migrations_1.runEntityMigration; } });
69
+ Object.defineProperty(exports, "rollbackEntityMigration", { enumerable: true, get: function () { return migrations_1.rollbackEntityMigration; } });
70
+ // Type exports (re-exported from @sudobility/types)
71
+ var types_1 = require("./types");
72
+ Object.defineProperty(exports, "EntityType", { enumerable: true, get: function () { return types_1.EntityType; } });
73
+ Object.defineProperty(exports, "EntityRole", { enumerable: true, get: function () { return types_1.EntityRole; } });
74
+ Object.defineProperty(exports, "InvitationStatus", { enumerable: true, get: function () { return types_1.InvitationStatus; } });
75
+ Object.defineProperty(exports, "ROLE_PERMISSIONS", { enumerable: true, get: function () { return types_1.ROLE_PERMISSIONS; } });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAEH,iBAAiB;AACjB,8CAqB2B;AApBzB,0BAA0B;AAC1B,+GAAA,mBAAmB,OAAA;AACnB,qHAAA,yBAAyB,OAAA;AACzB,oHAAA,wBAAwB,OAAA;AACxB,0HAAA,8BAA8B,OAAA;AAC9B,wHAAA,4BAA4B,OAAA;AAC5B,8HAAA,kCAAkC,OAAA;AAClC,iCAAiC;AACjC,oGAAA,QAAQ,OAAA;AACR,yGAAA,aAAa,OAAA;AACb,6GAAA,iBAAiB,OAAA;AAQjB,iBAAiB;AACjB,4GAAA,gBAAgB,OAAA;AAGlB,iBAAiB;AACjB,qCAKmB;AAJjB,uGAAA,YAAY,OAAA;AACZ,6GAAA,kBAAkB,OAAA;AAClB,2GAAA,gBAAgB,OAAA;AAChB,2GAAA,gBAAgB,OAAA;AAGlB,qBAAqB;AACrB,2CAOsB;AANpB,2HAAA,6BAA6B,OAAA;AAC7B,+HAAA,iCAAiC,OAAA;AACjC,yHAAA,2BAA2B,OAAA;AAC3B,iHAAA,mBAAmB,OAAA;AAKrB,kBAAkB;AAClB,iCAMiB;AALf,2GAAA,kBAAkB,OAAA;AAClB,gHAAA,uBAAuB,OAAA;AACvB,sGAAA,aAAa,OAAA;AACb,qGAAA,YAAY,OAAA;AACZ,kHAAA,yBAAyB,OAAA;AAG3B,oBAAoB;AACpB,2CAIsB;AAHpB,gHAAA,kBAAkB,OAAA;AAClB,qHAAA,uBAAuB,OAAA;AAIzB,oDAAoD;AACpD,iCAeiB;AAdf,mGAAA,UAAU,OAAA;AACV,mGAAA,UAAU,OAAA;AACV,yGAAA,gBAAgB,OAAA;AAChB,yGAAA,gBAAgB,OAAA"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Hono Middleware for Entity Context
4
+ * @description Middleware to inject entity context into Hono request handlers
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createEntityContextMiddleware = createEntityContextMiddleware;
8
+ exports.createRequirePermissionMiddleware = createRequirePermissionMiddleware;
9
+ exports.createRequireRoleMiddleware = createRequireRoleMiddleware;
10
+ exports.createEntityHelpers = createEntityHelpers;
11
+ const EntityHelper_1 = require("../helpers/EntityHelper");
12
+ const EntityMemberHelper_1 = require("../helpers/EntityMemberHelper");
13
+ const InvitationHelper_1 = require("../helpers/InvitationHelper");
14
+ const PermissionHelper_1 = require("../helpers/PermissionHelper");
15
+ const types_1 = require("../types");
16
+ /**
17
+ * Create middleware that injects entity context into the request.
18
+ *
19
+ * Usage:
20
+ * ```typescript
21
+ * const entityContext = createEntityContextMiddleware(config, {
22
+ * getUserId: (c) => c.get('userId'),
23
+ * entitySlugParam: 'entitySlug',
24
+ * });
25
+ *
26
+ * app.use('/api/v1/entities/:entitySlug/*', entityContext);
27
+ *
28
+ * app.get('/api/v1/entities/:entitySlug/projects', (c) => {
29
+ * const { entity, userRole, permissions } = c.get('entityContext');
30
+ * // ...
31
+ * });
32
+ * ```
33
+ */
34
+ function createEntityContextMiddleware(config, options) {
35
+ const entityHelper = new EntityHelper_1.EntityHelper(config);
36
+ const permissionHelper = new PermissionHelper_1.PermissionHelper(config);
37
+ const slugParam = options.entitySlugParam ?? 'entitySlug';
38
+ return async (c, next) => {
39
+ const entitySlug = c.req.param(slugParam);
40
+ if (!entitySlug) {
41
+ return c.json({ error: 'Entity slug is required' }, 400);
42
+ }
43
+ const userId = options.getUserId(c);
44
+ if (!userId && !options.allowUnauthenticated) {
45
+ return c.json({ error: 'Authentication required' }, 401);
46
+ }
47
+ // Get entity by slug
48
+ const entity = await entityHelper.getEntityBySlug(entitySlug);
49
+ if (!entity) {
50
+ return c.json({ error: 'Entity not found' }, 404);
51
+ }
52
+ // If unauthenticated access is allowed and no user, continue without role
53
+ if (!userId && options.allowUnauthenticated) {
54
+ c.set('entity', entity);
55
+ await next();
56
+ return;
57
+ }
58
+ // Get user's role and permissions
59
+ const userRole = await permissionHelper.getUserRole(entity.id, userId);
60
+ if (!userRole) {
61
+ return c.json({ error: 'Access denied' }, 403);
62
+ }
63
+ const permissions = permissionHelper.getPermissionsForRole(userRole);
64
+ // Set entity context
65
+ const entityContext = {
66
+ entity,
67
+ userRole,
68
+ permissions,
69
+ };
70
+ c.set('entityContext', entityContext);
71
+ c.set('entity', entity);
72
+ c.set('userRole', userRole);
73
+ c.set('permissions', permissions);
74
+ await next();
75
+ };
76
+ }
77
+ /**
78
+ * Create middleware that requires a specific permission.
79
+ *
80
+ * Usage:
81
+ * ```typescript
82
+ * const requireAdmin = createRequirePermissionMiddleware('canManageMembers');
83
+ *
84
+ * app.post('/api/v1/entities/:entitySlug/members', requireAdmin, (c) => {
85
+ * // Only admins can reach here
86
+ * });
87
+ * ```
88
+ */
89
+ function createRequirePermissionMiddleware(permission) {
90
+ return async (c, next) => {
91
+ const permissions = c.get('permissions');
92
+ if (!permissions) {
93
+ return c.json({ error: 'Entity context not found' }, 500);
94
+ }
95
+ if (!permissions[permission]) {
96
+ return c.json({ error: 'Insufficient permissions' }, 403);
97
+ }
98
+ await next();
99
+ };
100
+ }
101
+ /**
102
+ * Create middleware that requires a minimum role.
103
+ *
104
+ * Usage:
105
+ * ```typescript
106
+ * const requireManager = createRequireRoleMiddleware(EntityRole.MANAGER);
107
+ *
108
+ * app.post('/api/v1/entities/:entitySlug/projects', requireManager, (c) => {
109
+ * // Only managers and admins can reach here
110
+ * });
111
+ * ```
112
+ */
113
+ function createRequireRoleMiddleware(minimumRole) {
114
+ const roleHierarchy = {
115
+ [types_1.EntityRole.VIEWER]: 0,
116
+ [types_1.EntityRole.MANAGER]: 1,
117
+ [types_1.EntityRole.ADMIN]: 2,
118
+ };
119
+ return async (c, next) => {
120
+ const userRole = c.get('userRole');
121
+ if (!userRole) {
122
+ return c.json({ error: 'Entity context not found' }, 500);
123
+ }
124
+ if (roleHierarchy[userRole] < roleHierarchy[minimumRole]) {
125
+ return c.json({ error: 'Insufficient role' }, 403);
126
+ }
127
+ await next();
128
+ };
129
+ }
130
+ /**
131
+ * Create all entity helpers with shared config.
132
+ *
133
+ * Usage:
134
+ * ```typescript
135
+ * const helpers = createEntityHelpers(config);
136
+ * const entity = await helpers.entity.getEntity(entityId);
137
+ * const members = await helpers.members.getMembers(entityId);
138
+ * ```
139
+ */
140
+ function createEntityHelpers(config) {
141
+ return {
142
+ entity: new EntityHelper_1.EntityHelper(config),
143
+ members: new EntityMemberHelper_1.EntityMemberHelper(config),
144
+ invitations: new InvitationHelper_1.InvitationHelper(config),
145
+ permissions: new PermissionHelper_1.PermissionHelper(config),
146
+ };
147
+ }
148
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @fileoverview Hono Middleware for Entity Context
3
+ * @description Middleware to inject entity context into Hono request handlers
4
+ */
5
+ import type { Context, MiddlewareHandler } from 'hono';
6
+ import { EntityHelper } from '../helpers/EntityHelper';
7
+ import { EntityMemberHelper } from '../helpers/EntityMemberHelper';
8
+ import { InvitationHelper } from '../helpers/InvitationHelper';
9
+ import { PermissionHelper } from '../helpers/PermissionHelper';
10
+ import { EntityRole, type Entity, type EntityPermissions, type InvitationHelperConfig } from '../types';
11
+ /**
12
+ * Entity context available in Hono handlers.
13
+ */
14
+ export interface EntityContext {
15
+ entity: Entity;
16
+ userRole: EntityRole;
17
+ permissions: EntityPermissions;
18
+ }
19
+ /**
20
+ * Options for entity context middleware.
21
+ */
22
+ export interface EntityContextMiddlewareOptions {
23
+ /** Function to get the user ID from the request context */
24
+ getUserId: (c: Context) => string | null;
25
+ /** Parameter name for entity slug in URL (default: 'entitySlug') */
26
+ entitySlugParam?: string;
27
+ /** Whether to allow unauthenticated access (default: false) */
28
+ allowUnauthenticated?: boolean;
29
+ }
30
+ /**
31
+ * Create middleware that injects entity context into the request.
32
+ *
33
+ * Usage:
34
+ * ```typescript
35
+ * const entityContext = createEntityContextMiddleware(config, {
36
+ * getUserId: (c) => c.get('userId'),
37
+ * entitySlugParam: 'entitySlug',
38
+ * });
39
+ *
40
+ * app.use('/api/v1/entities/:entitySlug/*', entityContext);
41
+ *
42
+ * app.get('/api/v1/entities/:entitySlug/projects', (c) => {
43
+ * const { entity, userRole, permissions } = c.get('entityContext');
44
+ * // ...
45
+ * });
46
+ * ```
47
+ */
48
+ export declare function createEntityContextMiddleware(config: InvitationHelperConfig, options: EntityContextMiddlewareOptions): MiddlewareHandler;
49
+ /**
50
+ * Create middleware that requires a specific permission.
51
+ *
52
+ * Usage:
53
+ * ```typescript
54
+ * const requireAdmin = createRequirePermissionMiddleware('canManageMembers');
55
+ *
56
+ * app.post('/api/v1/entities/:entitySlug/members', requireAdmin, (c) => {
57
+ * // Only admins can reach here
58
+ * });
59
+ * ```
60
+ */
61
+ export declare function createRequirePermissionMiddleware(permission: keyof EntityPermissions): MiddlewareHandler;
62
+ /**
63
+ * Create middleware that requires a minimum role.
64
+ *
65
+ * Usage:
66
+ * ```typescript
67
+ * const requireManager = createRequireRoleMiddleware(EntityRole.MANAGER);
68
+ *
69
+ * app.post('/api/v1/entities/:entitySlug/projects', requireManager, (c) => {
70
+ * // Only managers and admins can reach here
71
+ * });
72
+ * ```
73
+ */
74
+ export declare function createRequireRoleMiddleware(minimumRole: EntityRole): MiddlewareHandler;
75
+ /**
76
+ * Create all entity helpers with shared config.
77
+ *
78
+ * Usage:
79
+ * ```typescript
80
+ * const helpers = createEntityHelpers(config);
81
+ * const entity = await helpers.entity.getEntity(entityId);
82
+ * const members = await helpers.members.getMembers(entityId);
83
+ * ```
84
+ */
85
+ export declare function createEntityHelpers(config: InvitationHelperConfig): {
86
+ entity: EntityHelper;
87
+ members: EntityMemberHelper;
88
+ invitations: InvitationHelper;
89
+ permissions: PermissionHelper;
90
+ };
91
+ /**
92
+ * Type augmentation for Hono context.
93
+ */
94
+ declare module 'hono' {
95
+ interface ContextVariableMap {
96
+ entityContext: EntityContext;
97
+ entity: Entity;
98
+ userRole: EntityRole;
99
+ permissions: EntityPermissions;
100
+ }
101
+ }
102
+ //# sourceMappingURL=hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/middleware/hono.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,KAAK,MAAM,EACX,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,2DAA2D;IAC3D,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IACzC,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,8BAA8B,GACtC,iBAAiB,CAuDnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,MAAM,iBAAiB,GAClC,iBAAiB,CAcnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,UAAU,GACtB,iBAAiB,CAoBnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,sBAAsB;;;;;EAOjE;AAED;;GAEG;AACH,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,aAAa,EAAE,aAAa,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,UAAU,CAAC;QACrB,WAAW,EAAE,iBAAiB,CAAC;KAChC;CACF"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Hono Middleware for Entity Context
4
+ * @description Middleware to inject entity context into Hono request handlers
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createEntityContextMiddleware = createEntityContextMiddleware;
8
+ exports.createRequirePermissionMiddleware = createRequirePermissionMiddleware;
9
+ exports.createRequireRoleMiddleware = createRequireRoleMiddleware;
10
+ exports.createEntityHelpers = createEntityHelpers;
11
+ const EntityHelper_1 = require("../helpers/EntityHelper");
12
+ const EntityMemberHelper_1 = require("../helpers/EntityMemberHelper");
13
+ const InvitationHelper_1 = require("../helpers/InvitationHelper");
14
+ const PermissionHelper_1 = require("../helpers/PermissionHelper");
15
+ const types_1 = require("../types");
16
+ /**
17
+ * Create middleware that injects entity context into the request.
18
+ *
19
+ * Usage:
20
+ * ```typescript
21
+ * const entityContext = createEntityContextMiddleware(config, {
22
+ * getUserId: (c) => c.get('userId'),
23
+ * entitySlugParam: 'entitySlug',
24
+ * });
25
+ *
26
+ * app.use('/api/v1/entities/:entitySlug/*', entityContext);
27
+ *
28
+ * app.get('/api/v1/entities/:entitySlug/projects', (c) => {
29
+ * const { entity, userRole, permissions } = c.get('entityContext');
30
+ * // ...
31
+ * });
32
+ * ```
33
+ */
34
+ function createEntityContextMiddleware(config, options) {
35
+ const entityHelper = new EntityHelper_1.EntityHelper(config);
36
+ const permissionHelper = new PermissionHelper_1.PermissionHelper(config);
37
+ const slugParam = options.entitySlugParam ?? 'entitySlug';
38
+ return async (c, next) => {
39
+ const entitySlug = c.req.param(slugParam);
40
+ if (!entitySlug) {
41
+ return c.json({ error: 'Entity slug is required' }, 400);
42
+ }
43
+ const userId = options.getUserId(c);
44
+ if (!userId && !options.allowUnauthenticated) {
45
+ return c.json({ error: 'Authentication required' }, 401);
46
+ }
47
+ // Get entity by slug
48
+ const entity = await entityHelper.getEntityBySlug(entitySlug);
49
+ if (!entity) {
50
+ return c.json({ error: 'Entity not found' }, 404);
51
+ }
52
+ // If unauthenticated access is allowed and no user, continue without role
53
+ if (!userId && options.allowUnauthenticated) {
54
+ c.set('entity', entity);
55
+ await next();
56
+ return;
57
+ }
58
+ // Get user's role and permissions
59
+ const userRole = await permissionHelper.getUserRole(entity.id, userId);
60
+ if (!userRole) {
61
+ return c.json({ error: 'Access denied' }, 403);
62
+ }
63
+ const permissions = permissionHelper.getPermissionsForRole(userRole);
64
+ // Set entity context
65
+ const entityContext = {
66
+ entity,
67
+ userRole,
68
+ permissions,
69
+ };
70
+ c.set('entityContext', entityContext);
71
+ c.set('entity', entity);
72
+ c.set('userRole', userRole);
73
+ c.set('permissions', permissions);
74
+ await next();
75
+ };
76
+ }
77
+ /**
78
+ * Create middleware that requires a specific permission.
79
+ *
80
+ * Usage:
81
+ * ```typescript
82
+ * const requireAdmin = createRequirePermissionMiddleware('canManageMembers');
83
+ *
84
+ * app.post('/api/v1/entities/:entitySlug/members', requireAdmin, (c) => {
85
+ * // Only admins can reach here
86
+ * });
87
+ * ```
88
+ */
89
+ function createRequirePermissionMiddleware(permission) {
90
+ return async (c, next) => {
91
+ const permissions = c.get('permissions');
92
+ if (!permissions) {
93
+ return c.json({ error: 'Entity context not found' }, 500);
94
+ }
95
+ if (!permissions[permission]) {
96
+ return c.json({ error: 'Insufficient permissions' }, 403);
97
+ }
98
+ await next();
99
+ };
100
+ }
101
+ /**
102
+ * Create middleware that requires a minimum role.
103
+ *
104
+ * Usage:
105
+ * ```typescript
106
+ * const requireManager = createRequireRoleMiddleware(EntityRole.MANAGER);
107
+ *
108
+ * app.post('/api/v1/entities/:entitySlug/projects', requireManager, (c) => {
109
+ * // Only managers and admins can reach here
110
+ * });
111
+ * ```
112
+ */
113
+ function createRequireRoleMiddleware(minimumRole) {
114
+ const roleHierarchy = {
115
+ [types_1.EntityRole.VIEWER]: 0,
116
+ [types_1.EntityRole.MANAGER]: 1,
117
+ [types_1.EntityRole.ADMIN]: 2,
118
+ };
119
+ return async (c, next) => {
120
+ const userRole = c.get('userRole');
121
+ if (!userRole) {
122
+ return c.json({ error: 'Entity context not found' }, 500);
123
+ }
124
+ if (roleHierarchy[userRole] < roleHierarchy[minimumRole]) {
125
+ return c.json({ error: 'Insufficient role' }, 403);
126
+ }
127
+ await next();
128
+ };
129
+ }
130
+ /**
131
+ * Create all entity helpers with shared config.
132
+ *
133
+ * Usage:
134
+ * ```typescript
135
+ * const helpers = createEntityHelpers(config);
136
+ * const entity = await helpers.entity.getEntity(entityId);
137
+ * const members = await helpers.members.getMembers(entityId);
138
+ * ```
139
+ */
140
+ function createEntityHelpers(config) {
141
+ return {
142
+ entity: new EntityHelper_1.EntityHelper(config),
143
+ members: new EntityMemberHelper_1.EntityMemberHelper(config),
144
+ invitations: new InvitationHelper_1.InvitationHelper(config),
145
+ permissions: new PermissionHelper_1.PermissionHelper(config),
146
+ };
147
+ }
148
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/middleware/hono.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Middleware Exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createEntityHelpers = exports.createRequireRoleMiddleware = exports.createRequirePermissionMiddleware = exports.createEntityContextMiddleware = void 0;
7
+ var hono_1 = require("./hono");
8
+ Object.defineProperty(exports, "createEntityContextMiddleware", { enumerable: true, get: function () { return hono_1.createEntityContextMiddleware; } });
9
+ Object.defineProperty(exports, "createRequirePermissionMiddleware", { enumerable: true, get: function () { return hono_1.createRequirePermissionMiddleware; } });
10
+ Object.defineProperty(exports, "createRequireRoleMiddleware", { enumerable: true, get: function () { return hono_1.createRequireRoleMiddleware; } });
11
+ Object.defineProperty(exports, "createEntityHelpers", { enumerable: true, get: function () { return hono_1.createEntityHelpers; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @fileoverview Middleware Exports
3
+ */
4
+ export { createEntityContextMiddleware, createRequirePermissionMiddleware, createRequireRoleMiddleware, createEntityHelpers, type EntityContext, type EntityContextMiddlewareOptions, } from './hono';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,EACjC,2BAA2B,EAC3B,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,8BAA8B,GACpC,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Middleware Exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createEntityHelpers = exports.createRequireRoleMiddleware = exports.createRequirePermissionMiddleware = exports.createEntityContextMiddleware = void 0;
7
+ var hono_1 = require("./hono");
8
+ Object.defineProperty(exports, "createEntityContextMiddleware", { enumerable: true, get: function () { return hono_1.createEntityContextMiddleware; } });
9
+ Object.defineProperty(exports, "createRequirePermissionMiddleware", { enumerable: true, get: function () { return hono_1.createRequirePermissionMiddleware; } });
10
+ Object.defineProperty(exports, "createRequireRoleMiddleware", { enumerable: true, get: function () { return hono_1.createRequireRoleMiddleware; } });
11
+ Object.defineProperty(exports, "createEntityHelpers", { enumerable: true, get: function () { return hono_1.createEntityHelpers; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,+BAOgB;AANd,qHAAA,6BAA6B,OAAA;AAC7B,yHAAA,iCAAiC,OAAA;AACjC,mHAAA,2BAA2B,OAAA;AAC3B,2GAAA,mBAAmB,OAAA"}