Skip to content

Commit

Permalink
enhancement: migrate bulk publish & unpublish to v5 (#20184)
Browse files Browse the repository at this point in the history
* chore: migrate bulk publish & unpublish to v5

* chore: change findLocales type to accept arrays

* chore: fix lint error

* chore: migrate bulkDelete to v5 (#20161)

* chore: migrate bulkDelete to v5

* chore: change findLocales type to accept strings array

* fix: docs prettier styles

* chore: remove console.log

* enhancement: migrate countManyDraftRelations to v5

* only publish not published entries

* use strapi query directly on bulkPublish

* fix api tests for bulk publish

* apply jamie feedback
  • Loading branch information
Feranchz committed May 7, 2024
1 parent b7c6256 commit 3fdf1a5
Show file tree
Hide file tree
Showing 6 changed files with 200 additions and 165 deletions.
Expand Up @@ -411,7 +411,7 @@ export default {
const { userAbility } = ctx.state;
const { model } = ctx.params;
const { body } = ctx.request;
const { ids } = body;
const { documentIds } = body;

await validateBulkActionInput(body);

Expand All @@ -422,15 +422,12 @@ export default {
return ctx.forbidden();
}

const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);
const populate = await getService('populate-builder')(model)
.populateFromQuery(permissionQuery)
.populateDeep(Infinity)
.countRelations()
.build();
const { locale } = getDocumentLocaleAndStatus(body);

const entityPromises = ids.map((id: any) => documentManager.findOne(id, model, { populate }));
const entities = await Promise.all(entityPromises);
const entityPromises = documentIds.map((documentId: any) =>
documentManager.findLocales(documentId, model, { locale, isPublished: false })
);
const entities = (await Promise.all(entityPromises)).flat();

for (const entity of entities) {
if (!entity) {
Expand All @@ -442,16 +439,17 @@ export default {
}
}

// @ts-expect-error - publish many should not return null
const { count } = await documentManager.publishMany(entities, model);
const entitiesIds = entities.map((document) => document.documentId);

const { count } = await documentManager.publishMany(entitiesIds, model, { locale });
ctx.body = { count };
},

async bulkUnpublish(ctx: any) {
const { userAbility } = ctx.state;
const { model } = ctx.params;
const { body } = ctx.request;
const { ids } = body;
const { documentIds } = body;

await validateBulkActionInput(body);

Expand All @@ -462,13 +460,12 @@ export default {
return ctx.forbidden();
}

const permissionQuery = await permissionChecker.sanitizedQuery.publish(ctx.query);
const populate = await getService('populate-builder')(model)
.populateFromQuery(permissionQuery)
.build();
const { locale } = getDocumentLocaleAndStatus(body);

const entityPromises = ids.map((id: any) => documentManager.findOne(id, model, { populate }));
const entities = await Promise.all(entityPromises);
const entityPromises = documentIds.map((documentId: any) =>
documentManager.findLocales(documentId, model, { locale, isPublished: true })
);
const entities = (await Promise.all(entityPromises)).flat();

for (const entity of entities) {
if (!entity) {
Expand All @@ -480,8 +477,10 @@ export default {
}
}

// @ts-expect-error - unpublish many should not return null
const { count } = await documentManager.unpublishMany(entities, model);
const entitiesIds = entities.map((document) => document.documentId);

const { count } = await documentManager.unpublishMany(entitiesIds, model, { locale });

ctx.body = { count };
},

Expand Down Expand Up @@ -587,7 +586,7 @@ export default {
const { userAbility } = ctx.state;
const { model } = ctx.params;
const { query, body } = ctx.request;
const { ids } = body;
const { documentIds } = body;

await validateBulkActionInput(body);

Expand All @@ -598,18 +597,32 @@ export default {
return ctx.forbidden();
}

// TODO: fix
const permissionQuery = await permissionChecker.sanitizedQuery.delete(query);
const populate = await getService('populate-builder')(model)
.populateFromQuery(permissionQuery)
.build();

const idsWhereClause = { id: { $in: ids } };
const params = {
...permissionQuery,
filters: {
$and: [idsWhereClause].concat(permissionQuery.filters || []),
},
};
const { locale } = getDocumentLocaleAndStatus(body);

const documentLocales = await documentManager.findLocales(documentIds, model, {
populate,
locale,
});

if (documentLocales.length === 0) {
return ctx.notFound();
}

for (const document of documentLocales) {
if (permissionChecker.cannot.delete(document)) {
return ctx.forbidden();
}
}

// We filter out documentsIds that maybe doesn't exist in a specific locale
const localeDocumentsIds = documentLocales.map((document) => document.documentId);

const { count } = await documentManager.deleteMany(params, model);
const { count } = await documentManager.deleteMany(localeDocumentsIds, model, { locale });

ctx.body = { count };
},
Expand Down Expand Up @@ -650,8 +663,7 @@ export default {

async countManyEntriesDraftRelations(ctx: any) {
const { userAbility } = ctx.state;
const ids = ctx.request.query.ids as any;
const locale = ctx.request.query.locale;
const { documentIds, locale } = ctx.request.query;
const { model } = ctx.params;

const documentManager = getService('document-manager');
Expand All @@ -661,21 +673,21 @@ export default {
return ctx.forbidden();
}

const entities = await documentManager.findMany(
const documents = await documentManager.findMany(
{
filters: {
id: ids,
documentId: { $in: documentIds },
},
locale,
},
model
);

if (!entities) {
if (!documents) {
return ctx.notFound();
}

const number = await documentManager.countManyEntriesDraftRelations(ids, model, locale);
const number = await documentManager.countManyEntriesDraftRelations(documentIds, model, locale);

return {
data: number,
Expand Down
Expand Up @@ -12,7 +12,7 @@ const kindSchema = yup.string().oneOf(TYPES).nullable();

const bulkActionInputSchema = yup
.object({
ids: yup.array().of(yup.strapiID()).min(1).required(),
documentIds: yup.array().of(yup.strapiID()).min(1).required(),
})
.required();

Expand Down

0 comments on commit 3fdf1a5

Please sign in to comment.