Source

services/user-service.js

import api from '@/api'
import Ajv from 'ajv'
import * as R from 'ramda'

const ajv = new Ajv({
  allErrors: true,
})
ajv.addKeyword('$isNotEmpty', {
  type: 'string',
  validate: function (schema, data) {
    return typeof data === 'string' && data.trim() !== ''
  },
  errors: false,
})

export const normalizedUserParametersTable = {
  maxvue: 'userMaxMapPredefinedViewsCount',
  zoom_level: 'defaultMapZoomLevel',
  baselayer: 'userBaseLayer',
}

/**
 * Used by Settings store.
 *
 * @param {*} currentUserLogin
 * @returns {Object} Settings state object
 * Example:
 * {
 *  defaultMapZoomLevel: 14,
 *  userBaseLayer: cBaseLayerSabatier
 * }
 */
export async function getUserParametersAsObject(
  currentUserLogin = '',
  userParams = null
) {
  let result = {}
  userParams = userParams || (await getUserParameters(currentUserLogin))
  userParams.forEach((userParam) => {
    if (normalizedUserParametersTable[userParam.originalCode] !== undefined) {
      result[userParam.code] = userParam.value
    }
  })
  /*console.log('getUserParametersAsObject', {
    currentUserLogin,
    userParams,
    result,
  })*/
  return result
}

export async function getUserParameters(currentUserLogin = '') {
  let params = await api.v3.get(
    api.APIUrls.APIV3_GEORED_CLIENT_USER_PARAMETERS,
    {
      'user.login': currentUserLogin,
    }
  )
  let filteredUserParams = (params.data || [])
    .filter((param) => {
      if (
        currentUserLogin &&
        !!param.userLogin &&
        param.userLogin.toLowerCase() !== currentUserLogin.toLowerCase()
      ) {
        return false //Filter out other users parameters if currentUserLogin is provided and userLogin is available in the API response.
      }
      return true
    })
    .map(function normalizeUserParameter(param) {
      return {
        id: param.id,
        originalCode: param.parameter,
        code: normalizedUserParametersTable[param.parameter] || param.parameter,
        value: param.value,
      }
    })
  /*console.log('getUserParameters', {
    filteredUserParams,
  })*/
  return filteredUserParams
}

export async function updateUserParameter(values = {}) {
  if (values.value) {
    values.value = values.value.toString()
  }
  /*console.log('updateUserParameter', {
    values,
  })*/
  const isValid = ajv.compile({
    type: 'object',
    properties: {
      id: { type: 'number', $isNotEmpty: true },
      parameter: { type: 'string', $isNotEmpty: true },
      value: { type: 'string', $isNotEmpty: true },
    },
    required: ['parameter', 'value', 'id'],
  })

  ///console.log('updateUserParameter', values)

  //Convert settings name (Normalized) into user parameter name
  if (Object.values(normalizedUserParametersTable).includes(values.parameter)) {
    //i.g maxvue instead of userMaxMapPredefinedViewsCount
    values.parameter = Object.keys(normalizedUserParametersTable).find(
      (k) => normalizedUserParametersTable[k] === values.parameter
    )
  }

  //console.log('updateUserParameter::normalized', values.parameter, values.value)

  if (!isValid(values)) {
    console.error({
      errors: ajv.errorsText(isValid.errors),
    })
    throw new Error(ajv.errorsText(isValid.errors))
  }

  await api.v3.patch(
    `${api.APIUrls.APIV3_GEORED_CLIENT_USER_PARAMETERS}/${values.id}}`,
    values
  )
  return true
}