UNPKG

@paroicms/server

Version:
198 lines 9.72 kB
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