@paroicms/server
Version:
The ParoiCMS server
74 lines • 3.02 kB
JavaScript
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