{"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\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 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 fields = ['documentId', 'updatedAt'];\n\n      // Add fields required to get the status if D&P is enabled\n      const hasDraftAndPublish = contentTypes.hasDraftAndPublish(contentType);\n      if (hasDraftAndPublish) {\n        fields.push('publishedAt');\n      }\n\n      // Only add the main field if it's defined\n      if (configuration?.settings.mainField) {\n        fields.push(configuration.settings.mainField);\n      }\n\n      // Only add locale if it's localized\n      const isLocalized = (contentType.pluginOptions?.i18n as any)?.localized;\n      if (isLocalized) {\n        fields.push('locale');\n      }\n\n      return {\n        fields,\n        mainField: configuration!.settings.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 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  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 = await getPermissionChecker(meta.uid).sanitizedQuery.read({\n            limit: MAX_DOCUMENTS,\n            fields: meta.fields,\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, 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) {\n            const draftDocuments = await strapiDBConnection(tableName)\n              .whereNull('published_at')\n              .whereIn('document_id', function () {\n                this.select('document_id')\n                  .from(tableName)\n                  .groupBy('document_id')\n                  .havingRaw('COUNT(*) = 1');\n              })\n              .count('* as count')\n              .first();\n            countDocuments.draft += Number(draftDocuments?.count) || 0;\n\n            const publishedDocuments = meta.hasDraftAndPublish\n              ? await strapiDBConnection(tableName)\n                  .countDistinct('draft.document_id as count')\n                  .from(`${tableName} as draft`)\n                  .join(`${tableName} as published`, function () {\n                    this.on('draft.document_id', '=', 'published.document_id')\n                      .andOn('draft.updated_at', '=', 'published.updated_at')\n                      .andOnNull('draft.published_at')\n                      .andOnNotNull('published.published_at');\n                  })\n                  .first()\n              : await strapiDBConnection(tableName)\n                  .countDistinct('document_id as count')\n                  .from(`${tableName}`)\n                  .first();\n            countDocuments.published += Number(publishedDocuments?.count) || 0;\n\n            const modifiedDocuments = await strapiDBConnection(tableName)\n              .select('draft.document_id')\n              .from(`${tableName} as draft`)\n              .join(`${tableName} as published`, function () {\n                this.on('draft.document_id', '=', 'published.document_id')\n                  .andOn('draft.updated_at', '!=', 'published.updated_at')\n                  .andOnNull('draft.published_at')\n                  .andOnNotNull('published.published_at');\n              })\n              .countDistinct('draft.document_id as count')\n              .groupBy('draft.document_id')\n              .first();\n            countDocuments.modified += Number(modifiedDocuments?.count) || 0;\n          }\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","getContentTypesMeta","allowedContentTypeUids","configurations","uid","configuration","find","config","fields","hasDraftAndPublish","contentTypes","push","settings","mainField","isLocalized","pluginOptions","i18n","localized","formatDocuments","documents","meta","populate","document","additionalFields","reduce","acc","documentId","locale","updatedAt","Date","title","publishedAt","contentTypeUid","contentTypeDisplayName","info","displayName","kind","permissionCheckerService","getPermissionChecker","create","userAbility","model","addStatusToDocuments","Promise","all","recentDocument","availableStatus","getMetadata","availableLocales","status","getStatus","undefined","queryLastDocuments","additionalQueryParams","draftAndPublishOnly","permittedContentTypes","contentTypesMeta","recentDocuments","permissionQuery","sanitizedQuery","read","limit","docs","flat","sort","a","b","valueOf","slice","getRecentlyPublishedDocuments","recentlyPublishedDocuments","getRecentlyUpdatedDocuments","recentlyUpdatedDocuments","getCountDocuments","countDocuments","draft","published","modified","strapiDBConnection","connection","tableName","collectionName","draftDocuments","whereNull","whereIn","select","from","groupBy","havingRaw","count","first","Number","publishedDocuments","countDistinct","join","on","andOn","andOnNull","andOnNotNull","modifiedDocuments"],"mappings":"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"}