{"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  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    return readPermissions\n      .map((permission) => permission.subject)\n      .filter(Boolean) as RecentDocument['contentTypeUid'][];\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.map((uid) => {\n      const configuration = configurations.find((config) => config.uid === uid);\n      const contentType = strapi.contentType(uid);\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      return {\n        fields,\n        mainField,\n        contentType,\n        hasDraftAndPublish,\n        uid,\n      };\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            return contentTypes.hasDraftAndPublish(strapi.contentType(uid));\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","getConfiguration","contentTypeUids","coreStore","db","query","rawConfigurations","findMany","where","key","$in","map","contentType","rawConfiguration","JSON","parse","value","getPermittedContentTypes","readPermissions","role","users","id","requestContext","get","state","user","action","subject","filter","Boolean","permissionCheckerService","getPermissionChecker","uid","create","userAbility","model","getContentTypesMeta","allowedContentTypeUids","configurations","configuration","find","config","mainField","resolveReadableMainField","fields","buildHomepageQueryFields","hasDraftAndPublish","contentTypes","formatDocuments","documents","meta","populate","document","additionalFields","reduce","acc","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","sanitizeHomepageQuery","additionalQueryParams","permissionQuery","sanitizedQuery","read","limit","sanitizedFields","compactSanitizedFields","undefined","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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"}