mbkbucket 4.0.0 → 4.1.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 (40) hide show
  1. package/.env.example +16 -15
  2. package/README.md +613 -561
  3. package/index.js +36 -33
  4. package/lib/cli.js +239 -239
  5. package/lib/public/bucketadmin.css +2042 -2042
  6. package/lib/public/bucketadmin.js +1844 -1622
  7. package/lib/public/mbkbucket-helper-demo.html +0 -58
  8. package/lib/public/mbkbucket-helper.js +1 -9
  9. package/lib/src/config/validation.js +91 -86
  10. package/lib/src/controllers/api.controller.js +486 -459
  11. package/lib/src/controllers/dashboard.controller.js +69 -69
  12. package/lib/src/controllers/info.controller.js +13 -13
  13. package/lib/src/controllers/view.controller.js +234 -233
  14. package/lib/src/core/metrics.js +134 -0
  15. package/lib/src/core/storage/capabilities.js +58 -0
  16. package/lib/src/core/storage/errors.js +0 -5
  17. package/lib/src/core/storage/gdrive-auth.js +0 -36
  18. package/lib/src/core/storage/gdrive-provider.js +101 -43
  19. package/lib/src/core/storage/index.js +4 -1
  20. package/lib/src/core/storage/local-provider.js +507 -0
  21. package/lib/src/core/storage/models.js +90 -50
  22. package/lib/src/core/storage/path-strategy.js +14 -1
  23. package/lib/src/core/storage/s3-provider.js +17 -37
  24. package/lib/src/core/storage/storage-manager.js +70 -50
  25. package/lib/src/core/storage/storage-provider.js +49 -120
  26. package/lib/src/middleware/bucket-resolver.js +37 -37
  27. package/lib/src/routes/api.routes.js +4 -1
  28. package/lib/src/routes/index.js +60 -60
  29. package/lib/src/routes/view.routes.js +28 -28
  30. package/lib/src/services/s3.service.js +42 -42
  31. package/lib/src/services/storage.service.js +311 -213
  32. package/lib/src/utils/cleanup-scheduler.js +91 -0
  33. package/lib/src/utils/errors.js +56 -56
  34. package/lib/src/utils/helpers.js +6 -6
  35. package/package.json +3 -5
  36. package/views/bucket.hbs +0 -5
  37. package/views/bucketadmin_move_modal.hbs +35 -35
  38. package/views/bucketadmin_preview_modal.hbs +108 -108
  39. package/views/bucketadmincontent.hbs +193 -193
  40. package/views/mbkbucket_info.hbs +134 -134
@@ -1,69 +1,69 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import { resolveStorageName, getAvailableStorageNames, getStorageProvider, getStorageConfig } from "../services/storage.service.js";
4
- import { storageManager } from "../core/storage/storage-manager.js";
5
- import { renderPage, mbkautheVar } from "mbkauthe";
6
- import { commonHandlebarsHelpers } from "../utils/helpers.js";
7
- import { mbkbucketVar } from "../config/index.js";
8
-
9
- /**
10
- * Render the main storage/bucket dashboard page.
11
- */
12
- export function renderBucketDashboard(req, res) {
13
- const allBuckets = getAvailableStorageNames();
14
- const configuredDefaultBucket = mbkautheVar?.bucket;
15
- const isPortal = mbkautheVar?.APP_NAME === "portal";
16
- const bucketfilePath = isPortal ? "bucketportal.hbs" : "bucket.hbs";
17
-
18
- const mainLayoutPath = path.resolve(process.cwd(), "views", "layouts", "main");
19
- const hasMainLayout = fs.existsSync(`${mainLayoutPath}.hbs`) || fs.existsSync(mainLayoutPath);
20
- const portalLayout = (isPortal && hasMainLayout) && mainLayoutPath;
21
-
22
- let selectedBucket;
23
- let error = req.query.error;
24
- let providerType = 's3';
25
- let providerCapabilities = {};
26
-
27
- try {
28
- selectedBucket = resolveStorageName(req.query.bucket);
29
- const provider = getStorageProvider(selectedBucket);
30
- providerType = provider.type;
31
- providerCapabilities = provider.capabilities;
32
- } catch (err) {
33
- selectedBucket = mbkautheVar?.bucket;
34
- error ||= err.message;
35
- }
36
-
37
- const bucketOptions = allBuckets.map(name => {
38
- let type = 's3';
39
- try {
40
- const cfg = getStorageConfig(name);
41
- type = storageManager.inferProviderType(cfg);
42
- } catch {}
43
- return {
44
- name,
45
- type,
46
- isSelected: name === selectedBucket,
47
- isDefault: name === configuredDefaultBucket
48
- };
49
- });
50
-
51
- const publicViewEnabled = Boolean(mbkbucketVar?.publiView_enabled);
52
-
53
- renderPage(req, res, bucketfilePath, Boolean(portalLayout), {
54
- page: "Admin Bucket",
55
- helpers: commonHandlebarsHelpers,
56
- layout: portalLayout || false,
57
- bucketvar: selectedBucket,
58
- selectedBucket,
59
- bucketOptions,
60
- providerType,
61
- providerCapabilities,
62
- APP_NAME: mbkautheVar?.APP_NAME,
63
- publicViewEnabled,
64
- publiViewEnabled: publicViewEnabled,
65
- message: req.query.message,
66
- error,
67
- availableBuckets: allBuckets
68
- });
69
- }
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { resolveStorageName, getAvailableStorageNames, getStorageProvider, getStorageConfig } from "../services/storage.service.js";
4
+ import { storageManager } from "../core/storage/storage-manager.js";
5
+ import { renderPage, mbkautheVar } from "mbkauthe";
6
+ import { commonHandlebarsHelpers } from "../utils/helpers.js";
7
+ import { mbkbucketVar } from "../config/index.js";
8
+
9
+ /**
10
+ * Render the main storage/bucket dashboard page.
11
+ */
12
+ export function renderBucketDashboard(req, res) {
13
+ const allBuckets = getAvailableStorageNames();
14
+ const configuredDefaultBucket = mbkautheVar?.bucket;
15
+ const isPortal = mbkautheVar?.APP_NAME === "portal";
16
+ const bucketfilePath = isPortal ? "bucketportal.hbs" : "bucket.hbs";
17
+
18
+ const mainLayoutPath = path.resolve(process.cwd(), "views", "layouts", "main");
19
+ const hasMainLayout = fs.existsSync(`${mainLayoutPath}.hbs`) || fs.existsSync(mainLayoutPath);
20
+ const portalLayout = (isPortal && hasMainLayout) && mainLayoutPath;
21
+
22
+ let selectedBucket;
23
+ let error = req.query.error;
24
+ let providerType = 's3';
25
+ let providerCapabilities = {};
26
+
27
+ try {
28
+ selectedBucket = resolveStorageName(req.query.bucket);
29
+ const provider = getStorageProvider(selectedBucket);
30
+ providerType = provider.type;
31
+ providerCapabilities = provider.capabilities;
32
+ } catch (err) {
33
+ selectedBucket = mbkautheVar?.bucket;
34
+ error ||= err.message;
35
+ }
36
+
37
+ const bucketOptions = allBuckets.map(name => {
38
+ let type = 's3';
39
+ try {
40
+ const cfg = getStorageConfig(name);
41
+ type = storageManager.inferProviderType(cfg);
42
+ } catch {}
43
+ return {
44
+ name,
45
+ type,
46
+ isSelected: name === selectedBucket,
47
+ isDefault: name === configuredDefaultBucket
48
+ };
49
+ });
50
+
51
+ const publicViewEnabled = Boolean(mbkbucketVar?.publiView_enabled);
52
+
53
+ renderPage(req, res, bucketfilePath, Boolean(portalLayout), {
54
+ page: "Admin Bucket",
55
+ helpers: commonHandlebarsHelpers,
56
+ layout: portalLayout || false,
57
+ bucketvar: selectedBucket,
58
+ selectedBucket,
59
+ bucketOptions,
60
+ providerType,
61
+ providerCapabilities,
62
+ APP_NAME: mbkautheVar?.APP_NAME,
63
+ publicViewEnabled,
64
+ publiViewEnabled: publicViewEnabled,
65
+ message: req.query.message,
66
+ error,
67
+ availableBuckets: allBuckets
68
+ });
69
+ }
@@ -3,7 +3,7 @@ import { packageJson, getLatestVersion, appVersion, mbkbucketVar } from "../conf
3
3
  import { getAvailableBucketNames, getStorageProvider } from "../services/storage.service.js";
4
4
  import { storageManager } from "../core/storage/storage-manager.js";
5
5
 
6
- async function getInfoData() {
6
+ async function getInfoData(requestedBucket) {
7
7
  let latestVersion = 'unknown';
8
8
  try {
9
9
  latestVersion = (await getLatestVersion()) || 'unknown';
@@ -12,16 +12,21 @@ async function getInfoData() {
12
12
  }
13
13
 
14
14
  const buckets = getAvailableBucketNames();
15
- const defaultBucket = storageManager.getDefaultConnectionName() || (buckets[0] ?? '');
15
+ let defaultBucket = requestedBucket;
16
+ if (!defaultBucket || !buckets.includes(defaultBucket)) {
17
+ defaultBucket = storageManager.getDefaultConnectionName() || (buckets[0] ?? '');
18
+ }
19
+
16
20
  let providerType = 'S3';
21
+ let capabilities = {};
17
22
  if (defaultBucket) {
18
23
  try {
19
24
  const provider = getStorageProvider(defaultBucket);
20
25
  providerType = (provider?.type || 's3').toUpperCase();
26
+ capabilities = provider?.capabilities?.toJSON ? provider.capabilities.toJSON() : (provider?.capabilities || {});
21
27
  } catch {}
22
28
  }
23
29
 
24
- // Safe subset only - strictly prevent leaking passwords, DB connection strings, OAuth secrets, or storage credentials
25
30
  const safeMbkautheVar = {
26
31
  APP_NAME: mbkautheVar?.APP_NAME || mbkautheVar?.app_name || "mbkbucket",
27
32
  };
@@ -41,24 +46,19 @@ async function getInfoData() {
41
46
  mbkbucketVar: safeMbkbucketVar,
42
47
  defaultBucket,
43
48
  configuredBucketsCount: buckets.length,
44
- providerType
49
+ providerType,
50
+ capabilities
45
51
  };
46
52
  }
47
53
 
48
- /**
49
- * Render the mbkbucket info page (Handlebars).
50
- */
51
54
  export async function infoPage(req, res) {
52
55
  renderPage(req, res, "mbkbucket_info.hbs", false, {
53
56
  pageTitle: "MBKBucket Information",
54
57
  ogUrl: "/mbkbucket/info",
55
- ...(await getInfoData())
58
+ ...(await getInfoData(req.query?.bucket))
56
59
  });
57
60
  }
58
61
 
59
- /**
60
- * Return bucket info as JSON.
61
- */
62
- export async function infoJson(_req, res) {
63
- res.json(await getInfoData());
62
+ export async function infoJson(req, res) {
63
+ res.json(await getInfoData(req.query?.bucket));
64
64
  }