UNPKG

fms-js

Version:

FileMaker Server Connection for Node and the browser

149 lines (125 loc) 3.37 kB
/** * Created by toddgeist on 5/3/15. */ 'use strict' var _ = require('lodash'); var is = require('is'); var FileMakerServerError = require('./FileMakerServerError'); /** * creates a query object * @param post * @param options * @returns {{send: Function}} */ var createQuery = function (post, options) { var options = options var post = post // .send(options) .set('Content-Type', 'application/x-www-form-urlencoded'); var send = function(cb){ post.send(options).end(function (err, response) { if(err) return cb(err) var fmResponse = parseFMResponse(response.body.fmresultset); if (is.instance (fmResponse, FileMakerServerError)) { fmResponse.url = post.url fmResponse.data = post._data cb ( fmResponse ) }else{ cb (null, fmResponse ) } }) }; var set = function(name, value){ options[name]=value return this } return { send : send, set : set } }; /** * handle the response from the request * @param fmresultset * @returns {*} */ var parseFMResponse = function (fmresultset) { var error = fmresultset.error[0].$.code if(error != 0 ){ var err = new FileMakerServerError(error,''); //some errors are transient, they should just return empty sets and basic info if(err.isTransient){ return { error : error , errorMessage : err.message } }else{ return err } } var recordset = fmresultset.resultset[0] var records = recordset.record var data if (records){ data = records.map(function (record) { var obj = remapFields(record.field); var relatedSets = record.relatedset if(relatedSets){ obj.relatedSets = handleRelatedSets(relatedSets) } obj.modid= record.$['mod-id']; obj.recid = record.$['record-id']; return obj }) }else{ data = []; } return { totalRecords : recordset.$.count , error : error, fetchSize : recordset.$['fetch-size'], data : data } }; /** * change the Object structure into { field : value, field2 , value2 } * @param fields * @returns {{}} */ var remapFields = function (fields) { var obj = {}; fields.forEach(function (field) { obj[field.$.name] = field.data[0] }); return obj }; /** * handle all the relatedSets ie Portals * @param relatedSets * @returns {Array} */ var handleRelatedSets = function(relatedSets){ var result = []; relatedSets.forEach(function(relatedSet){ var obj = { count: relatedSet.$.count, table: relatedSet.$.table } var records = relatedSet.record var data if (records){ data = records.map(function (record) { var obj = remapFields(record.field); obj.modid= record.$['mod-id']; obj.recid = record.$['record-id']; return obj }) }else{ data = []; } obj.data = data result.push(obj) }) return result } module.exports = createQuery