UNPKG

@paroicms/server

Version:
139 lines 6.83 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 { authGuard } from "../auth/auth.helper.js"; export const mediaResolvers = { Query: { medias: async (_parent, { handle }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); const medias = await siteContext.mediaStorage.getMedias({ handle, withAttachedData: true }); return await makeGqlMedias(siteContext, medias); }, media: async (_parent, { handle }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); const media = await siteContext.mediaStorage.getMedia({ handle, withAttachedData: true }); if (!media) return null; return await makeGqlMedia(siteContext, media); }, getUsedRawSizesByMedia: async (_parent, { mediaId }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); return await siteContext.imageCache.getUsedRawSizesByMedia(mediaId); }, }, Mutation: { deleteMediaFromGallery: async (_parent, { mediaId, handle }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); 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 }); return handle; }, deleteMedia: async (_parent, { handle }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); const deletedIds = await siteContext.mediaStorage.deleteMedia({ handle }); await siteContext.imageCache.invalidate({ mediaIds: deletedIds }); const nodeId = extractNodeIdFromHandle(handle); if (nodeId !== undefined) await invalidateMultipleDocumentsInCache(siteContext, { nodeId }); return handle; }, updateMediaAttachedData: async (_parent, { mediaId, language, value }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); await siteContext.mediaStorage.setAttachedData({ mediaId, language, value: value ? JSON.parse(value) : null, }); await siteContext.textCache.invalidate([dependencyKeyOfMedia(mediaId)]); return true; }, updateMediaPixelRatio: async (_parent, { mediaId, pixelRatio }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); await siteContext.mediaStorage.updatePixelRatio({ mediaId, pixelRatio: pixelRatio ?? null, }); await siteContext.textCache.invalidate([dependencyKeyOfMedia(mediaId)]); return true; }, reorderMedias: async (_parent, { input }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); 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 }); return await makeGqlMedias(siteContext, medias); }, useAdminUiImage: async (_parent, { input }, { siteContext, httpContext }) => { authGuard(httpContext); siteReadyGuard(siteContext); 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 }) => { authGuard(httpContext); siteReadyGuard(siteContext); 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