js/datas/providers/sequelize_record_provider.js
// NPM IMPORTS
import assert from 'assert'
// COMMON IMPORTS
import T from '../../utils/types'
import RecordProvider from './record_provider'
// import runtime from '../../base/runtime'
/**
* Contextual constant for this file logs.
* @private
*/
const context = 'common/datas/providers/sequelize_record_provider'
/**
* Sequelize record provider class.
* @author Luc BORIES
* @license Apache-2.0
*/
export default class SequelizeRecordProvider extends RecordProvider
{
/**
* Create a record provider instance
*/
constructor(arg_settings)
{
super(arg_settings)
assert( T.isObject(arg_settings.model), context + ':bad settings.model object')
/**
* Sequelize record provider model instance.
* @type {object}
*/
this.sequelize_model = arg_settings.model
/**
* Sequelize record provider fields array.
* @type {array}
*/
this.fields_list = undefined
if ( T.isArray(arg_settings.fields_list) )
{
this.fields_list = arg_settings.fields_list
}
}
/**
* Build a query to fetch datas.
* @param {object|undefined} arg_query - optional query context
* @returns {Promise} datas record promise
*/
build_query(arg_query)
{
// logs.debug(context, 'build_query:enter')
let query = {}
// SET FIELDS LIST
if ( T.isObject(arg_query) && T.isArray(arg_query.fields_list) )
{
query.attributes = arg_query.fields_list
}
else if (this.fields_list)
{
query.attributes = this.fields_list
}
// logs.debug(context, 'build_query:leave')
return query
}
/**
* Provide all datas records
* @param {object|undefined} arg_query - optional query context
* @returns {Promise} datas record promise
*/
find_all_records(arg_query)
{
// logs.debug(context, 'find_all_records:enter')
const query = this.build_query(arg_query)
const records_promise = this.sequelize_model.findAll(query)
// logs.debug(context, 'find_all_records:leave')
return records_promise
}
/**
* Find a record by its id.
* @param {string|number} arg_id - record id
* @returns {Promise} - promise of found record or null
*/
find_records_by_id(arg_id)
{
// logs.debug(context, 'find_record_by_id:enter')
assert( T.isString(arg_id) || T.isNumber(arg_id), context + ':find_record_by_id:bad id string or number')
const records_promise = this.sequelize_model.findById()
// logs.debug(context, 'find_record_by_id:leave')
return records_promise
}
/**
* Find a record with a set of values.
* @param {object} arg_values_map - values map
* @param {object|undefined} arg_query - optional query context
* @returns {Promise} - promise of found records or null value
*/
find_records_by_values(arg_values_map, arg_query)
{
// logs.debug(context, 'find_record_by_values:enter')
assert( T.isObject(arg_values_map), context + ':find_record_by_values:bad values object')
// UPDATE QUERY WITH VALUES
arg_query = T.isObject(arg_query) ? arg_query : {}
arg_query.where = T.isObject(arg_query.where) ? arg_query.where : {}
Object.keys(arg_values_map).forEach(
(value) => {
arg_query.where[value] = arg_values_map[value]
}
)
const query = this.build_query(arg_query)
const records_promise = this.sequelize_model.findAll(query)
// logs.debug(context, 'find_record_by_values:leave')
return records_promise
}
}