strapi/packages/strapi-plugin-i18n/services/entity-service-decorator.js

116 lines
2.9 KiB
JavaScript
Raw Normal View History

'use strict';
const { has, omit } = require('lodash/fp');
const { getDefaultLocale } = require('./locales');
const { isLocalized } = require('./content-types');
const { syncLocalizations, updateNonLocalizedFields } = require('./localizations');
const LOCALE_QUERY_FILTER = '_locale';
2021-03-15 15:47:10 +01:00
const SINGLE_ENTRY_ACTIONS = ['findOne', 'update', 'delete'];
/**
* Adds default locale or replaces _locale by locale in query params
* @param {object} params - query params
*/
2021-03-15 15:47:10 +01:00
const wrapParams = async (params = {}, ctx = {}) => {
const { action } = ctx;
if (has('id', params) && SINGLE_ENTRY_ACTIONS.includes(action)) {
2021-03-15 11:38:39 +01:00
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],
};
}
return {
...params,
locale: await getDefaultLocale(),
};
};
/**
* Decorates the entity service with I18N business logic
* @param {object} service - entity service
*/
const decorator = service => ({
/**
* Wraps query options. In particular will add default locale to query params
* @param {object} opts - Query options object (params, data, files, populate)
* @param {object} ctx - Query context
* @param {object} ctx.model - Model that is being used
*/
async wrapOptions(opts = {}, ctx = {}) {
2021-03-15 15:47:10 +01:00
const wrappedOptions = await service.wrapOptions.call(this, opts, ctx);
const model = strapi.db.getModel(ctx.model);
if (!isLocalized(model)) {
return wrappedOptions;
}
return {
...wrappedOptions,
2021-03-15 15:47:10 +01:00
params: await wrapParams(wrappedOptions.params, ctx),
};
},
/**
* Creates an entry & make links between it and its related localizaionts
* @param {object} opts - Query options object (params, data, files, populate)
* @param {object} ctx - Query context
* @param {object} ctx.model - Model that is being used
*/
async create(opts, ctx) {
const model = strapi.db.getModel(ctx.model);
2021-03-15 15:47:10 +01:00
const entry = await service.create.call(this, opts, ctx);
if (isLocalized(model)) {
await syncLocalizations(entry, { model });
}
return entry;
},
/**
* Updates an entry & update related localizations fields
* @param {object} opts - Query options object (params, data, files, populate)
* @param {object} ctx - Query context
* @param {object} ctx.model - Model that is being used
*/
async update(opts, ctx) {
const model = strapi.db.getModel(ctx.model);
const { data, ...restOptions } = opts;
2021-03-15 15:47:10 +01:00
const entry = await service.update.call(
this,
{
data: omit(['locale', 'localizations'], data),
...restOptions,
},
2021-03-15 15:47:10 +01:00
ctx
);
if (isLocalized(model)) {
await updateNonLocalizedFields(entry, { model });
}
return entry;
},
});
module.exports = {
decorator,
wrapParams,
};