HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/good-life-be/models/index.js
import { fileURLToPath } from 'url';
import path from 'path';
import fs from 'fs';
import { logger } from '../config/winston-config.js';
import sequelize from '../config/sequelize-config.js';

const dirname = path.dirname(fileURLToPath(import.meta.url));

function getModelFiles(dir) {
  let modelFiles = [];
  const items = fs.readdirSync(dir, { withFileTypes: true });

  for (let i = 0; i < items.length; i += 1) {
    const item = items[i];
    if (item.isDirectory()) {
      modelFiles = [...modelFiles, ...getModelFiles(`${dir}/${item.name}`)];
    } else {
      modelFiles.push(`${dir}/${item.name}`);
    }
  }

  return modelFiles
    .map((f) => f.replaceAll(`${dirname}/`, ''))
    .filter((f) => f.endsWith('.js') && !f.endsWith('index.js'));
}

function fixFunctionNamingConvention(model) {
  const builtInFunctions = [
    'get',
    'set',
    'create',
    'add',
    'remove',
    'has',
    'count',
  ];

  Object.keys(model.prototype).forEach((key) => {
    if (builtInFunctions.find((v) => key.startsWith(v))) {
      const newKey = key.replace(/_([a-z])/g, (g) => g[1].toUpperCase());
      model.prototype[newKey] = model.prototype[key];
    }
  });
}

const files = getModelFiles(dirname);

(async () => {
  // eslint-disable-next-line no-restricted-syntax
  for (const file of files) {
    // eslint-disable-next-line no-await-in-loop
    await import(`file://${path.resolve(dirname, file)}`);
  }

  Object.values(sequelize.models).forEach((model) => {
    if (model.associate) {
      model.associate(sequelize.models);
      fixFunctionNamingConvention(model);
    }
  });

  sequelize
    .sync({ force: false, alter: { drop: false } })
    .then(() => logger.info('DB synced successfully.'))
    .catch((error) => logger.error('Unable to sync database:', error));
})();