{"version":3,"file":"homepage.mjs","sources":["../../../../server/src/homepage/services/homepage.ts"],"sourcesContent":["/* eslint-disable func-names */\nimport type { Core, Modules, Schema } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport type {\n  GetCountDocuments,\n  GetRecentDocuments,\n  RecentDocument,\n} from '../../../../shared/contracts/homepage';\n\nimport {\n  buildHomepageQueryFields,\n  compactSanitizedFields,\n  resolveReadableMainField,\n  resolveTitleField,\n} from './homepage-query-utils';\n\nconst createHomepageService = ({ strapi }: { strapi: Core.Strapi }) => {\n  const MAX_DOCUMENTS = 4;\n\n  const metadataService = strapi.plugin('content-manager').service('document-metadata');\n  const permissionService = strapi.admin.services.permission;\n\n  const getRegisteredContentType = (uid: RecentDocument['contentTypeUid']) => {\n    const contentType = strapi.contentTypes[uid];\n\n    if (contentType === undefined) {\n      strapi.log.warn(\n        `Skipping homepage content type \"${uid}\" because it is no longer registered.`\n      );\n      return undefined;\n    }\n\n    return contentType;\n  };\n\n  type ContentTypeConfiguration = {\n    uid: RecentDocument['contentTypeUid'];\n    settings: { mainField: string };\n  };\n  const getConfiguration = async (\n    contentTypeUids: RecentDocument['contentTypeUid'][]\n  ): Promise<ContentTypeConfiguration[]> => {\n    /**\n     * Don't use the strapi.store util because we need to make\n     * more precise queries than exact key matches, in order to make as few queries as possible.\n     */\n    const coreStore = strapi.db.query('strapi::core-store');\n    const rawConfigurations = await coreStore.findMany({\n      where: {\n        key: {\n          $in: contentTypeUids.map(\n            (contentType) => `plugin_content_manager_configuration_content_types::${contentType}`\n          ),\n        },\n      },\n    });\n\n    return rawConfigurations.map((rawConfiguration) => {\n      return JSON.parse(rawConfiguration.value);\n    });\n  };\n\n  const getPermittedContentTypes = async () => {\n    const readPermissions: Modules.Permissions.PermissionRule[] = await permissionService.findMany({\n      where: {\n        role: { users: { id: strapi.requestContext.get()?.state?.user.id } },\n        action: 'plugin::content-manager.explorer.read',\n      },\n    });\n\n    // Deduplicate subjects using a Set: the JOIN across permission -> role -> users produces one row\n    // per role the user belongs to, so a multi-role user gets duplicate subjects.\n    // Using a Set collapses them to unique content type UID.\n    return [\n      ...new Set(\n        readPermissions\n          .map((permission) => permission.subject)\n          .filter((subject): subject is RecentDocument['contentTypeUid'] => {\n            if (!subject) {\n              return false;\n            }\n\n            const contentType = strapi.contentTypes[subject as keyof typeof strapi.contentTypes];\n            const contentTypeOptions = contentType?.pluginOptions?.['content-manager'] as\n              | { visible?: boolean }\n              | undefined;\n\n            return contentTypeOptions?.visible !== false;\n          })\n      ),\n    ];\n  };\n\n  type ContentTypeMeta = {\n    fields: string[];\n    mainField: string;\n    contentType: Schema.ContentType;\n    hasDraftAndPublish: boolean;\n    uid: RecentDocument['contentTypeUid'];\n  };\n\n  const permissionCheckerService = strapi.plugin('content-manager').service('permission-checker');\n  const getPermissionChecker = (uid: string) =>\n    permissionCheckerService.create({\n      userAbility: strapi.requestContext.get()?.state.userAbility,\n      model: uid,\n    });\n\n  const getContentTypesMeta = (\n    allowedContentTypeUids: RecentDocument['contentTypeUid'][],\n    configurations: ContentTypeConfiguration[]\n  ): ContentTypeMeta[] => {\n    return allowedContentTypeUids.reduce<ContentTypeMeta[]>((acc, uid) => {\n      const configuration = configurations.find((config) => config.uid === uid);\n      const contentType = getRegisteredContentType(uid);\n\n      if (contentType === undefined) {\n        return acc;\n      }\n\n      const mainField = resolveReadableMainField(\n        contentType,\n        configuration,\n        getPermissionChecker(uid)\n      );\n      const fields = buildHomepageQueryFields(contentType, mainField);\n      const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n\n      acc.push({\n        fields,\n        mainField,\n        contentType,\n        hasDraftAndPublish,\n        uid,\n      });\n\n      return acc;\n    }, []);\n  };\n\n  const formatDocuments = (\n    documents: Modules.Documents.AnyDocument[],\n    meta: ContentTypeMeta,\n    populate?: string[]\n  ) => {\n    return documents.map((document) => {\n      const additionalFields =\n        populate?.reduce(\n          (acc, key) => {\n            acc[key] = document[key];\n            return acc;\n          },\n          {} as Record<string, any>\n        ) || {};\n      return {\n        documentId: document.documentId,\n        locale: document.locale ?? null,\n        updatedAt: new Date(document.updatedAt),\n        title: document[meta.mainField ?? 'documentId'],\n        publishedAt:\n          meta.hasDraftAndPublish && document.publishedAt ? new Date(document.publishedAt) : null,\n        contentTypeUid: meta.uid,\n        contentTypeDisplayName: meta.contentType.info.displayName,\n        kind: meta.contentType.kind,\n        ...additionalFields,\n      };\n    });\n  };\n\n  const sanitizeHomepageQuery = async (\n    meta: ContentTypeMeta,\n    additionalQueryParams?: Record<string, unknown>\n  ) => {\n    const permissionQuery = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n      limit: MAX_DOCUMENTS,\n      fields: meta.fields,\n      ...additionalQueryParams,\n      locale: '*',\n    });\n\n    const sanitizedFields = compactSanitizedFields(permissionQuery.fields);\n    if (sanitizedFields !== undefined) {\n      permissionQuery.fields = sanitizedFields;\n    }\n\n    return {\n      permissionQuery,\n      titleField: resolveTitleField(meta.mainField, sanitizedFields),\n    };\n  };\n\n  return {\n    async addStatusToDocuments(documents: RecentDocument[]): Promise<RecentDocument[]> {\n      return Promise.all(\n        documents.map(async (recentDocument) => {\n          const hasDraftAndPublish = contentTypes.hasDraftAndPublish(\n            strapi.contentType(recentDocument.contentTypeUid)\n          );\n          /**\n           * Tries to query the other version of the document if draft and publish is enabled,\n           * so that we know when to give the \"modified\" status.\n           */\n          const { availableStatus } = await metadataService.getMetadata(\n            recentDocument.contentTypeUid,\n            recentDocument,\n            {\n              availableStatus: hasDraftAndPublish,\n              availableLocales: false,\n            }\n          );\n          const status: RecentDocument['status'] = metadataService.getStatus(\n            recentDocument,\n            availableStatus\n          );\n\n          return {\n            ...recentDocument,\n            status: hasDraftAndPublish ? status : undefined,\n          };\n        })\n      );\n    },\n\n    async queryLastDocuments(\n      additionalQueryParams?: Record<string, unknown>,\n      draftAndPublishOnly?: boolean\n    ): Promise<RecentDocument[]> {\n      const permittedContentTypes = await getPermittedContentTypes();\n      const allowedContentTypeUids = draftAndPublishOnly\n        ? permittedContentTypes.filter((uid) => {\n            const contentType = getRegisteredContentType(uid);\n\n            return contentType !== undefined && contentTypes.hasDraftAndPublish(contentType);\n          })\n        : permittedContentTypes;\n      // Fetch the configuration for each content type in a single query\n      const configurations = await getConfiguration(allowedContentTypeUids);\n      // Get the necessary metadata for the documents\n      const contentTypesMeta = getContentTypesMeta(allowedContentTypeUids, configurations);\n\n      const recentDocuments = await Promise.all(\n        contentTypesMeta.map(async (meta) => {\n          const { permissionQuery, titleField } = await sanitizeHomepageQuery(\n            meta,\n            additionalQueryParams\n          );\n\n          const docs = await strapi.documents(meta.uid).findMany(permissionQuery);\n          const populate = additionalQueryParams?.populate as string[];\n\n          return formatDocuments(docs, { ...meta, mainField: titleField }, populate);\n        })\n      );\n\n      return recentDocuments\n        .flat()\n        .sort((a, b) => {\n          switch (additionalQueryParams?.sort) {\n            case 'publishedAt:desc':\n              if (!a.publishedAt || !b.publishedAt) return 0;\n              return b.publishedAt.valueOf() - a.publishedAt.valueOf();\n            case 'publishedAt:asc':\n              if (!a.publishedAt || !b.publishedAt) return 0;\n              return a.publishedAt.valueOf() - b.publishedAt.valueOf();\n            case 'updatedAt:desc':\n              if (!a.updatedAt || !b.updatedAt) return 0;\n              return b.updatedAt.valueOf() - a.updatedAt.valueOf();\n            case 'updatedAt:asc':\n              if (!a.updatedAt || !b.updatedAt) return 0;\n              return a.updatedAt.valueOf() - b.updatedAt.valueOf();\n            default:\n              return 0;\n          }\n        })\n        .slice(0, MAX_DOCUMENTS);\n    },\n\n    async getRecentlyPublishedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n      const recentlyPublishedDocuments = await this.queryLastDocuments(\n        {\n          sort: 'publishedAt:desc',\n          status: 'published',\n        },\n        true\n      );\n\n      return this.addStatusToDocuments(recentlyPublishedDocuments);\n    },\n\n    async getRecentlyUpdatedDocuments(): Promise<GetRecentDocuments.Response['data']> {\n      const recentlyUpdatedDocuments = await this.queryLastDocuments({\n        sort: 'updatedAt:desc',\n      });\n\n      return this.addStatusToDocuments(recentlyUpdatedDocuments);\n    },\n\n    async getCountDocuments(): Promise<GetCountDocuments.Response['data']> {\n      const permittedContentTypes = await getPermittedContentTypes();\n      // Fetch the configuration for each content type in a single query\n      const configurations = await getConfiguration(permittedContentTypes);\n      // Get the necessary metadata for the documents\n      const contentTypesMeta = getContentTypesMeta(permittedContentTypes, configurations);\n\n      const countDocuments = {\n        draft: 0,\n        published: 0,\n        modified: 0,\n      };\n\n      await Promise.all(\n        contentTypesMeta.map(async (meta) => {\n          const strapiDBConnection = strapi.db.connection;\n          const tableName = strapi.contentType(meta.uid).collectionName;\n          if (!tableName) return;\n\n          if (!meta.hasDraftAndPublish) {\n            const publishedDocuments = await strapiDBConnection(tableName)\n              .countDistinct('document_id as count')\n              .first();\n            countDocuments.published += Number(publishedDocuments?.count) || 0;\n            return;\n          }\n\n          // Classify each document_id into a single bucket (draft / published / modified)\n          // in one pass. Replaces three separate self-join queries that scaled poorly on\n          // large tables — see https://github.com/strapi/strapi/issues/25200.\n          const classified = strapiDBConnection(tableName)\n            .select('document_id')\n            .select(\n              strapiDBConnection.raw(\n                `CASE\n                  WHEN MAX(CASE WHEN published_at IS NOT NULL THEN 1 ELSE 0 END) = 0\n                    THEN 'draft'\n                  WHEN MAX(CASE WHEN published_at IS NULL THEN updated_at END) =\n                       MAX(CASE WHEN published_at IS NOT NULL THEN updated_at END)\n                    THEN 'published'\n                  ELSE 'modified'\n                END AS bucket`\n              )\n            )\n            .groupBy('document_id');\n\n          const counts = await strapiDBConnection\n            .from(classified.as('classified'))\n            .select(\n              strapiDBConnection.raw(\n                `COUNT(CASE WHEN bucket = 'draft' THEN 1 END) AS draft,\n                 COUNT(CASE WHEN bucket = 'published' THEN 1 END) AS published,\n                 COUNT(CASE WHEN bucket = 'modified' THEN 1 END) AS modified`\n              )\n            )\n            .first();\n\n          countDocuments.draft += Number(counts?.draft) || 0;\n          countDocuments.published += Number(counts?.published) || 0;\n          countDocuments.modified += Number(counts?.modified) || 0;\n        })\n      );\n\n      return countDocuments;\n    },\n  };\n};\n\nexport { createHomepageService };\n"],"names":["createHomepageService","strapi","MAX_DOCUMENTS","metadataService","plugin","service","permissionService","admin","services","permission","getRegisteredContentType","uid","contentType","contentTypes","undefined","log","warn","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","Set","subject","filter","contentTypeOptions","pluginOptions","visible","permissionCheckerService","getPermissionChecker","create","userAbility","model","getContentTypesMeta","allowedContentTypeUids","configurations","reduce","acc","configuration","find","config","mainField","resolveReadableMainField","fields","buildHomepageQueryFields","hasDraftAndPublish","push","formatDocuments","documents","meta","populate","document","additionalFields","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","sanitizeHomepageQuery","additionalQueryParams","permissionQuery","sanitizedQuery","read","limit","sanitizedFields","compactSanitizedFields","titleField","resolveTitleField","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","queryLastDocuments","draftAndPublishOnly","permittedContentTypes","contentTypesMeta","recentDocuments","docs","flat","sort","a","b","valueOf","slice","getRecentlyPublishedDocuments","recentlyPublishedDocuments","getRecentlyUpdatedDocuments","recentlyUpdatedDocuments","getCountDocuments","countDocuments","draft","published","modified","strapiDBConnection","connection","tableName","collectionName","publishedDocuments","countDistinct","first","Number","count","classified","select","raw","groupBy","counts","from","as"],"mappings":"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"}