UNPKG

@agility/cli

Version:

Agility CLI for working with your content. (Public Beta)

274 lines 16.8 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.pushAssets = pushAssets; var ansi_colors_1 = __importDefault(require("ansi-colors")); var shared_1 = require("../shared"); var state_1 = require("../../core/state"); var asset_mapper_1 = require("../mappers/asset-mapper"); var FormData = require("form-data"); var fileOperations_1 = require("../../core/fileOperations"); var path_1 = __importDefault(require("path")); var gallery_mapper_1 = require("lib/mappers/gallery-mapper"); function pushAssets(sourceData, // TODO: Type these targetData, // TODO: Type these onProgress) { return __awaiter(this, void 0, void 0, function () { var assets, sourceGuid, targetGuid, locale, isPreview, logger, apiClient, referenceMapper, defaultContainer, err_1, totalAssets, successful, failed, skipped, processedAssetsCount, overallStatus, fileOps, basePath, _loop_1, _i, assets_1, media; return __generator(this, function (_a) { switch (_a.label) { case 0: assets = sourceData || []; sourceGuid = state_1.state.sourceGuid, targetGuid = state_1.state.targetGuid, locale = state_1.state.locale, isPreview = state_1.state.preview; logger = (0, state_1.getLoggerForGuid)(sourceGuid[0]); if (!assets || assets.length === 0) { logger.log("INFO", "No assets found to process."); console.log("No assets found to process."); return [2 /*return*/, { status: "success", successful: 0, failed: 0, skipped: 0 }]; } apiClient = (0, state_1.getApiClient)(); referenceMapper = new asset_mapper_1.AssetMapper(sourceGuid[0], targetGuid[0]); defaultContainer = null; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, apiClient.assetMethods.getDefaultContainer(targetGuid[0])]; case 2: defaultContainer = _a.sent(); return [3 /*break*/, 4]; case 3: err_1 = _a.sent(); console.error("✗ Error fetching default asset container:", err_1.message); return [2 /*return*/, { status: "error", successful: 0, failed: 0, skipped: 0 }]; case 4: totalAssets = assets.length; successful = 0; failed = 0; skipped = 0; processedAssetsCount = 0; overallStatus = "success"; fileOps = new fileOperations_1.fileOperations(sourceGuid[0]); basePath = fileOps.getDataFolderPath(); _loop_1 = function (media) { var currentStatus, relativeFilePath, absoluteLocalFilePath, assetRelativePath, containerFolderPath, folderPath, existingMapping_1, shouldCreate, targetAsset, isTargetSafe, hasSourceChanges, shouldUpdate, shouldSkip, createdAsset, updatedAsset, error_1; return __generator(this, function (_b) { switch (_b.label) { case 0: currentStatus = "success"; _b.label = 1; case 1: _b.trys.push([1, 7, 8, 9]); relativeFilePath = "assets/".concat((0, shared_1.getAssetFilePath)(media.originUrl)); absoluteLocalFilePath = fileOps.getDataFilePath(relativeFilePath); assetRelativePath = (0, shared_1.getAssetFilePath)(media.originUrl); containerFolderPath = path_1.default.dirname(assetRelativePath); folderPath = containerFolderPath === "." ? "/" : containerFolderPath; existingMapping_1 = referenceMapper.getAssetMapping(media, "source"); shouldCreate = existingMapping_1 === null; targetAsset = targetData.find(function (targetAsset) { return targetAsset.mediaID === (existingMapping_1 === null || existingMapping_1 === void 0 ? void 0 : existingMapping_1.targetMediaID); }) || null; isTargetSafe = existingMapping_1 !== null && referenceMapper.hasTargetChanged(targetAsset); hasSourceChanges = existingMapping_1 !== null && referenceMapper.hasSourceChanged(media); shouldUpdate = existingMapping_1 !== null && isTargetSafe && hasSourceChanges; shouldSkip = existingMapping_1 !== null && !isTargetSafe && !hasSourceChanges; if (!shouldCreate) return [3 /*break*/, 3]; return [4 /*yield*/, createAsset(media, absoluteLocalFilePath, folderPath, apiClient, sourceGuid[0], targetGuid[0], referenceMapper, logger)]; case 2: createdAsset = _b.sent(); referenceMapper.addMapping(media, createdAsset); successful++; return [3 /*break*/, 6]; case 3: if (!shouldUpdate) return [3 /*break*/, 5]; return [4 /*yield*/, updateAsset(media, absoluteLocalFilePath, folderPath, apiClient, sourceGuid[0], targetGuid[0], referenceMapper, logger)]; case 4: updatedAsset = _b.sent(); referenceMapper.addMapping(media, updatedAsset); successful++; return [3 /*break*/, 6]; case 5: if (shouldSkip) { // Asset exists and is up to date - skip logger.asset.skipped(media, "up to date, skipping", targetGuid[0]); skipped++; } _b.label = 6; case 6: return [3 /*break*/, 9]; case 7: error_1 = _b.sent(); logger.asset.error(media, error_1, targetGuid[0]); failed++; currentStatus = "error"; overallStatus = "error"; return [3 /*break*/, 9]; case 8: // Increment and call progress for each media item processedAssetsCount++; if (onProgress) { onProgress(processedAssetsCount, totalAssets, overallStatus); } return [7 /*endfinally*/]; case 9: return [2 /*return*/]; } }); }; _i = 0, assets_1 = assets; _a.label = 5; case 5: if (!(_i < assets_1.length)) return [3 /*break*/, 8]; media = assets_1[_i]; return [5 /*yield**/, _loop_1(media)]; case 6: _a.sent(); _a.label = 7; case 7: _i++; return [3 /*break*/, 5]; case 8: console.log(ansi_colors_1.default.yellow("Processed ".concat(successful, "/").concat(totalAssets, " assets (").concat(failed, " failed, ").concat(skipped, " skipped)"))); return [2 /*return*/, { status: overallStatus, successful: successful, failed: failed, skipped: skipped }]; } }); }); } /** * Create a new asset in the target instance */ function createAsset(media, absoluteLocalFilePath, folderPath, apiClient, sourceGuid, targetGuid, referenceMapper, logger) { return __awaiter(this, void 0, void 0, function () { var targetMediaGroupingID, fileOps, form, fileBuffer, uploadedMediaArray, uploadedMedia; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, resolveGalleryMapping(media, apiClient, sourceGuid, targetGuid)]; case 1: targetMediaGroupingID = _a.sent(); fileOps = new fileOperations_1.fileOperations(targetGuid); form = new FormData(); if (!fileOps.checkFileExists(absoluteLocalFilePath)) { throw new Error("Local asset file not found: ".concat(absoluteLocalFilePath)); } fileBuffer = fileOps.createReadStream(absoluteLocalFilePath); form.append("files", fileBuffer, media.fileName); return [4 /*yield*/, apiClient.assetMethods.upload(form, folderPath, targetGuid, targetMediaGroupingID)]; case 2: uploadedMediaArray = _a.sent(); if (!uploadedMediaArray || uploadedMediaArray.length === 0) { throw new Error("API did not return uploaded media details for ".concat(media.fileName)); } uploadedMedia = uploadedMediaArray[0]; logger.asset.uploaded(media, "uploaded", targetGuid); return [2 /*return*/, uploadedMedia]; } }); }); } /** * Update an existing asset in the target instance */ function updateAsset(media, absoluteLocalFilePath, folderPath, apiClient, sourceGuid, targetGuid, referenceMapper, logger) { return __awaiter(this, void 0, void 0, function () { var targetMediaGroupingID, fileOps, form, fileBuffer, uploadedMediaArray, uploadedMedia; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, resolveGalleryMapping(media, apiClient, sourceGuid, targetGuid)]; case 1: targetMediaGroupingID = _a.sent(); fileOps = new fileOperations_1.fileOperations(targetGuid); form = new FormData(); if (!fileOps.checkFileExists(absoluteLocalFilePath)) { throw new Error("Local asset file not found: ".concat(absoluteLocalFilePath)); } fileBuffer = fileOps.createReadStream(absoluteLocalFilePath); form.append("files", fileBuffer, media.fileName); return [4 /*yield*/, apiClient.assetMethods.upload(form, folderPath, targetGuid, targetMediaGroupingID)]; case 2: uploadedMediaArray = _a.sent(); if (!uploadedMediaArray || uploadedMediaArray.length === 0) { throw new Error("API did not return uploaded media details for ".concat(media.fileName)); } uploadedMedia = uploadedMediaArray[0]; logger.asset.uploaded(media, "uploaded", targetGuid); return [2 /*return*/, uploadedMedia]; } }); }); } /** * Resolve gallery mapping for an asset * Returns the target gallery ID or -1 if no gallery */ function resolveGalleryMapping(media, apiClient, sourceGuid, targetGuid // referenceMapper: AssetMapper, ) { return __awaiter(this, void 0, void 0, function () { var targetMediaGroupingID, galleryName, referenceMapper, galleryMapping, gallery, error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: targetMediaGroupingID = -1; galleryName = media.mediaGroupingName; referenceMapper = new gallery_mapper_1.GalleryMapper(sourceGuid, targetGuid); if (!(media.mediaGroupingID > 0 && media.mediaGroupingName)) return [3 /*break*/, 6]; _a.label = 1; case 1: _a.trys.push([1, 5, , 6]); galleryMapping = referenceMapper.getGalleryMappingByMediaGroupingID(media.mediaGroupingID, "source"); if (!galleryMapping) return [3 /*break*/, 2]; targetMediaGroupingID = galleryMapping.targetMediaGroupingID; return [3 /*break*/, 4]; case 2: return [4 /*yield*/, apiClient.assetMethods.getGalleryByName(targetGuid, media.mediaGroupingName)]; case 3: gallery = _a.sent(); if (gallery) { targetMediaGroupingID = gallery.mediaGroupingID; } _a.label = 4; case 4: return [3 /*break*/, 6]; case 5: error_2 = _a.sent(); // Gallery doesn't exist - this is normal, asset will upload without gallery console.log("[Asset] Gallery ".concat(media.mediaGroupingName, " not found - asset will upload without gallery association")); return [3 /*break*/, 6]; case 6: return [2 /*return*/, targetMediaGroupingID]; } }); }); } //# sourceMappingURL=asset-pusher.js.map