This commit is contained in:
Kevin Anthoney 2016-08-07 20:49:55 +01:00
Родитель 66db0bf76f
Коммит f386a8eb62
2 изменённых файлов: 78 добавлений и 39 удалений

Просмотреть файл

@ -8,17 +8,20 @@ const Identifier = require('./identifier');
const Literal = require('./literal');
const request = require('./request');
const Lambda = require('./lambda');
const url = require('url');
const qs = require('querystring');
const Url = require('./url');
var Odata = function(config)
{
this.config = config || {};
this.qurl = url.parse(this.config.service || '');
this.url = new Url(this.config.service || '');
if(config.resources) {
this.qurl.pathname += `${config.resources}`;
this.url.addPathComponent(config.resources);
}
if(config.custom) {
_.forOwn(config.custom, function(v, k) {
this.url.addQueryParameter(v, k);
});
}
this._custom = _.assign(qs.parse(this.qurl.search), config.custom);
this._headers = config.headers || {};
this._nextLambda = 0;
if(config.version) {
@ -84,21 +87,18 @@ Odata.prototype.any = function(field, property, op, value)
Odata.prototype.resource = function(resource, value)
{
if(this.qurl.pathname.substr(-1) === '/') {
this.qurl.pathname += `${resource}`;
} else {
this.qurl.pathname += `/${resource}`;
}
var component = resource;
if(value !== undefined) {
if(_.isPlainObject(value)) {
var clauses = _.map(_.keys(value), function(k) {
return `${escape(k, true)}=${escape(value[k])}`;
});
this.qurl.pathname += `(${encodeURIComponent(clauses.join())})`;
component += `(${encodeURIComponent(clauses.join())})`;
} else {
this.qurl.pathname += `(${encodeURIComponent(escape(value))})`;
component += `(${encodeURIComponent(escape(value))})`;
}
}
this.url.addPathComponent(component);
return this;
};
@ -176,58 +176,44 @@ Odata.prototype.search = function(search)
Odata.prototype.custom = function(name, value)
{
if(value === undefined && _.isPlainObject(name)) {
_.assign(this._custom, name);
} else {
_.assign(this._custom, {name: value});
}
this.url.addQueryParameter(name, value);
return this;
};
Odata.prototype.query = function()
{
var params = this._custom;
if(this._count) {
if(this.qurl.pathname.substr(-1) === '/') {
this.qurl.pathname += '%24/count';
} else {
this.qurl.pathname += '/%24count';
}
this.url.addPathComponent('%24count');
}
if(this.config._format !== undefined && this._count === undefined) {
params['$format'] = this.config._format;
this.url.addQueryParameter('$format', this.config._format);
}
if(this._top) {
params['$top'] = this._top;
this.url.addQueryParameter('$top', this._top);
}
if(this._skip) {
params['$skip'] = this._skip;
this.url.addQueryParameter('$skip', this._skip);
}
if(this._filter !== undefined) {
params['$filter'] = this._filter.toString();
this.url.addQueryParameter('$filter', this._filter.toString());
}
if(this._select) {
params['$select'] = _.map(this._select, function(item) {
this.url.addQueryParameter('$select', _.map(this._select, function(item) {
return escape(item, true);
}).join();
}).join());
}
if(this._expand) {
params['$expand'] = _.map(this._expand, function(item) {
this.url.addQueryParameter('$expand', _.map(this._expand, function(item) {
return escape(item, true);
}).join();
}).join());
}
if(this._search) {
params['$search'] = this._search;
this.url.addQueryParameter('$search', this._search);
}
if(this._order !== undefined) {
params['$orderby'] = this._order;
this.url.addQueryParameter('$orderby', this._order);
}
if(!_.isEmpty(this._custom)) {
_.forOwn(this._custom, function(v, k) {
params[k] = v;
});
}
return url.format(_.assign({}, this.qurl, {search: qs.stringify(params)}));
return this.url.get();
};
Odata.prototype.get = function(options)

53
url.js Normal file
Просмотреть файл

@ -0,0 +1,53 @@
'use strict';
const url = require('url');
const qs = require('querystring');
const _ = require('lodash');
var Url = function(u)
{
if(u) {
this.qurl = url.parse(u);
this.params = qs.parse(this.qurl.search);
}
return this;
};
Url.prototype.addPathComponent = function(path)
{
if(this.qurl.pathname.substr(-1) === '/') {
this.qurl.pathname += path;
} else {
this.qurl.pathname += `/${path}`;
}
return;
};
Url.prototype.addQueryParameter = function(name, value)
{
if(_.isPlainObject(name)) {
_.assign(this.params, name);
} else {
this.params[name] = value;
}
return;
};
Url.prototype.get = function()
{
return url.format(_.assign({}, this.qurl, {search: qs.stringify(this.params)}));
};
Url.prototype.clone = function()
{
var u = new Url();
u.qurl = _.assign({}, this.qurl);
u.params = _.assign({}, this.params);
return u;
};
module.exports = function(u)
{
return new Url(u);
};