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.
- package/.env.example +16 -15
- package/README.md +613 -561
- package/index.js +36 -33
- package/lib/cli.js +239 -239
- package/lib/public/bucketadmin.css +2042 -2042
- package/lib/public/bucketadmin.js +1844 -1622
- package/lib/public/mbkbucket-helper-demo.html +0 -58
- package/lib/public/mbkbucket-helper.js +1 -9
- package/lib/src/config/validation.js +91 -86
- package/lib/src/controllers/api.controller.js +486 -459
- package/lib/src/controllers/dashboard.controller.js +69 -69
- package/lib/src/controllers/info.controller.js +13 -13
- package/lib/src/controllers/view.controller.js +234 -233
- package/lib/src/core/metrics.js +134 -0
- package/lib/src/core/storage/capabilities.js +58 -0
- package/lib/src/core/storage/errors.js +0 -5
- package/lib/src/core/storage/gdrive-auth.js +0 -36
- package/lib/src/core/storage/gdrive-provider.js +101 -43
- package/lib/src/core/storage/index.js +4 -1
- package/lib/src/core/storage/local-provider.js +507 -0
- package/lib/src/core/storage/models.js +90 -50
- package/lib/src/core/storage/path-strategy.js +14 -1
- package/lib/src/core/storage/s3-provider.js +17 -37
- package/lib/src/core/storage/storage-manager.js +70 -50
- package/lib/src/core/storage/storage-provider.js +49 -120
- package/lib/src/middleware/bucket-resolver.js +37 -37
- package/lib/src/routes/api.routes.js +4 -1
- package/lib/src/routes/index.js +60 -60
- package/lib/src/routes/view.routes.js +28 -28
- package/lib/src/services/s3.service.js +42 -42
- package/lib/src/services/storage.service.js +311 -213
- package/lib/src/utils/cleanup-scheduler.js +91 -0
- package/lib/src/utils/errors.js +56 -56
- package/lib/src/utils/helpers.js +6 -6
- package/package.json +3 -5
- package/views/bucket.hbs +0 -5
- package/views/bucketadmin_move_modal.hbs +35 -35
- package/views/bucketadmin_preview_modal.hbs +108 -108
- package/views/bucketadmincontent.hbs +193 -193
- 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
|
-
|
|
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
|
-
|
|
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
|
}
|