mod_workspace_getLocale.js

/**
## /workspace/getLocale
The getLocale module exports the getLocale method which is required by the getLayer and workspace modules.

@requires /utils/roles
@requires /workspace/mergeTemplates
@requires /workspace/cache
@requires /workspace/getTemplate

@module /workspace/getLocale
*/

import * as Roles from '../utils/roles.js';
import workspaceCache from './cache.js';
import mergeTemplates from './mergeTemplates.js';

/**
@function getLocale
@async

@description
The getLocale method requests the workspace from cache and checks whether the requested locale is a property of the workspace.locales{}.

The workspace.locale is assigned as locale if params.locale is undefined.

The mergeTemplate module will be called to merge templates into the locale object and substitute SRC_* xyzEnvironment variables.

A role check is performed to check whether the requesting user has access to the locale.

Role objects in the locale and nested layers are merged with their respective parent objects.

@param {Object} params 
@property {string} [params.locale] Locale key.
@property {Object} [params.user] Requesting user.
@property {Array} [user.roles] User roles.

@returns {Promise<Object|Error>} JSON Locale.
*/
export default async function getLocale(params) {
  const workspace = await workspaceCache();

  if (workspace instanceof Error) {
    return workspace;
  }

  if (params.locale && !Object.hasOwn(workspace.locales, params.locale)) {
    return new Error('Unable to validate locale param.');
  }

  // The workspace.locale is assigned as locale if params.locale is not a property of workspace.locales
  let locale = Object.hasOwn(workspace.locales, params.locale)
    ? workspace.locales[params.locale]
    : workspace.locale;

  locale = await mergeTemplates(locale);

  if (!Roles.check(locale, params.user?.roles)) {
    return new Error('Role access denied.');
  }

  locale = Roles.objMerge(locale, params.user?.roles);

  locale.workspace = workspace.key;
  locale.layers ??= {};

  return locale;
}