diff --git a/packages/strapi-plugin-i18n/services/entity-service-decorator.js b/packages/strapi-plugin-i18n/services/entity-service-decorator.js index d52afaaedd..93df930dc6 100644 --- a/packages/strapi-plugin-i18n/services/entity-service-decorator.js +++ b/packages/strapi-plugin-i18n/services/entity-service-decorator.js @@ -7,17 +7,24 @@ const { isLocalized } = require('./content-types'); const { syncLocalizations, updateNonLocalizedFields } = require('./localizations'); const LOCALE_QUERY_FILTER = '_locale'; +const SINGLE_ENTRY_ACTIONS = ['findOne', 'update', 'delete']; /** * Adds default locale or replaces _locale by locale in query params * @param {object} params - query params */ -const wrapParams = async (params = {}) => { - if (params.id) { +const wrapParams = async (params = {}, ctx = {}) => { + const { action } = ctx; + + if (has('id', params) && SINGLE_ENTRY_ACTIONS.includes(action)) { return params; } if (has(LOCALE_QUERY_FILTER, params)) { + if (params[LOCALE_QUERY_FILTER] === 'all') { + return omit(LOCALE_QUERY_FILTER, params); + } + return { ...omit(LOCALE_QUERY_FILTER, params), locale: params[LOCALE_QUERY_FILTER], @@ -41,8 +48,10 @@ const decorator = service => ({ * @param {object} ctx - Query context * @param {object} ctx.model - Model that is being used */ - async wrapOptions(opts = {}, ctx) { - const wrappedOptions = await service.wrapOptions.apply(this, [opts, ctx]); + + async wrapOptions(opts = {}, ctx = {}) { + const wrappedOptions = await service.wrapOptions.call(this, opts, ctx); + const model = strapi.db.getModel(ctx.model); if (!isLocalized(model)) { @@ -51,7 +60,7 @@ const decorator = service => ({ return { ...wrappedOptions, - params: await wrapParams(wrappedOptions.params), + params: await wrapParams(wrappedOptions.params, ctx), }; }, @@ -63,7 +72,7 @@ const decorator = service => ({ */ async create(opts, ctx) { const model = strapi.db.getModel(ctx.model); - const entry = await service.create.apply(this, [opts, ctx]); + const entry = await service.create.call(this, opts, ctx); if (isLocalized(model)) { await syncLocalizations(entry, { model }); @@ -83,13 +92,14 @@ const decorator = service => ({ const { data, ...restOptions } = opts; - const entry = await service.update.apply(this, [ + const entry = await service.update.call( + this, { - data: omit('locale', data), + data: omit(['locale', 'localizations'], data), ...restOptions, }, - ctx, - ]); + ctx + ); if (isLocalized(model)) { await updateNonLocalizedFields(entry, { model }); diff --git a/packages/strapi/lib/services/entity-service.js b/packages/strapi/lib/services/entity-service.js index c5cd3e7a94..6ec526c7c9 100644 --- a/packages/strapi/lib/services/entity-service.js +++ b/packages/strapi/lib/services/entity-service.js @@ -60,7 +60,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async find(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { model, action: 'find' }); const { kind } = db.getModel(model); @@ -80,7 +80,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async findPage(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { model, action: 'findPage' }); return db.query(model).findPage(params, populate); }, @@ -92,7 +92,10 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async findWithRelationCounts(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { + model, + action: 'findWithRelationCounts', + }); return db.query(model).findWithRelationCounts(params, populate); }, @@ -104,7 +107,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async findOne(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { model, action: 'findOne' }); return db.query(model).findOne(params, populate); }, @@ -116,7 +119,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async count(opts, { model }) { - const { params } = await this.wrapOptions(opts, { model }); + const { params } = await this.wrapOptions(opts, { model, action: 'count' }); return db.query(model).count(params); }, @@ -128,7 +131,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async create(opts, { model }) { - const { data, files } = await this.wrapOptions(opts, { model }); + const { data, files } = await this.wrapOptions(opts, { model, action: 'create' }); const modelDef = db.getModel(model); @@ -158,7 +161,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async update(opts, { model }) { - const { params, data, files } = await this.wrapOptions(opts, { model }); + const { params, data, files } = await this.wrapOptions(opts, { model, action: 'update' }); const modelDef = db.getModel(model); const existingEntry = await db.query(model).findOne(params); @@ -191,7 +194,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async delete(opts, { model }) { - const { params } = await this.wrapOptions(opts, { model }); + const { params } = await this.wrapOptions(opts, { model, action: 'delete' }); const entry = await db.query(model).delete(params); @@ -211,7 +214,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async search(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { model, action: 'search' }); return db.query(model).search(params, populate); }, @@ -223,7 +226,10 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async searchWithRelationCounts(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { + model, + action: 'searchWithRelationCounts', + }); return db.query(model).searchWithRelationCounts(params, populate); }, @@ -235,7 +241,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async searchPage(opts, { model }) { - const { params, populate } = await this.wrapOptions(opts, { model }); + const { params, populate } = await this.wrapOptions(opts, { model, action: 'searchPage' }); return db.query(model).searchPage(params, populate); }, @@ -247,7 +253,7 @@ const createDefaultImplementation = ({ db, eventHub, entityValidator }) => ({ * @param {object} ctx.model - Model that is being used */ async countSearch(opts, { model }) { - const { params } = await this.wrapOptions(opts, { model }); + const { params } = await this.wrapOptions(opts, { model, action: 'countSearch' }); return db.query(model).countSearch(params); },