mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
@@ -7,6 +7,7 @@ const Asset = require("../../models/assets/assets.mdl");
|
||||
const chibi = require("../../services/chibisafe.service");
|
||||
const s3 = require("../../services/s3.service");
|
||||
const mediaToken = require("../../services/mediaToken.service");
|
||||
const uploadProgress = require("../../services/uploadProgress.service");
|
||||
const { extractVideoMeta } = require("../../services/ffprobe.service");
|
||||
const R = require('../../utils/response.util');
|
||||
const { paginate } = require("../../utils/paginate.util");
|
||||
@@ -328,7 +329,7 @@ exports.getAsset = async (req, res) => {
|
||||
// per-file thumbnail step, so videos land with thumbnail_url null and pick
|
||||
// one up later via the existing "thumbnail-only" path in updateAsset().
|
||||
//
|
||||
async function createAssetFromUpload({ file, thumbFile, body, user, requireVideoThumbnail = true }) {
|
||||
async function createAssetFromUpload({ file, thumbFile, body, user, requireVideoThumbnail = true, uploadId }) {
|
||||
const uploadedFiles = []; // [{ key, provider }]
|
||||
|
||||
try {
|
||||
@@ -367,11 +368,24 @@ async function createAssetFromUpload({ file, thumbFile, body, user, requireVideo
|
||||
|
||||
if (usesProvider) {
|
||||
const svc = getProvider(storage_provider);
|
||||
// Real Express -> Garage progress, main file only (not the thumbnail —
|
||||
// it's small enough that tracking it wouldn't add anything useful).
|
||||
// Relayed live to the browser over SSE; see uploadProgress.service.js.
|
||||
const onProgress = (storage_provider === "s3" && uploadId)
|
||||
? ({ loaded, total }) => uploadProgress.publish(uploadId, {
|
||||
phase: "storing",
|
||||
loaded,
|
||||
total,
|
||||
pct: total ? Math.round((loaded / total) * 100) : 0,
|
||||
})
|
||||
: undefined;
|
||||
|
||||
const result = await svc.uploadFile({
|
||||
buffer: file.buffer,
|
||||
originalname: file.originalname,
|
||||
mimetype: mime_type,
|
||||
ownerType: file_type,
|
||||
onProgress,
|
||||
});
|
||||
file_url = result.url;
|
||||
storage_key_resolved = result.uuid;
|
||||
@@ -497,21 +511,35 @@ async function createAssetFromUpload({ file, thumbFile, body, user, requireVideo
|
||||
}
|
||||
|
||||
exports.uploadAsset = async (req, res) => {
|
||||
const { uploadId } = req.body;
|
||||
try {
|
||||
const file = req.files?.file?.[0];
|
||||
const thumbFile = req.files?.thumbnail?.[0];
|
||||
|
||||
const asset = await createAssetFromUpload({ file, thumbFile, body: req.body, user: req.user });
|
||||
const asset = await createAssetFromUpload({ file, thumbFile, body: req.body, user: req.user, uploadId });
|
||||
invalidateListCache();
|
||||
if (uploadId) uploadProgress.complete(uploadId, { phase: "done", pct: 100 });
|
||||
return R.success(res, "Asset uploaded.", { data: asset }, 201);
|
||||
|
||||
} catch (err) {
|
||||
console.error("[ASSET][UPLOAD]", err);
|
||||
if (uploadId) uploadProgress.complete(uploadId, { phase: "error" });
|
||||
if (err.status) return R.error(res, err.message, err.status, { detail: err.chibiBody });
|
||||
return R.error(res, "Internal server error.", 500);
|
||||
}
|
||||
};
|
||||
|
||||
// ─── UPLOAD PROGRESS (SSE) ──────────────────────────────────────────────────
|
||||
//
|
||||
// Client opens this before POSTing the file, correlated by a client-generated
|
||||
// uploadId sent as a form field on the upload request itself. Streams the
|
||||
// real Express -> Garage httpUploadProgress events from s3.service.js's
|
||||
// Upload — not a simulated or estimated number.
|
||||
//
|
||||
exports.streamUploadProgress = (req, res) => {
|
||||
uploadProgress.subscribe(req.params.uploadId, res);
|
||||
};
|
||||
|
||||
// ─── UPLOAD (batch) ─────────────────────────────────────────────────────────
|
||||
//
|
||||
// Accepts multiple files under the "files" field in one multipart request,
|
||||
|
||||
Reference in New Issue
Block a user