@package-broker/core 0.7.1 → 0.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.
Files changed (197) hide show
  1. package/dist/factory.d.ts +2 -2
  2. package/dist/factory.d.ts.map +1 -1
  3. package/dist/factory.js +186 -66
  4. package/dist/factory.js.map +1 -1
  5. package/dist/modules/admin/admin.handlers.d.ts +25 -0
  6. package/dist/modules/admin/admin.handlers.d.ts.map +1 -0
  7. package/dist/modules/admin/admin.handlers.js +97 -0
  8. package/dist/modules/admin/admin.handlers.js.map +1 -0
  9. package/dist/modules/admin/admin.routes.d.ts +147 -0
  10. package/dist/modules/admin/admin.routes.d.ts.map +1 -0
  11. package/dist/modules/admin/admin.routes.js +130 -0
  12. package/dist/modules/admin/admin.routes.js.map +1 -0
  13. package/dist/modules/admin/index.d.ts +9 -0
  14. package/dist/modules/admin/index.d.ts.map +1 -0
  15. package/dist/modules/admin/index.js +19 -0
  16. package/dist/modules/admin/index.js.map +1 -0
  17. package/dist/modules/artifacts/artifacts.handlers.d.ts +18 -0
  18. package/dist/modules/artifacts/artifacts.handlers.d.ts.map +1 -0
  19. package/dist/modules/artifacts/artifacts.handlers.js +47 -0
  20. package/dist/modules/artifacts/artifacts.handlers.js.map +1 -0
  21. package/dist/modules/artifacts/artifacts.routes.d.ts +80 -0
  22. package/dist/modules/artifacts/artifacts.routes.d.ts.map +1 -0
  23. package/dist/modules/artifacts/artifacts.routes.js +79 -0
  24. package/dist/modules/artifacts/artifacts.routes.js.map +1 -0
  25. package/dist/modules/artifacts/index.d.ts +8 -0
  26. package/dist/modules/artifacts/index.d.ts.map +1 -0
  27. package/dist/modules/artifacts/index.js +14 -0
  28. package/dist/modules/artifacts/index.js.map +1 -0
  29. package/dist/modules/auth/auth.handlers.d.ts +51 -0
  30. package/dist/modules/auth/auth.handlers.d.ts.map +1 -0
  31. package/dist/modules/auth/auth.handlers.js +278 -0
  32. package/dist/modules/auth/auth.handlers.js.map +1 -0
  33. package/dist/modules/auth/auth.routes.d.ts +187 -0
  34. package/dist/modules/auth/auth.routes.d.ts.map +1 -0
  35. package/dist/modules/auth/auth.routes.js +136 -0
  36. package/dist/modules/auth/auth.routes.js.map +1 -0
  37. package/dist/modules/auth/index.d.ts +11 -0
  38. package/dist/modules/auth/index.d.ts.map +1 -0
  39. package/dist/modules/auth/index.js +34 -0
  40. package/dist/modules/auth/index.js.map +1 -0
  41. package/dist/modules/composer/composer.handlers.d.ts +3 -0
  42. package/dist/modules/composer/composer.handlers.d.ts.map +1 -0
  43. package/dist/modules/composer/composer.handlers.js +12 -0
  44. package/dist/modules/composer/composer.handlers.js.map +1 -0
  45. package/dist/modules/composer/index.d.ts +11 -0
  46. package/dist/modules/composer/index.d.ts.map +1 -0
  47. package/dist/modules/composer/index.js +40 -0
  48. package/dist/modules/composer/index.js.map +1 -0
  49. package/dist/modules/packages/index.d.ts +8 -0
  50. package/dist/modules/packages/index.d.ts.map +1 -0
  51. package/dist/modules/packages/index.js +19 -0
  52. package/dist/modules/packages/index.js.map +1 -0
  53. package/dist/modules/packages/packages.handlers.d.ts +50 -0
  54. package/dist/modules/packages/packages.handlers.d.ts.map +1 -0
  55. package/dist/modules/packages/packages.handlers.js +670 -0
  56. package/dist/modules/packages/packages.handlers.js.map +1 -0
  57. package/dist/modules/packages/packages.routes.d.ts +172 -0
  58. package/dist/modules/packages/packages.routes.d.ts.map +1 -0
  59. package/dist/modules/packages/packages.routes.js +160 -0
  60. package/dist/modules/packages/packages.routes.js.map +1 -0
  61. package/dist/modules/repositories/index.d.ts +8 -0
  62. package/dist/modules/repositories/index.d.ts.map +1 -0
  63. package/dist/modules/repositories/index.js +19 -0
  64. package/dist/modules/repositories/index.js.map +1 -0
  65. package/dist/modules/repositories/repositories.handlers.d.ts +29 -0
  66. package/dist/modules/repositories/repositories.handlers.d.ts.map +1 -0
  67. package/dist/modules/repositories/repositories.handlers.js +261 -0
  68. package/dist/modules/repositories/repositories.handlers.js.map +1 -0
  69. package/dist/modules/repositories/repositories.routes.d.ts +451 -0
  70. package/dist/modules/repositories/repositories.routes.d.ts.map +1 -0
  71. package/dist/modules/repositories/repositories.routes.js +264 -0
  72. package/dist/modules/repositories/repositories.routes.js.map +1 -0
  73. package/dist/modules/system/index.d.ts +8 -0
  74. package/dist/modules/system/index.d.ts.map +1 -0
  75. package/dist/modules/system/index.js +13 -0
  76. package/dist/modules/system/index.js.map +1 -0
  77. package/dist/modules/system/system.handlers.d.ts +9 -0
  78. package/dist/modules/system/system.handlers.d.ts.map +1 -0
  79. package/dist/modules/system/system.handlers.js +22 -0
  80. package/dist/modules/system/system.handlers.js.map +1 -0
  81. package/dist/modules/system/system.routes.d.ts +24 -0
  82. package/dist/modules/system/system.routes.d.ts.map +1 -0
  83. package/dist/modules/system/system.routes.js +27 -0
  84. package/dist/modules/system/system.routes.js.map +1 -0
  85. package/dist/modules/tokens/index.d.ts +8 -0
  86. package/dist/modules/tokens/index.d.ts.map +1 -0
  87. package/dist/modules/tokens/index.js +16 -0
  88. package/dist/modules/tokens/index.js.map +1 -0
  89. package/dist/modules/tokens/tokens.handlers.d.ts +22 -0
  90. package/dist/modules/tokens/tokens.handlers.d.ts.map +1 -0
  91. package/dist/modules/tokens/tokens.handlers.js +150 -0
  92. package/dist/modules/tokens/tokens.handlers.js.map +1 -0
  93. package/dist/modules/tokens/tokens.routes.d.ts +202 -0
  94. package/dist/modules/tokens/tokens.routes.d.ts.map +1 -0
  95. package/dist/modules/tokens/tokens.routes.js +143 -0
  96. package/dist/modules/tokens/tokens.routes.js.map +1 -0
  97. package/dist/modules/users/index.d.ts +8 -0
  98. package/dist/modules/users/index.d.ts.map +1 -0
  99. package/dist/modules/users/index.js +15 -0
  100. package/dist/modules/users/index.js.map +1 -0
  101. package/dist/modules/users/users.handlers.d.ts +6 -0
  102. package/dist/modules/users/users.handlers.d.ts.map +1 -0
  103. package/dist/modules/users/users.handlers.js +120 -0
  104. package/dist/modules/users/users.handlers.js.map +1 -0
  105. package/dist/modules/users/users.routes.d.ts +190 -0
  106. package/dist/modules/users/users.routes.d.ts.map +1 -0
  107. package/dist/modules/users/users.routes.js +132 -0
  108. package/dist/modules/users/users.routes.js.map +1 -0
  109. package/dist/routes/api/artifacts.d.ts +5 -3
  110. package/dist/routes/api/artifacts.d.ts.map +1 -1
  111. package/dist/routes/api/artifacts.js +2 -2
  112. package/dist/routes/api/artifacts.js.map +1 -1
  113. package/dist/routes/api/auth.d.ts +5 -3
  114. package/dist/routes/api/auth.d.ts.map +1 -1
  115. package/dist/routes/api/auth.js +2 -12
  116. package/dist/routes/api/auth.js.map +1 -1
  117. package/dist/routes/api/index.d.ts +1 -0
  118. package/dist/routes/api/index.d.ts.map +1 -1
  119. package/dist/routes/api/index.js +1 -0
  120. package/dist/routes/api/index.js.map +1 -1
  121. package/dist/routes/api/openapi/artifacts.d.ts +80 -0
  122. package/dist/routes/api/openapi/artifacts.d.ts.map +1 -0
  123. package/dist/routes/api/openapi/artifacts.js +73 -0
  124. package/dist/routes/api/openapi/artifacts.js.map +1 -0
  125. package/dist/routes/api/openapi/auth.d.ts +187 -0
  126. package/dist/routes/api/openapi/auth.d.ts.map +1 -0
  127. package/dist/routes/api/openapi/auth.js +135 -0
  128. package/dist/routes/api/openapi/auth.js.map +1 -0
  129. package/dist/routes/api/openapi/health.d.ts +24 -0
  130. package/dist/routes/api/openapi/health.d.ts.map +1 -0
  131. package/dist/routes/api/openapi/health.js +25 -0
  132. package/dist/routes/api/openapi/health.js.map +1 -0
  133. package/dist/routes/api/openapi/index.d.ts +10 -0
  134. package/dist/routes/api/openapi/index.d.ts.map +1 -0
  135. package/dist/routes/api/openapi/index.js +16 -0
  136. package/dist/routes/api/openapi/index.js.map +1 -0
  137. package/dist/routes/api/openapi/packages.d.ts +172 -0
  138. package/dist/routes/api/openapi/packages.d.ts.map +1 -0
  139. package/dist/routes/api/openapi/packages.js +126 -0
  140. package/dist/routes/api/openapi/packages.js.map +1 -0
  141. package/dist/routes/api/openapi/repositories.d.ts +451 -0
  142. package/dist/routes/api/openapi/repositories.d.ts.map +1 -0
  143. package/dist/routes/api/openapi/repositories.js +238 -0
  144. package/dist/routes/api/openapi/repositories.js.map +1 -0
  145. package/dist/routes/api/openapi/settings.d.ts +90 -0
  146. package/dist/routes/api/openapi/settings.d.ts.map +1 -0
  147. package/dist/routes/api/openapi/settings.js +72 -0
  148. package/dist/routes/api/openapi/settings.js.map +1 -0
  149. package/dist/routes/api/openapi/stats.d.ts +59 -0
  150. package/dist/routes/api/openapi/stats.d.ts.map +1 -0
  151. package/dist/routes/api/openapi/stats.js +53 -0
  152. package/dist/routes/api/openapi/stats.js.map +1 -0
  153. package/dist/routes/api/openapi/tokens.d.ts +202 -0
  154. package/dist/routes/api/openapi/tokens.d.ts.map +1 -0
  155. package/dist/routes/api/openapi/tokens.js +132 -0
  156. package/dist/routes/api/openapi/tokens.js.map +1 -0
  157. package/dist/routes/api/openapi/users.d.ts +190 -0
  158. package/dist/routes/api/openapi/users.d.ts.map +1 -0
  159. package/dist/routes/api/openapi/users.js +126 -0
  160. package/dist/routes/api/openapi/users.js.map +1 -0
  161. package/dist/routes/api/packages.d.ts +7 -4
  162. package/dist/routes/api/packages.d.ts.map +1 -1
  163. package/dist/routes/api/packages.js +6 -7
  164. package/dist/routes/api/packages.js.map +1 -1
  165. package/dist/routes/api/repositories.d.ts +8 -6
  166. package/dist/routes/api/repositories.d.ts.map +1 -1
  167. package/dist/routes/api/repositories.js +26 -22
  168. package/dist/routes/api/repositories.js.map +1 -1
  169. package/dist/routes/api/settings.d.ts +4 -3
  170. package/dist/routes/api/settings.d.ts.map +1 -1
  171. package/dist/routes/api/settings.js +1 -1
  172. package/dist/routes/api/settings.js.map +1 -1
  173. package/dist/routes/api/stats.d.ts +3 -3
  174. package/dist/routes/api/stats.d.ts.map +1 -1
  175. package/dist/routes/api/stats.js +1 -2
  176. package/dist/routes/api/stats.js.map +1 -1
  177. package/dist/routes/api/tokens.d.ts +6 -5
  178. package/dist/routes/api/tokens.d.ts.map +1 -1
  179. package/dist/routes/api/tokens.js +4 -7
  180. package/dist/routes/api/tokens.js.map +1 -1
  181. package/dist/routes/api/types.d.ts +17 -0
  182. package/dist/routes/api/types.d.ts.map +1 -0
  183. package/dist/routes/api/types.js +7 -0
  184. package/dist/routes/api/types.js.map +1 -0
  185. package/dist/routes/api/users.d.ts +5 -4
  186. package/dist/routes/api/users.d.ts.map +1 -1
  187. package/dist/routes/api/users.js +2 -12
  188. package/dist/routes/api/users.js.map +1 -1
  189. package/dist/routes/composer.js +1 -1
  190. package/dist/routes/composer.js.map +1 -1
  191. package/dist/routes/health.d.ts +3 -1
  192. package/dist/routes/health.d.ts.map +1 -1
  193. package/dist/routes/health.js.map +1 -1
  194. package/dist/utils/encryption.d.ts.map +1 -1
  195. package/dist/utils/encryption.js +8 -0
  196. package/dist/utils/encryption.js.map +1 -1
  197. package/package.json +3 -2
package/dist/factory.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Hono } from 'hono';
1
+ import { OpenAPIHono } from '@hono/zod-openapi';
2
2
  import { type StorageDriver, type DatabasePort, type CachePort } from './index';
3
3
  export interface AppBindings {
4
4
  DB?: any;
@@ -18,7 +18,7 @@ export interface AppVariables {
18
18
  email: string;
19
19
  };
20
20
  }
21
- export type AppInstance = Hono<{
21
+ export type AppInstance = OpenAPIHono<{
22
22
  Bindings: AppBindings;
23
23
  Variables: AppVariables;
24
24
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAiDH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACjB,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,WAAW;IAExB,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE;IAChC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC,GAAG,WAAW,CAiJd"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAMH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACjB,MAAM,SAAS,CAAC;AAcjB,MAAM,WAAW,WAAW;IAExB,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAE1F;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE;IAChC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC,GAAG,WAAW,CAyQd"}
package/dist/factory.js CHANGED
@@ -1,13 +1,25 @@
1
- import { Hono } from 'hono';
1
+ import { OpenAPIHono } from '@hono/zod-openapi';
2
2
  import { cors } from 'hono/cors';
3
- import { composerVersionMiddleware, authMiddleware, distAuthMiddleware, requestIdMiddleware, packagesJsonRoute, p2PackageRoute, distRoute, distMirrorRoute, distLockfileRoute, healthRoute, listRepositories, createRepository, getRepository, updateRepository, deleteRepository, verifyRepository, syncRepositoryNow, listTokens, createToken, updateToken, deleteToken, listPackages, getPackage, getPackageReadme, getPackageChangelog, getPackageStats, addPackagesFromMirror, getStats, getSettings, updatePackagistMirroring, deleteArtifact, cleanupArtifacts, cleanupNumericVersions, loginRoute, logoutRoute, meRoute, setupRoute, setup2FARoute, enable2FARoute, disable2FARoute, listUsers, createUser, deleteUser, sessionMiddleware, checkAuthRequired, acceptInviteRoute, getLogger, } from './index';
3
+ import { VERSION } from '@package-broker/shared';
4
+ import { requestIdMiddleware, getLogger, } from './index';
5
+ import authModule, { setupHandler, sessionMiddleware } from './modules/auth';
6
+ import systemModule from './modules/system';
7
+ import usersModule from './modules/users';
8
+ import repositoriesModule from './modules/repositories';
9
+ import tokensModule from './modules/tokens';
10
+ import packagesModule from './modules/packages';
11
+ import artifactsModule from './modules/artifacts';
12
+ import adminModule from './modules/admin';
13
+ import { mountComposerRoutes } from './modules/composer';
14
+ import { getPackageStatsRouteDef } from './modules/admin/admin.routes';
15
+ import { getPackageStats } from './modules/admin/admin.handlers';
4
16
  /**
5
17
  * Create the generic Hono application
6
18
  * This factory function expects drivers to be injected via middleware or arguments,
7
19
  * or it sets up the structure for them to be set.
8
20
  */
9
21
  export function createApp(options) {
10
- const app = new Hono();
22
+ const app = new OpenAPIHono();
11
23
  const logger = getLogger('info'); // Default logger, can vary per request if needed
12
24
  // Global middleware
13
25
  app.use('*', cors());
@@ -49,78 +61,186 @@ export function createApp(options) {
49
61
  if (options?.onInit) {
50
62
  options.onInit(app);
51
63
  }
52
- // Health check (no auth required)
53
- app.get('/health', healthRoute);
64
+ // Mount system module (health check) at /health
65
+ app.route('/health', systemModule);
54
66
  // API routes
55
- const apiRoutes = new Hono();
56
- // Auth routes (no session required)
57
- apiRoutes.post('/auth/login', loginRoute);
58
- apiRoutes.get('/auth/check', checkAuthRequired);
59
- apiRoutes.post('/setup', setupRoute); /* Fresh install flow */
60
- apiRoutes.post('/auth/invite/accept', acceptInviteRoute);
67
+ const apiRoutes = new OpenAPIHono();
68
+ // Mount auth module at /api/auth
69
+ // This includes: /api/auth/login, /api/auth/check, /api/auth/logout, /api/auth/me, /api/auth/2fa/*, /api/auth/invite/accept
70
+ app.route('/api/auth', authModule);
71
+ // Mount setup route separately at /api/setup (not under /api/auth)
72
+ apiRoutes.post('/setup', setupHandler);
73
+ // Define public paths that should be visible without authentication
74
+ const PUBLIC_OPENAPI_PATHS = [
75
+ '/health',
76
+ '/api/auth/login',
77
+ '/api/auth/check',
78
+ ];
79
+ // Define admin-only paths (only visible to admin users)
80
+ const ADMIN_ONLY_PATHS = [
81
+ '/api/users', // All user management endpoints
82
+ '/api/users/{id}', // Delete user
83
+ ];
84
+ // Helper function to check authentication and get user role
85
+ async function checkAuthentication(c) {
86
+ try {
87
+ const authHeader = c.req.header('Authorization');
88
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
89
+ return { authenticated: false };
90
+ }
91
+ const token = authHeader.slice(7);
92
+ let cache;
93
+ try {
94
+ cache = c.get('cache') || c.env?.KV;
95
+ }
96
+ catch (e) {
97
+ // If cache access fails, return unauthenticated
98
+ return { authenticated: false };
99
+ }
100
+ if (!cache) {
101
+ return { authenticated: false };
102
+ }
103
+ // Try to get session - handle both CachePort (getJson) and KV (get with 'json' type)
104
+ let sessionData = null;
105
+ try {
106
+ if (typeof cache.getJson === 'function') {
107
+ sessionData = await cache.getJson(`session:${token}`);
108
+ }
109
+ else if (cache.get) {
110
+ sessionData = await cache.get(`session:${token}`, 'json');
111
+ }
112
+ }
113
+ catch (e) {
114
+ // Session retrieval failed, return unauthenticated
115
+ return { authenticated: false };
116
+ }
117
+ if (!sessionData) {
118
+ return { authenticated: false };
119
+ }
120
+ return {
121
+ authenticated: true,
122
+ role: sessionData.role || 'viewer',
123
+ };
124
+ }
125
+ catch (e) {
126
+ // Any error means not authenticated
127
+ return { authenticated: false };
128
+ }
129
+ }
61
130
  // Protected routes - require session
62
- const protectedRoutes = new Hono();
131
+ const protectedRoutes = new OpenAPIHono();
63
132
  // ** SESSION MIDDLEWARE **
133
+ // Note: Auth routes now handle their own session middleware in the auth module
134
+ // This middleware is for all other protected routes (users, repositories, tokens, etc.)
64
135
  protectedRoutes.use('*', async (c, next) => {
65
136
  return sessionMiddleware(c, next);
66
137
  });
67
- // Auth routes (session required)
68
- protectedRoutes.post('/auth/logout', logoutRoute);
69
- protectedRoutes.get('/auth/me', meRoute);
70
- protectedRoutes.post('/auth/2fa/setup', setup2FARoute);
71
- protectedRoutes.post('/auth/2fa/enable', enable2FARoute);
72
- protectedRoutes.post('/auth/2fa/disable', disable2FARoute);
73
- // User Management
74
- protectedRoutes.get('/users', listUsers);
75
- protectedRoutes.post('/users', createUser);
76
- protectedRoutes.delete('/users/:id', deleteUser);
77
- // Repository routes
78
- protectedRoutes.get('/repositories', listRepositories);
79
- protectedRoutes.post('/repositories', createRepository);
80
- protectedRoutes.get('/repositories/:id', getRepository);
81
- protectedRoutes.put('/repositories/:id', updateRepository);
82
- protectedRoutes.delete('/repositories/:id', deleteRepository);
83
- protectedRoutes.get('/repositories/:id/verify', verifyRepository);
84
- protectedRoutes.post('/repositories/:id/sync', syncRepositoryNow);
85
- // Token routes
86
- protectedRoutes.get('/tokens', listTokens);
87
- protectedRoutes.post('/tokens', createToken);
88
- protectedRoutes.patch('/tokens/:id', updateToken);
89
- protectedRoutes.delete('/tokens/:id', deleteToken);
90
- // Package routes
91
- protectedRoutes.get('/packages', listPackages);
92
- protectedRoutes.get('/packages/:name', getPackage);
93
- protectedRoutes.get('/packages/:name/:version/readme', getPackageReadme);
94
- protectedRoutes.get('/packages/:name/:version/changelog', getPackageChangelog);
95
- protectedRoutes.get('/packages/:name/:version/stats', getPackageStats);
96
- protectedRoutes.post('/packages/add-from-mirror', addPackagesFromMirror);
97
- // Stats
98
- protectedRoutes.get('/stats', getStats);
99
- // Settings
100
- protectedRoutes.get('/settings', getSettings);
101
- protectedRoutes.put('/settings/packagist-mirroring', updatePackagistMirroring);
102
- // Artifacts
103
- protectedRoutes.delete('/artifacts/:id', deleteArtifact);
104
- protectedRoutes.post('/artifacts/cleanup', cleanupArtifacts);
105
- protectedRoutes.post('/packages/cleanup-numeric-versions', cleanupNumericVersions);
138
+ // Mount all protected modules
139
+ protectedRoutes.route('/users', usersModule);
140
+ protectedRoutes.route('/repositories', repositoriesModule);
141
+ protectedRoutes.route('/tokens', tokensModule);
142
+ protectedRoutes.route('/packages', packagesModule);
143
+ protectedRoutes.route('/artifacts', artifactsModule);
144
+ // Admin module (stats and settings)
145
+ protectedRoutes.route('/stats', adminModule);
146
+ protectedRoutes.route('/settings', adminModule);
147
+ // Mount getPackageStats at correct path (temporary - should move to packages module)
148
+ // This route needs to be at /api/packages/:name/:version/stats
149
+ // Create a temporary route definition with the correct path
150
+ const packageStatsRoute = {
151
+ ...getPackageStatsRouteDef,
152
+ path: '/packages/{name}/{version}/stats',
153
+ };
154
+ protectedRoutes.openapi(packageStatsRoute, getPackageStats);
106
155
  // Mount protected routes under /api
107
156
  apiRoutes.route('/', protectedRoutes);
157
+ // Register OpenAPI spec endpoint BEFORE mounting /api routes
158
+ // This ensures the handler takes precedence over the /api mount
159
+ // The handler executes at request time when all routes are registered
160
+ app.get('/api/openapi.json', async (c) => {
161
+ try {
162
+ const auth = await checkAuthentication(c);
163
+ const fullSpec = app.getOpenAPIDocument({
164
+ openapi: '3.0.0',
165
+ info: {
166
+ version: VERSION,
167
+ title: 'PACKAGE.broker API',
168
+ description: 'REST API for PACKAGE.broker - Composer Package Mirror',
169
+ },
170
+ servers: [
171
+ {
172
+ url: '/',
173
+ description: 'Current server',
174
+ },
175
+ ],
176
+ });
177
+ // Filter paths based on authentication and role
178
+ if (!auth.authenticated) {
179
+ // Guest: only public endpoints
180
+ const filteredPaths = {};
181
+ for (const [path, pathItem] of Object.entries(fullSpec.paths || {})) {
182
+ if (PUBLIC_OPENAPI_PATHS.includes(path)) {
183
+ filteredPaths[path] = pathItem;
184
+ }
185
+ }
186
+ fullSpec.paths = filteredPaths;
187
+ }
188
+ else if (auth.role === 'viewer') {
189
+ // Viewer (read-only): public + read-only endpoints (exclude admin-only)
190
+ const filteredPaths = {};
191
+ for (const [path, pathItem] of Object.entries(fullSpec.paths || {})) {
192
+ // Include public paths
193
+ if (PUBLIC_OPENAPI_PATHS.includes(path)) {
194
+ filteredPaths[path] = pathItem;
195
+ continue;
196
+ }
197
+ // Exclude admin-only paths
198
+ const isAdminOnly = ADMIN_ONLY_PATHS.some(adminPath => {
199
+ // Handle parameterized paths like /api/users/{id}
200
+ const adminPathPattern = adminPath.replace(/\{[^}]+\}/g, '[^/]+');
201
+ const adminRegex = new RegExp(`^${adminPathPattern}$`);
202
+ return adminRegex.test(path);
203
+ });
204
+ if (isAdminOnly) {
205
+ continue;
206
+ }
207
+ // For protected paths, only include GET methods (read-only)
208
+ if (pathItem && typeof pathItem === 'object') {
209
+ const readOnlyMethods = ['get'];
210
+ const filteredPathItem = {};
211
+ let hasReadOnlyMethod = false;
212
+ for (const [method, operation] of Object.entries(pathItem)) {
213
+ if (readOnlyMethods.includes(method.toLowerCase())) {
214
+ filteredPathItem[method] = operation;
215
+ hasReadOnlyMethod = true;
216
+ }
217
+ }
218
+ // Only include path if it has at least one read-only method
219
+ if (hasReadOnlyMethod) {
220
+ filteredPaths[path] = filteredPathItem;
221
+ }
222
+ }
223
+ }
224
+ fullSpec.paths = filteredPaths;
225
+ }
226
+ // Admin users see all endpoints (no filtering needed)
227
+ return c.json(fullSpec);
228
+ }
229
+ catch (error) {
230
+ logger.error('Error generating OpenAPI spec', {
231
+ error: error instanceof Error ? error.message : String(error),
232
+ stack: error instanceof Error ? error.stack : undefined,
233
+ }, error instanceof Error ? error : new Error(String(error)));
234
+ return c.json({
235
+ error: 'Internal Server Error',
236
+ message: error instanceof Error ? error.message : String(error),
237
+ }, 500);
238
+ }
239
+ });
240
+ // Mount /api routes AFTER registering /api/openapi.json
108
241
  app.route('/api', apiRoutes);
109
- // Composer routes
110
- const composerAuth = async (c, next) => {
111
- await composerVersionMiddleware(c, next);
112
- };
113
- const composerTokenAuth = async (c, next) => {
114
- return authMiddleware(c, next);
115
- };
116
- app.get('/packages.json', composerAuth, composerTokenAuth, packagesJsonRoute);
117
- app.get('/p2/:vendor/:package', composerAuth, composerTokenAuth, p2PackageRoute);
118
- const distAuth = async (c, next) => {
119
- return distAuthMiddleware(c, next);
120
- };
121
- app.get('/dist/m/:vendor/:package/:version', composerAuth, distAuth, distMirrorRoute);
122
- app.get('/dist/:vendor/:package/:version/:reference', composerAuth, distAuth, distLockfileRoute);
123
- app.get('/dist/:repo_id/:vendor/:package/:version', composerAuth, distAuth, distRoute);
242
+ // Mount Composer routes at root level (CRITICAL: must stay at root for Composer protocol compatibility)
243
+ mountComposerRoutes(app);
124
244
  return app;
125
245
  }
126
246
  //# sourceMappingURL=factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { OpenAPIContext } from '../../routes/api/types';
2
+ import type { DatabasePort } from '../../ports';
3
+ import { updatePackagistMirroringRequestSchema } from '@package-broker/shared';
4
+ export interface StatsRouteEnv {
5
+ Bindings: {
6
+ DB: D1Database;
7
+ };
8
+ Variables: {
9
+ database: DatabasePort;
10
+ };
11
+ }
12
+ export interface SettingsRouteEnv {
13
+ Bindings: {
14
+ KV?: KVNamespace;
15
+ };
16
+ }
17
+ export declare const PACKAGIST_MIRRORING_KEY = "settings:packagist_mirroring_enabled";
18
+ export declare const PACKAGE_CACHING_KEY = "settings:package_caching_enabled";
19
+ export declare function getStats(c: OpenAPIContext<StatsRouteEnv>): Promise<Response>;
20
+ export declare function getPackageStats(c: OpenAPIContext<StatsRouteEnv>): Promise<Response>;
21
+ export declare function getSettings(c: OpenAPIContext<SettingsRouteEnv>): Promise<Response>;
22
+ export declare function updatePackagistMirroring(c: OpenAPIContext<SettingsRouteEnv, ReturnType<typeof updatePackagistMirroringRequestSchema.parse>>): Promise<Response>;
23
+ export declare function isPackagistMirroringEnabled(kv: KVNamespace | undefined): Promise<boolean>;
24
+ export declare function isPackageCachingEnabled(kv: KVNamespace | undefined): Promise<boolean>;
25
+ //# sourceMappingURL=admin.handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.handlers.d.ts","sourceRoot":"","sources":["../../../src/modules/admin/admin.handlers.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,qCAAqC,EAAE,MAAM,wBAAwB,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;KAChB,CAAC;IACF,SAAS,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,EAAE,CAAC,EAAE,WAAW,CAAC;KAClB,CAAC;CACH;AAGD,eAAO,MAAM,uBAAuB,yCAAkD,CAAC;AACvF,eAAO,MAAM,mBAAmB,qCAA8C,CAAC;AAM/E,wBAAsB,QAAQ,CAAC,CAAC,EAAE,cAAc,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwBlF;AAED,wBAAsB,eAAe,CAAC,CAAC,EAAE,cAAc,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuBzF;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAcxF;AAED,wBAAsB,wBAAwB,CAC5C,CAAC,EAAE,cAAc,CAAC,gBAAgB,EAAE,UAAU,CAAC,OAAO,qCAAqC,CAAC,KAAK,CAAC,CAAC,GAClG,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/F;AAED,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAM3F"}
@@ -0,0 +1,97 @@
1
+ /*
2
+ * PACKAGE.broker
3
+ * Copyright (C) 2025 Łukasz Bajsarowicz
4
+ * Licensed under AGPL-3.0
5
+ */
6
+ import { repositories, artifacts, packages } from '../../db/schema';
7
+ import { eq, sql, and } from 'drizzle-orm';
8
+ const SETTINGS_PREFIX = 'settings:';
9
+ export const PACKAGIST_MIRRORING_KEY = `${SETTINGS_PREFIX}packagist_mirroring_enabled`;
10
+ export const PACKAGE_CACHING_KEY = `${SETTINGS_PREFIX}package_caching_enabled`;
11
+ function isKvAvailable(kv) {
12
+ return kv !== undefined && kv !== null;
13
+ }
14
+ export async function getStats(c) {
15
+ const db = c.get('database');
16
+ const [activeReposResult] = await db
17
+ .select({ count: sql `count(*)` })
18
+ .from(repositories)
19
+ .where(eq(repositories.status, 'active'));
20
+ const activeRepos = activeReposResult?.count ?? 0;
21
+ const [packagesResult] = await db.select({ count: sql `count(*)` }).from(packages);
22
+ const cachedPackages = packagesResult?.count ?? 0;
23
+ const [downloadsResult] = await db
24
+ .select({ total: sql `sum(${artifacts.download_count})` })
25
+ .from(artifacts);
26
+ const totalDownloads = downloadsResult?.total ?? 0;
27
+ return c.json({
28
+ active_repos: activeRepos,
29
+ cached_packages: cachedPackages,
30
+ total_downloads: totalDownloads,
31
+ });
32
+ }
33
+ export async function getPackageStats(c) {
34
+ const { name: nameParam, version } = c.req.valid('param');
35
+ const name = decodeURIComponent(nameParam);
36
+ const db = c.get('database');
37
+ const [artifact] = await db
38
+ .select({
39
+ downloads: artifacts.download_count,
40
+ last_downloaded: artifacts.last_downloaded_at
41
+ })
42
+ .from(artifacts)
43
+ .where(and(eq(artifacts.package_name, name), eq(artifacts.version, version)))
44
+ .limit(1);
45
+ return c.json({
46
+ downloads: artifact?.downloads || 0,
47
+ last_downloaded: artifact?.last_downloaded || null
48
+ });
49
+ }
50
+ export async function getSettings(c) {
51
+ const kvAvailable = isKvAvailable(c.env.KV);
52
+ const packagistMirroringEnabled = kvAvailable && c.env.KV
53
+ ? await c.env.KV.get(PACKAGIST_MIRRORING_KEY)
54
+ : null;
55
+ const packageCachingEnabled = kvAvailable && c.env.KV
56
+ ? await c.env.KV.get(PACKAGE_CACHING_KEY)
57
+ : null;
58
+ return c.json({
59
+ kv_available: kvAvailable,
60
+ packagist_mirroring_enabled: packagistMirroringEnabled === 'true',
61
+ package_caching_enabled: packageCachingEnabled !== 'false',
62
+ });
63
+ }
64
+ export async function updatePackagistMirroring(c) {
65
+ const body = c.req.valid('json');
66
+ if (typeof body.enabled !== 'boolean') {
67
+ return c.json({ error: 'Bad Request', message: 'enabled must be a boolean' }, 400);
68
+ }
69
+ if (!isKvAvailable(c.env.KV) || !c.env.KV) {
70
+ return c.json({
71
+ error: 'Service Unavailable',
72
+ message: 'KV namespace is required for this setting. Please configure KV in your wrangler.toml.'
73
+ }, 503);
74
+ }
75
+ await c.env.KV.put(PACKAGIST_MIRRORING_KEY, String(body.enabled));
76
+ return c.json({
77
+ packagist_mirroring_enabled: body.enabled,
78
+ message: body.enabled
79
+ ? 'Public Packagist mirroring enabled'
80
+ : 'Public Packagist mirroring disabled',
81
+ });
82
+ }
83
+ export async function isPackagistMirroringEnabled(kv) {
84
+ if (!isKvAvailable(kv) || !kv) {
85
+ return false;
86
+ }
87
+ const value = await kv.get(PACKAGIST_MIRRORING_KEY);
88
+ return value === null || value === 'true';
89
+ }
90
+ export async function isPackageCachingEnabled(kv) {
91
+ if (!isKvAvailable(kv) || !kv) {
92
+ return false;
93
+ }
94
+ const value = await kv.get(PACKAGE_CACHING_KEY);
95
+ return value !== 'false';
96
+ }
97
+ //# sourceMappingURL=admin.handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.handlers.js","sourceRoot":"","sources":["../../../src/modules/admin/admin.handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import { z } from '@hono/zod-openapi';
2
+ export declare const getStatsRouteDef: {
3
+ method: "get";
4
+ path: "/";
5
+ summary: string;
6
+ description: string;
7
+ security: {
8
+ Bearer: never[];
9
+ }[];
10
+ responses: {
11
+ 200: {
12
+ content: {
13
+ 'application/json': {
14
+ schema: z.ZodObject<{
15
+ active_repos: z.ZodNumber;
16
+ cached_packages: z.ZodNumber;
17
+ total_downloads: z.ZodNumber;
18
+ }, z.core.$strip>;
19
+ };
20
+ };
21
+ description: string;
22
+ };
23
+ };
24
+ tags: string[];
25
+ } & {
26
+ getRoutingPath(): "/";
27
+ };
28
+ export declare const getPackageStatsRouteDef: {
29
+ method: "get";
30
+ path: "/{name}/{version}/stats";
31
+ summary: string;
32
+ description: string;
33
+ security: {
34
+ Bearer: never[];
35
+ }[];
36
+ request: {
37
+ params: z.ZodObject<{
38
+ name: z.ZodString;
39
+ version: z.ZodString;
40
+ }, z.core.$strip>;
41
+ };
42
+ responses: {
43
+ 200: {
44
+ content: {
45
+ 'application/json': {
46
+ schema: z.ZodObject<{
47
+ downloads: z.ZodNumber;
48
+ last_downloaded: z.ZodNullable<z.ZodNumber>;
49
+ }, z.core.$strip>;
50
+ };
51
+ };
52
+ description: string;
53
+ };
54
+ };
55
+ tags: string[];
56
+ } & {
57
+ getRoutingPath(): "/:name/:version/stats";
58
+ };
59
+ export declare const getSettingsRouteDef: {
60
+ method: "get";
61
+ path: "/";
62
+ summary: string;
63
+ description: string;
64
+ security: {
65
+ Bearer: never[];
66
+ }[];
67
+ responses: {
68
+ 200: {
69
+ content: {
70
+ 'application/json': {
71
+ schema: z.ZodObject<{
72
+ kv_available: z.ZodBoolean;
73
+ packagist_mirroring_enabled: z.ZodBoolean;
74
+ package_caching_enabled: z.ZodBoolean;
75
+ }, z.core.$strip>;
76
+ };
77
+ };
78
+ description: string;
79
+ };
80
+ };
81
+ tags: string[];
82
+ } & {
83
+ getRoutingPath(): "/";
84
+ };
85
+ export declare const updatePackagistMirroringRouteDef: {
86
+ method: "put";
87
+ path: "/packagist-mirroring";
88
+ summary: string;
89
+ description: string;
90
+ security: {
91
+ Bearer: never[];
92
+ }[];
93
+ request: {
94
+ body: {
95
+ content: {
96
+ 'application/json': {
97
+ schema: z.ZodObject<{
98
+ enabled: z.ZodBoolean;
99
+ }, z.core.$strip>;
100
+ };
101
+ };
102
+ };
103
+ };
104
+ responses: {
105
+ 200: {
106
+ content: {
107
+ 'application/json': {
108
+ schema: z.ZodObject<{
109
+ packagist_mirroring_enabled: z.ZodBoolean;
110
+ message: z.ZodString;
111
+ }, z.core.$strip>;
112
+ };
113
+ };
114
+ description: string;
115
+ };
116
+ 400: {
117
+ content: {
118
+ 'application/json': {
119
+ schema: z.ZodObject<{
120
+ error: z.ZodString;
121
+ message: z.ZodOptional<z.ZodString>;
122
+ code: z.ZodOptional<z.ZodString>;
123
+ requestId: z.ZodOptional<z.ZodString>;
124
+ }, z.core.$strip>;
125
+ };
126
+ };
127
+ description: string;
128
+ };
129
+ 503: {
130
+ content: {
131
+ 'application/json': {
132
+ schema: z.ZodObject<{
133
+ error: z.ZodString;
134
+ message: z.ZodOptional<z.ZodString>;
135
+ code: z.ZodOptional<z.ZodString>;
136
+ requestId: z.ZodOptional<z.ZodString>;
137
+ }, z.core.$strip>;
138
+ };
139
+ };
140
+ description: string;
141
+ };
142
+ };
143
+ tags: string[];
144
+ } & {
145
+ getRoutingPath(): "/packagist-mirroring";
146
+ };
147
+ //# sourceMappingURL=admin.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.routes.d.ts","sourceRoot":"","sources":["../../../src/modules/admin/admin.routes.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAInD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;CAiB3B,CAAC;AAIH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoClC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;CAiB9B,CAAC;AAEH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6C3C,CAAC"}