BerniWittmann/cape-frontend

View on GitHub
src/models/base.js

Summary

Maintainability
A
35 mins
Test Coverage
export function toSnakeCase(str) {
  if (!str || typeof str !== 'string') return ''
  if (str === 'id') return '_id'
  // Handle Special substrings
  str = str.replace(/ID/g, 'Id')
  str = str.replace(/URL/g, 'Url')
  // Ensure that first char is lowercase
  str = str.replace(/^[A-Z]/, (c) => c.toLowerCase())
  return str.replace(/(.*?)([A-Z])/g, '$1_$2').toLowerCase()
}

export function convertObjectToSnakeCaseKeys(obj) {
  if (!obj || typeof obj !== 'object') return obj
  const result = {}
  for (let key of Object.keys(obj)) {
    let value = obj[key]
    if (Array.isArray(value)) {
      value = value.map(v => convertObjectToSnakeCaseKeys(v))
    } else if (typeof value === 'object') {
      value = convertObjectToSnakeCaseKeys(value)
    }
    result[toSnakeCase(key)] = value
  }
  return result
}
/**
 * Base class for all models
 *
 * Objects can be created in two different ways
 *
 * - Either direct constructor (new Process({ .. })). In this case parameter names must be snake_case
 * - Or by using static method create (Process.create({ .. })). In this case parameter names must be camelCase
 *
 * This allows to create Model objects directly from the API Responses, as well from user generated objects
 */
export default class Base {
  static create(data) {
    // Call constructor, but with snake_case converted parameters
    return new this(convertObjectToSnakeCaseKeys(data))
  }
}