@paroicms/server
Version:
The ParoiCMS server
198 lines • 9.72 kB
JavaScript
import { isResizeRule } from "@paroicms/public-anywhere-lib";
import { ApiError } from "@paroicms/public-server-lib";
import { extractNodeIdFromHandle } from "../../common/media-handles.helpers.js";
import { makeGqlImageVariant, makeGqlMedia, makeGqlMedias } from "../../common/medias/media-lib.js";
import { dependencyKeyOfMedia, invalidateMultipleDocumentsInCache, } from "../../common/text-cache.js";
import { adminUiOwnerHandle } from "../../context.js";
import { siteReadyGuard } from "../../graphql/graphql.types.js";
import { permissionGuard } from "../auth/authorization.helper.js";
import { recordEvent } from "../event-log/event-log.service.js";
export const mediaResolvers = {
Query: {
medias: async (_parent, { handle }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "document.edit");
const medias = await siteContext.mediaStorage.getMedias({ handle, withAttachedData: true });
return await makeGqlMedias(siteContext, medias);
},
media: async (_parent, { handle }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "document.edit");
const media = await siteContext.mediaStorage.getMedia({ handle, withAttachedData: true });
if (!media)
return null;
return await makeGqlMedia(siteContext, media);
},
getUsedRawSizesByMedia: async (_parent, { mediaId }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "document.edit");
return await siteContext.imageCache.getUsedRawSizesByMedia(mediaId);
},
},
Mutation: {
deleteMediaFromGallery: async (_parent, { mediaId, handle }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit");
const media = await siteContext.mediaStorage.getMedia({ mediaId, withAttachedData: false });
const deletedIds = await siteContext.mediaStorage.deleteMedia({ mediaId, handle });
await siteContext.imageCache.invalidate({ mediaIds: deletedIds });
const nodeId = extractNodeIdFromHandle(handle);
if (nodeId !== undefined)
await invalidateMultipleDocumentsInCache(siteContext, { nodeId });
if (media) {
recordEvent(siteContext, {
eventType: "media.delete",
actorId: authorizedAccount.accountId,
targetType: "media",
targetId: mediaId,
eventData: {
mediaId,
originalName: media.originalName,
},
});
}
return handle;
},
deleteMedia: async (_parent, { handle }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit");
const medias = await siteContext.mediaStorage.getMedias({ handle, withAttachedData: false });
const deletedIds = await siteContext.mediaStorage.deleteMedia({ handle });
await siteContext.imageCache.invalidate({ mediaIds: deletedIds });
const nodeId = extractNodeIdFromHandle(handle);
if (nodeId !== undefined)
await invalidateMultipleDocumentsInCache(siteContext, { nodeId });
for (const media of medias) {
recordEvent(siteContext, {
eventType: "media.delete",
actorId: authorizedAccount.accountId,
targetType: "media",
targetId: media.id,
eventData: {
mediaId: media.id,
originalName: media.originalName,
},
});
}
return handle;
},
updateMediaAttachedData: async (_parent, { mediaId, language, value }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit");
await siteContext.mediaStorage.setAttachedData({
mediaId,
language,
value: value ? JSON.parse(value) : null,
});
await siteContext.textCache.invalidate([dependencyKeyOfMedia(mediaId)]);
recordEvent(siteContext, {
eventType: "media.update",
actorId: authorizedAccount.accountId,
targetType: "media",
targetId: mediaId,
eventData: {
mediaId,
changedFields: ["attachedData"],
},
});
return true;
},
updateMediaPixelRatio: async (_parent, { mediaId, pixelRatio }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit");
await siteContext.mediaStorage.updatePixelRatio({
mediaId,
pixelRatio: pixelRatio ?? null,
});
await siteContext.textCache.invalidate([dependencyKeyOfMedia(mediaId)]);
recordEvent(siteContext, {
eventType: "media.update",
actorId: authorizedAccount.accountId,
targetType: "media",
targetId: mediaId,
eventData: {
mediaId,
changedFields: ["pixelRatio"],
},
});
return true;
},
reorderMedias: async (_parent, { input }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit");
const medias = await siteContext.mediaStorage.reorderMedias({
handle: input.handle,
mediaIds: input.mediaIds,
withAttachedData: true,
});
const nodeId = extractNodeIdFromHandle(input.handle);
if (nodeId !== undefined)
await invalidateMultipleDocumentsInCache(siteContext, { nodeId });
for (const mediaId of input.mediaIds) {
recordEvent(siteContext, {
eventType: "media.update",
actorId: authorizedAccount.accountId,
targetType: "media",
targetId: mediaId,
eventData: {
mediaId,
changedFields: ["order"],
},
});
}
return await makeGqlMedias(siteContext, medias);
},
useAdminUiImage: async (_parent, { input }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "document.edit");
const { mediaId, resizeRule } = input;
if (!isResizeRule(resizeRule)) {
throw new ApiError(`invalid resize rule '${resizeRule}'`, 400);
}
const mediaType = input.mediaType ?? undefined;
const media = await siteContext.mediaStorage.getMedia({ mediaId, withAttachedData: true });
if (!media)
throw new ApiError(`missing image '${mediaId}'`, 404);
if (media.kind !== "image") {
throw new ApiError(`media '${mediaId}' is not an image`, 404);
}
return await makeGqlImageVariant(siteContext, media, {
resizeRule,
pixelRatio: input.pixelRatio ?? media.pixelRatio ?? siteContext.themeConf.pixelRatio,
ownerHandle: adminUiOwnerHandle,
isHandleReusable: true,
canBeRetrievedByOwner: false,
mediaType,
versionedUrl: true,
});
},
useFTextImage: async (_parent, { input }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "document.edit");
const { mediaId, resizeRule } = input;
if (!isResizeRule(resizeRule)) {
throw new ApiError(`invalid resize rule '${resizeRule}'`, 400);
}
const mediaType = "image/webp";
if (!siteContext.themeConf.fTextImageResizeRules.includes(resizeRule)) {
throw new ApiError(404);
}
const media = await siteContext.mediaStorage.getMedia({ mediaId, withAttachedData: true });
if (!media)
throw new ApiError(`missing image '${mediaId}'`, 404);
if (media.kind !== "image") {
throw new ApiError(`media '${mediaId}' is not an image`, 404);
}
return await makeGqlImageVariant(siteContext, media, {
resizeRule,
pixelRatio: media.pixelRatio ?? siteContext.themeConf.pixelRatio,
ownerHandle: `fText:${resizeRule}`,
isHandleReusable: true,
canBeRetrievedByOwner: true,
mediaType,
versionedUrl: false,
});
},
},
};
//# sourceMappingURL=media.resolver.js.map