import path from 'path'
import keys from 'lodash-es/keys.js'
import each from 'lodash-es/each.js'
import get from 'lodash-es/get.js'
import isestr from 'wsemi/src/isestr.mjs'
import isfun from 'wsemi/src/isfun.mjs'
import isbol from 'wsemi/src/isbol.mjs'
import pmSeries from 'wsemi/src/pmSeries.mjs'
function genModels(ds, opt = {}) {
//fdModels
let fdModels = get(opt, 'fdModels')
if (!isestr(fdModels)) {
let fdSrv = path.resolve()
fdModels = `${fdSrv}/models`
}
//genModelsByTabs
let genModelsByTabs = get(opt, 'genModelsByTabs')
if (!isfun(genModelsByTabs)) {
throw new Error(`opt.genModelsByTabs is not a function, it needs to import from 'w-orm-reladb/src/genModelsByTabs.mjs'`)
}
//tabs
let tabs = {}
each(ds, (v, k) => {
tabs[k] = v.settings
})
// console.log('tabs', tabs)
//genModelsByTabs
genModelsByTabs(fdModels, tabs)
}
/**
* 由資料表收集物件ds與資料表控制物件wo產生測試資料,並儲存至資料庫
*
* @param {Object} ds 輸入資料表收集物件,ds也就是import由genIndex產生的index.mjs,其內各key代表各資料表,值代表各資料表設定與操作函數例如settings、funNew或funTestAndSave等
* @param {Object} wo 輸入資料表控制物件,各key代表各資料表,值代表各資料表操作函數例如insert、save、del等
* @param {Object} [opt={}] 輸入設定物件,預設{}
* @param {Boolean} [opt.useGenModels=false] 輸入是否呼叫genModels,若資料庫與ORM為關聯資料庫時需設定為true,同時還需給予opt.genModelsByTabs。預設為false
* @param {Function} [opt.genModelsByTabs=null] 輸入可由ds與wo產生models的函數,若資料庫與ORM為關聯資料庫時則需給予,可由程式碼import genModelsByTabs from 'w-orm-reladb/src/genModelsByTabs.mjs'取得genModelsByTabs,並再設定給opt.genModelsByTabs
* @param {String} [opt.fdModels='./models'] 輸入產生models放置的資料夾位置,預設為工作路徑下的models
* @return {Promise} 回傳Promise,resolve代表產生成功,reject代表產生失敗
* @example
*
* import genTestdata from 'w-data-collector/src/genTestdata.mjs'
* import ds from './index.mjs'
* import { woItems } from '../../server/mOrm.mjs'
*
* genTestdata(ds, woItems, {})
* // => genTestdata done
*
*/
async function genTestdata(ds, wo, opt = {}) {
//useGenModels
let useGenModels = get(opt, 'useGenModels')
if (!isbol(useGenModels)) {
useGenModels = false
}
//genModels
if (useGenModels) {
genModels(ds, opt)
console.log('genModels done')
}
//ks
let ks = keys(ds)
//funTestAndSave
await pmSeries(ks, async (k) => {
//funTestAndSave
let funTestAndSave = get(ds, `${k}.funTestAndSave`)
//check
if (isfun(funTestAndSave)) {
await ds[k].funTestAndSave(wo) //funTestAndSave為封裝funTest後會需要傳入wo, 以及改為async function
}
})
console.log('genTestdata done', ks)
}
export default genTestdata