sharepoint-rest
Version:
Angular service for accessing SharePoint Lists using REST API
438 lines (393 loc) • 16.9 kB
JavaScript
(function() {
angular.module('sharepoint.rest', []).factory('sharepointRESTService', sharepointRESTService)
sharepointRESTService.$inject = ['$q', '$http', '$location'];
function sharepointRESTService($q, $http, $location) {
var factoryUtil = {};
// Generate URL and Form Digest Value
factoryUtil.generateSPData = function() {
var deferred = $q.defer();
$http({
url: "_api/contextinfo",
method: "POST",
headers: {
"accept": "application/json;odata=verbose",
"content-Type": "application/json;odata=verbose"
}
}).success(function(result) {
var SP_data = {};
SP_data.site_url = result.d.GetContextWebInformation.WebFullUrl;
SP_data.form_digest = result.d.GetContextWebInformation.FormDigestValue;
sessionStorage.setItem('SPSiteUrl', SP_data.site_url);
sessionStorage.setItem('SPFormDigest', SP_data.form_digest);
deferred.resolve(SP_data);
}).error(function() {
deferred.reject({
error: "Failed to establish connection with SharePoint"
});
});
return deferred.promise;
}
// Get URL and Form Digest Value
factoryUtil.getSPData = function() {
var deferred = $q.defer();
var SP_data = {};
SP_data.site_url = sessionStorage.getItem('SPSiteUrl');
SP_data.form_digest = sessionStorage.getItem('SPFormDigest');
if(SP_data.site_url == null || SP_data.form_digest == null || $location.absUrl().indexOf(SP_data.site_url) < 0) {
factoryUtil.generateSPData().then(function(SP_data) {
deferred.resolve(SP_data);
}, function(e) {
deferred.reject({
error: e.error ? e.error : "Failed to fetch SharePoint data"
});
});
} else {
deferred.resolve(SP_data);
}
return deferred.promise;
}
// Get Site URL
factoryUtil.getSiteURL = function() {
var deferred = $q.defer();
var site_url = sessionStorage.getItem('SPSiteUrl');
if(site_url == null || $location.absUrl().indexOf(site_url) < 0) {
factoryUtil.generateSPData().then(function(SP_data) {
deferred.resolve(SP_data.site_url);
}, function(e) {
deferred.reject({
error: e.error ? e.error : "Failed to fetch SharePoint URL"
});
});
} else {
deferred.resolve(site_url);
}
return deferred.promise;
}
// Get Form Digest Value
factoryUtil.getFormDigestValue = function() {
var deferred = $q.defer();
var form_digest = sessionStorage.getItem('SPFormDigest');
if(form_digest == null) {
factoryUtil.generateSPData().then(function(SP_data) {
deferred.resolve(SP_data.form_digest);
}, function(e) {
deferred.reject({
error: e.error ? e.error : "Failed to fetch SharePoint FormDigestValue"
});
});
} else {
deferred.resolve(form_digest);
}
return deferred.promise;
}
// HTTP Get from URL
factoryUtil.getFromURL = function(get_url, filters) {
var deferred = $q.defer();
factoryUtil.getSiteURL().then(function(site_url) {
var url = site_url + get_url;
if (!angular.isUndefined(filters)) {
url += "?" + factoryUtil.build_filters(filters)
}
$http({
url: url,
method: "GET",
headers: {
"accept": "application/json;odata=verbose",
"content-Type": "application/json;odata=verbose"
}
}).success(function(result) {
deferred.resolve(result);
}).error(function(result, status) {
deferred.reject({
error: result,
status: status
});
});
}, function(e) {
deferred.reject({
error: e.error
});
});
return deferred.promise;
};
// HTTP Get
factoryUtil.getListItems = function(list_name, filters) {
var deferred = $q.defer();
factoryUtil.getSiteURL().then(function(site_url) {
var url = site_url + "/_api/web/lists/GetByTitle('" + list_name + "')/Items";
if (!angular.isUndefined(filters)) {
url += "?" + factoryUtil.build_filters(filters)
}
$http({
url: url,
method: "GET",
headers: {
"accept": "application/json;odata=verbose",
"content-Type": "application/json;odata=verbose"
}
}).success(function(result) {
deferred.resolve(result.d.results);
}).error(function(result, status) {
deferred.reject({
error: result,
status: status
});
});
}, function(e) {
deferred.reject({
error: e.error
});
});
return deferred.promise;
};
// HTTP Create
factoryUtil.createListItem = function(list_name, data, def) {
data.__metadata = {
"type": factoryUtil.getListName(list_name)
};
var deferred = def || $q.defer();
factoryUtil.getSPData().then(function(SP_data) {
var site_url = SP_data.site_url;
var form_digest = SP_data.form_digest;
var url = site_url + "/_api/web/lists/getbytitle('" + list_name + "')/Items";
$http({
url: url,
method: "POST",
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": form_digest,
"content-Type": "application/json;odata=verbose"
},
data: JSON.stringify(data)
}).success(function(result) {
deferred.resolve(result);
}).error(function(result, status) {
if(status == 403) {
factoryUtil.generateSPData().then(function() {
factoryUtil.createListItem(list_name, data, deferred);
});
} else {
deferred.reject({
error: result,
status: status
});
}
});
}, function(e) {
deferred.reject({
error: e.error
});
});
return deferred.promise;
};
// HTTP Update
factoryUtil.updateListItem = function(list_name, list_id, data, def) {
data.__metadata = {
"type": factoryUtil.getListName(list_name)
};
var deferred = def || $q.defer();
factoryUtil.getSPData().then(function(SP_data) {
var site_url = SP_data.site_url;
var form_digest = SP_data.form_digest;
var url = site_url + "/_api/Web/Lists/getByTitle('" + list_name + "')/Items(" + list_id + ")";
$http({
url: url,
method: "POST",
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": form_digest,
"content-Type": "application/json;odata=verbose",
"X-HTTP-Method": "MERGE",
"If-Match": "*"
},
data: data
}).success(function(result) {
deferred.resolve(result);
}).error(function(result, status) {
if(status == 403) {
factoryUtil.generateSPData().then(function() {
factoryUtil.updateListItem(list_name, list_id, data, deferred);
});
} else {
deferred.reject({
error: result,
status: status
});
}
});
}, function(e) {
deferred.reject({
error: e.error
});
});
return deferred.promise;
};
// HTTP Delete
factoryUtil.deleteListItem = function(list_name, list_id, def) {
var deferred = def || $q.defer();
factoryUtil.getSPData().then(function(SP_data) {
var site_url = SP_data.site_url;
var form_digest = SP_data.form_digest;
var url = site_url + "/_api/Web/Lists/getByTitle('" + list_name + "')/Items(" + list_id + ")";
$http({
url: url,
method: "DELETE",
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": form_digest,
"IF-MATCH": "*"
}
}).success(function(result) {
deferred.resolve(result);
}).error(function(result, status) {
if(status == 403) {
factoryUtil.generateSPData().then(function() {
factoryUtil.deleteListItem(list_name, list_id, deferred);
});
} else {
deferred.reject({
error: result,
status: status
});
}
});
}, function(e) {
deferred.reject({
error: e.error
});
});
return deferred.promise;
};
// Send Email
factoryUtil.sendEmail = function(emailObj, def) {
var data = {
'properties': {
'__metadata': {
'type': 'SP.Utilities.EmailProperties'
},
'To': {
results : []
},
'CC': {
results : []
},
'BCC': {
results : []
},
'Subject': emailObj.subject,
'Body': emailObj.body
}
}
var deferred = def || $q.defer();
if(angular.isDefined(emailObj.to)) {
if(Array.isArray(emailObj.to)) {
data.properties.To.results = emailObj.to;
} else {
data.properties.To.results = [emailObj.to];
}
}
if(angular.isDefined(emailObj.cc)) {
if(Array.isArray(emailObj.cc)) {
data.properties.CC.results = emailObj.cc;
} else {
data.properties.CC.results = [emailObj.cc];
}
}
if(angular.isDefined(emailObj.bcc)) {
if(Array.isArray(emailObj.bcc)) {
data.properties.BCC.results = emailObj.bcc;
} else {
data.properties.BCC.results = [emailObj.bcc];
}
}
factoryUtil.getSPData().then(function(SP_data) {
var site_url = SP_data.site_url;
var form_digest = SP_data.form_digest;
var url = site_url + "/_api/SP.Utilities.Utility.SendEmail";
$http({
url: url,
method: "POST",
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": form_digest,
"content-Type": "application/json;odata=verbose"
},
data: JSON.stringify(data)
}).success(function(result) {
deferred.resolve(result);
}).error(function(result, status) {
if(status == 403) {
factoryUtil.generateSPData().then(function() {
factoryUtil.sendEmail(emailObj, deferred);
});
} else {
deferred.reject({
error: result,
status: status
});
}
});
}, function(e) {
deferred.reject({
error: e.error
});
});
return deferred.promise;
}
// Generate List Name
factoryUtil.getListName = function(name) {
return "SP.Data." + name.charAt(0).toUpperCase() + name.split('_').join('_x005f_').split(' ').join('').slice(1) + "ListItem";
};
// Build filters
factoryUtil.build_filters = function(filters) {
var url_filter = [];
url_filter[0] = []; // select
url_filter[1] = []; // orderby
url_filter[2] = []; // top
url_filter[3] = []; // skip
url_filter[4] = []; // filter And
url_filter[5] = []; // expand
url_filter[6] = []; // filter Or
var url = [];
if (!angular.isUndefined(filters.select)) {
url_filter[0].push(filters.select.join());
}
if (!angular.isUndefined(filters.expand)) {
angular.forEach(filters.expand, function(columns, field) {
angular.forEach(columns, function(value, key) {
url_filter[0].push(field + '/' + value);
});
url_filter[5].push(field);
});
url_filter[5] = '$expand=' + url_filter[5].join();
}
if (!angular.isUndefined(filters.orderby)) {
url_filter[1] = '$orderby=' + filters.orderby;
}
if (!angular.isUndefined(filters.top)) {
url_filter[2] = '$top=' + filters.top;
}
if (!angular.isUndefined(filters.skip)) {
url_filter[3] = '$skip=' + filters.skip;
}
if (!angular.isUndefined(filters.filter)) {
angular.forEach(filters.filter, function(value, field) {
url_filter[4].push('(' + field + ' ' + value[0] + ' \'' + value[1] + '\')');
});
url_filter[4] = '$filter=(' + url_filter[4].join(' and ') + ')';
}
if (!angular.isUndefined(filters.filterOr)) {
angular.forEach(filters.filterOr, function(value, field) {
url_filter[6].push('(' + field + ' ' + value[0] + ' \'' + value[1] + '\')');
});
url_filter[6] = '$filter=(' + url_filter[6].join(' or ') + ')';
}
if (url_filter[0].length) url_filter[0] = '$select=' + url_filter[0].join();
angular.forEach(url_filter, function(value, key) {
if (url_filter[key].length) url.push(value);
});
return url.join('&');
}
return factoryUtil;
}
})()