UNPKG

@paroicms/server

Version:
74 lines 3.02 kB
import { ApiError } from "@paroicms/public-server-lib"; import { processOriginalImage } from "@paroicms/server-image-cache-engine"; import { getHandleOfSiteFavicon } from "../../common/media-handles.helpers.js"; import { createAdminFaviconFrom } from "../../common/medias/media-lib.js"; import { toMSourceMedia } from "../../common/medias/to-media-values.js"; import { invalidateMultipleDocumentsInCache } from "../../common/text-cache.js"; export async function addMediaToNode(siteContext, file, options) { const { binaryFile, mediaType, weightB, originalName } = file; const { nodeId, nodeType, handle, attachedData, replace } = options; const policyName = nodeType.mediaPolicy ?? "default"; const mediaPolicy = siteContext.siteSchema.mediaPolicies[policyName]; await checkMediaPolicy(siteContext, { mediaPolicy, mediaType, weightB, nodeType, nodeId, exceptHandle: replace ? handle : undefined, }); const imageConverter = ({ binaryFile, mediaType }) => processOriginalImage({ binaryFile, mediaType, ApiError, policy: mediaPolicy.image, defaultPolicy: siteContext.siteSchema.mediaPolicies.default.image, qualityPolicy: siteContext.siteSchema.imageQualityPolicy, }); const media = await siteContext.mediaStorage.addMedia({ binaryFile: binaryFile, mediaType: mediaType, weightB: weightB, handle, originalName, attachedData, replace, nodeId, }, { imageConverter, }); if (media.kind === "image" && handle === getHandleOfSiteFavicon()) { await createAdminFaviconFrom(siteContext, binaryFile); } if (nodeType.kind === "site") { await siteContext.textCache.invalidateAll(); } else { await invalidateMultipleDocumentsInCache(siteContext, { nodeId }); } return toMSourceMedia(siteContext, media, { absoluteUrl: true }); } async function checkMediaPolicy(siteContext, { mediaPolicy, mediaType, weightB, nodeType, nodeId, exceptHandle, }) { if (nodeType.kind !== "site") { const limit = nodeType.kind === "part" ? mediaPolicy.mediaLimitPerPart : mediaPolicy.mediaLimitPerDocument; if (limit !== undefined) { const count = await siteContext.mediaStorage.countMedias({ nodeId, exceptHandle, }); if (count >= limit) { throw new ApiError("Media limit reached", 400); } } } if (mediaType === "application/pdf") { const siteWeightLimitB = mediaPolicy.attachedDocument?.siteWeightLimitB; if (siteWeightLimitB !== undefined) { const totalWeightB = await siteContext.mediaStorage.getTotalDocumentsWeight(); if (totalWeightB + weightB > siteWeightLimitB) { throw new ApiError("Weight limit reached", 400); } } } } //# sourceMappingURL=add-media-to-node.js.map