UNPKG

kipon-xrmservice

Version:

Dynamics 365 CE web api wrapper for angular, making life easier when building angular based web resources

585 lines 97.4 kB
import { Injectable } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { XrmConfigService } from './xrmconfig.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "./xrmform.service"; export class XrmEntityKey { } export class Expand { toExpandString() { let _ex = this.name; if (this.select != null || this.filter != null) { _ex += '('; } let semi = ''; if (this.select != null) { _ex += '$select=' + this.select; semi = ';'; } if (this.filter != null) { _ex += semi + '$filter=' + this.filter; } if (this.select != null || this.filter != null) { _ex += ')'; } return _ex; } } export class XrmService { constructor(http, injector, xrmformService) { this.http = http; this.injector = injector; this.xrmformService = xrmformService; this.defaultApiUrl = "/api/data/v9.0/"; this.contextFallback = null; this.apiUrl = '/api/data/v9.0/'; this.apiVersion = 'v9.0'; this.debug = false; this.token = null; this.forceHttps = false; this.keyTries = 0; } setVersion(v) { this.apiUrl = this.defaultApiUrl.replace("9.0", v); } getContext() { if (this.contextFallback != null) { return this.contextFallback; } var x = this.xrmformService.getContext(); if (x != null) { if (typeof x.getVersion == 'undefined') { x.getVersion = () => "9.0.0.0"; } if (typeof x.$devClientUrl == 'undefined') { x.$devClientUrl = () => { return this.getContext().getClientUrl() + this.apiUrl; }; this.contextFallback = x; this.initializeVersion(this.contextFallback.getVersion()); } return x; } this.log('using fake context'); let baseUrl = "http://localhost:4200"; let version = 'v9.0'; var comesfrom = window.location.href.toLowerCase(); if (comesfrom.indexOf("webresources") >= 0) { var domain = window.location.href.split('/')[2]; var proto = comesfrom.startsWith("https://") ? "https://" : "http://"; // to-do, find a better way to render multi org sub url from the url. (for now - never needed on online, therefore blank for https, but might be needed for onpre running https ... ) var sub = comesfrom.startsWith("https://") ? "" : "/" + window.location.href.split('/')[3]; baseUrl = proto + domain + sub; } try { var configService = this.injector.get(XrmConfigService); if (configService != null) { let config = configService.getConfig(); if (config != null && config.endpoints != null && config.endpoints.orgUri != null && config.endpoints.orgUri != '') { baseUrl = config.endpoints.orgUri; } if (config != null && config.version != null && config.version != '') { version = config.version; } } } catch (err) { // no worry, XrmConfigService is optional } this.contextFallback = { getClientUrl() { return baseUrl; }, getQueryStringParameters() { let search = window.location.search; let hashes = search.slice(search.indexOf('?') + 1).split('&'); let params = {}; hashes.map(hash => { let [key, val] = hash.split('='); params[key] = decodeURIComponent(val); }); return params; }, getVersion() { return version.substring(1) + '.0.0'; }, getUserId() { return this["userid"]; }, getUserName() { return this["username"]; }, $devClientUrl() { return this['$clienturl']; } }; var headers = this.getDefaultHeader(); this.http.get(this.forceHTTPS(baseUrl) + "/api/data/" + version + "/WhoAmI()", { headers: headers }).subscribe(r => { this.log(r); let url = r['@odata.context']; let firstpart = url.split('/api/data/')[0]; let version = url.split('/api/data/')[1].split('/')[0]; this.contextFallback["$clienturl"] = firstpart + '/api/data/' + version + '/'; this.contextFallback["userid"] = r["UserId"]; this.contextFallback["username"] = "Dev. fallback from whoami"; this.initializeVersion(this.contextFallback.getVersion()); }); var x = this.contextFallback; return this.contextFallback; } getCurrentUserId() { var ctx = this.getContext(); if (ctx.getUserId() == null || ctx.getUserId() == '') { var headers = this.getDefaultHeader(); var url = this.forceHTTPS(ctx.getClientUrl()) + this.apiUrl + "/WhoAmI()"; this.log(url); return this.http.get(url, { headers: headers }).pipe(map(r => { return r["UserId"]; })); } else { this.log('get user from normal crm context'); this.log('should result in ' + ctx.getUserId()); return new Observable(obs => { setTimeout(() => obs.next(ctx.getUserId()), 100); }); } } getCurrentKey(repeatForCreateForm = false) { // First we try to find id and type in the url, this allow forcing a specific entity, directly from standard url parameters let params = this.getQueryStringParameters(); let result = new XrmEntityKey(); let id = params["id"]; let type = params["typename"]; if (id == null || id == '') { params = this.getContext().getQueryStringParameters(); id = params["id"]; type = params["typename"]; } if (this.xrmformService.getFormType() == 1 && repeatForCreateForm) { var obs = new Observable(sub => { this.tryGetKey(sub); }); return obs; } let key = this.xrmformService.getFormKey(id, type); if (key != null && key.id != null) { result.id = this.toGuid(key.id); result.entityType = key.type; return new Observable(obs => obs.next(result)); } if (this.xrmformService.getFormType() == 2) { key = this.xrmformService.getFormKey(id, type); if (key != null) { result.id = this.toGuid(key.id); result.entityType = key.type; return new Observable(obs => obs.next(result)); } else { return new Observable(obs => { var iv = setInterval(() => { let key = this.xrmformService.getFormKey(id, type); if (key != null) { clearInterval(iv); result.id = this.toGuid(key.id); result.entityType = key.type; obs.next(result); } }, 800); }); } } else { // it was not an entity form, or the entity form was not in edit mode. result.id = this.toGuid(result.id); return new Observable(obs => obs.next(result)); } } get(entityTypes, id, fields, expand = null) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); headers = headers.append("Cache-Control", "no-cache"); let addFields = ''; let sep = '?'; if (fields != null && fields != '') { addFields = sep + "$select=" + fields; sep = '&'; } let _ex = this.expandString(expand, sep); let _id = id.replace("{", "").replace("}", ""); let url = this.getContext().getClientUrl() + this.apiUrl + entityTypes + "(" + _id + ")" + addFields + _ex; this.log(url); return this.http.get(this.forceHTTPS(url), { headers: headers }); } query(entityTypes, fields, filter, orderBy = null, top = 0, count = false) { let me = this; let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=\"*\""); if (top > 0) { headers = headers.append("Prefer", "odata.maxpagesize=" + top.toString()); } else { } headers = headers.append("Cache-Control", "no-cache"); let url = this.getContext().getClientUrl() + this.apiUrl + entityTypes; if ((fields != null && fields != '') || (filter != null && filter != '') || (orderBy != null && orderBy != '') || top > 0) { url += "?"; } let sep = ''; if (fields != null && fields != '') { url += '$select=' + fields; sep = '&'; } if (filter != null && filter != '') { url += sep + '$filter=' + filter; sep = '&'; } if (orderBy != null && orderBy != '') { url += sep + '$orderby=' + orderBy; sep = '&'; } if (count) { url += sep + '$count=true'; sep = '&'; } return this.http.get(this.forceHTTPS(url), { headers: headers }).pipe(map(response => { let result = me.resolveQueryResult(response, top, [url], 0); return result; })); } create(entityType, entity) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); headers = headers.append("Prefer", "return=representation"); let options = { headers: headers, }; return this.http.post(this.forceHTTPS(this.getContext().getClientUrl()) + this.apiUrl + entityType, entity, { headers: headers, observe: "response" }).pipe(map((res) => { if (res.body == null) { let entityId = res.headers.get('OData-EntityId'); let result = { id: entityId.split('(')[1].replace(')', ''), $keyonly: true }; return result; } else { return res.body; } })); } update(entityType, entity, id, fields = null) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); headers = headers.append("Prefer", "return=representation"); let _f = ''; if (fields != null) { _f = '?$select=' + fields; } let fUrl = this.getContext().getClientUrl() + this.apiUrl + entityType + "(" + id + ")" + _f; this.log(fUrl); return this.http.patch(this.forceHTTPS(fUrl), entity, { headers: headers }).pipe(map(response => { if (response == null || this.getContext().getVersion().startsWith("8.0") || this.getContext().getVersion().startsWith("8.1")) { return entity; } return response; })); } put(entityType, id, field, value, propertyValueAs = null) { if (propertyValueAs == null) propertyValueAs = 'value'; let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let v = {}; v[propertyValueAs] = value; this.log(v); let url = this.getContext().getClientUrl() + this.apiUrl + entityType + "(" + id + ")/" + field; this.log(url); if (v[propertyValueAs] != null) { return this.http.put(this.forceHTTPS(url), v, { headers: headers }).pipe(map(response => null)); } else { return this.http.delete(this.forceHTTPS(url), { headers: headers }).pipe(map(response => null)); } } delete(entityType, id) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let url = this.getContext().getClientUrl() + this.apiUrl + entityType + "(" + id + ")"; this.log(url); return this.http.delete(this.forceHTTPS(url), { headers: headers }).pipe(map(response => null)); } getParameter(param) { return this.getQueryStringParameters()[param]; } associate(fromType, fromId, toType, toId, refname) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=*"); let url = this.getContext().getClientUrl() + this.apiUrl + fromType + "(" + this.toGuid(fromId) + ")/" + refname + "/$ref"; let data = { "@odata.id": this.getContext().$devClientUrl() + toType + "(" + this.toGuid(toId) + ")" }; if (this.debug) { this.log(url); this.log(data); } return this.http.post(this.forceHTTPS(url), data, { headers: headers }).pipe(map(response => null)); } disassociate(fromType, fromId, toType, toId, refname) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); let url = this.getContext().getClientUrl() + this.apiUrl + fromType + "(" + this.toGuid(fromId) + ")/" + refname + "/$ref?$id=" + this.getContext().$devClientUrl() + toType + "(" + this.toGuid(toId) + ")"; this.log(url); return this.http.delete(this.forceHTTPS(url), { headers: headers }).pipe(map(response => { this.log(response); return null; })); } func(name, data, boundType = null, boundId = null) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); let url = this.getContext().getClientUrl() + this.apiUrl + name; if (boundType != null) { url = this.getContext().getClientUrl() + this.apiUrl + boundType + "(" + this.toGuid(boundId) + ")/" + name; } if (data != null && data.length > 0) { url += data; } else { url += "()"; } this.log(url); return this.http.get(this.forceHTTPS(url), { headers: headers }).pipe(map(response => { this.log(response); return response; })); } action(name, data, boundType = null, boundId = null) { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); let url = this.getContext().getClientUrl() + this.apiUrl + name; if (boundType != null) { url = this.getContext().getClientUrl() + this.apiUrl + boundType + "(" + this.toGuid(boundId) + ")/" + name; } this.log(url); return this.http.post(this.forceHTTPS(url), data, { headers: headers }).pipe(map(response => { this.log(response); return response; })); } log(message) { if (this.debug) { if (typeof message == 'string') { console.dir(message); } else { console.log(message); } } } tryGetKey(sub) { setTimeout(() => { var key = this.xrmformService.getFormKey(null, null, true); if (key.id != null && key.id != '' && key.type != null && key.type != '') { let result = new XrmEntityKey(); result.entityType = key.type; result.id = key.id; sub.next(result); } else { this.keyTries++; if (this.keyTries < 900) { // continue try for 1/2 hour at most this.tryGetKey(sub); } } }, 2000); } initializeVersion(_v) { if (_v == null) { _v = '9.0.0.0'; } let v = _v.split('.'); this.setVersion(v[0] + "." + v[1]); this.apiVersion = 'v' + v[0] + '.' + v[1]; } expandString(expand, sep) { if (expand == null || expand.name == null || expand.name == '') return ''; let _ex = sep + '$expand=' + expand.toExpandString(); if (expand.additional != null && expand.additional.length > 0) { expand.additional.forEach(ad => { _ex += "," + ad.toExpandString(); }); } return _ex; } resolveQueryResult(response, top, pages, pageIndex) { let me = this; let result = { context: response["@odata.context"], count: response["@odata.count"], value: response["value"], pages: pages, prev: null, next: null, pageIndex: pageIndex, top: top, nextLink: null }; let nextLink = response["@odata.nextLink"]; if (nextLink != null && nextLink != '') { let start = nextLink.indexOf('/api'); nextLink = me.getContext().getClientUrl() + nextLink.substring(start); result = { context: result.context, count: response["@odata.count"], value: result.value, pages: pages, pageIndex: pageIndex, prev: null, top: top, nextLink: nextLink, next: () => { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=\"*\""); if (top > 0) { headers = headers.append("Prefer", "odata.maxpagesize=" + top.toString()); } headers = headers.append("Cache-Control", "no-cache"); return me.http.get(me.forceHTTPS(nextLink), { headers: headers }).pipe(map(r => { pages.push(nextLink); let pr = me.resolveQueryResult(r, top, pages, pageIndex + 1); return pr; })); } }; } if (result.pageIndex >= 1) { result.prev = () => { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=\"*\""); if (top > 0) { headers = headers.append("Prefer", "odata.maxpagesize=" + top.toString()); } else { } headers = headers.append("Cache-Control", "no-cache"); let lastPage = result.pages[result.pageIndex - 1]; return me.http.get(me.forceHTTPS(lastPage), { headers: headers }).pipe(map(r => { result.pages.splice(result.pages.length - 1, 1); let pr = me.resolveQueryResult(r, top, result.pages, result.pageIndex - 1); return pr; })); }; } return result; } getQueryStringParameters() { let search = window.location.search; let hashes = search.slice(search.indexOf('?') + 1).split('&'); let params = {}; hashes.map(hash => { let [key, val] = hash.split('='); params[key] = decodeURIComponent(val); }); return params; } toGuid(v) { // 5C48BB2A-BFC0-4E56-A262-8494E0F6A8FD if (v == null || v == '') { return v; } v = decodeURIComponent(v).replace('{', '').replace('}', ''); if (v.indexOf('-') >= 0) { return v; } return v.substr(0, 8) + '-' + v.substr(8, 4) + '-' + v.substr(12, 4) + '-' + v.substr(16, 4) + '-' + v.substr(20); } getDefaultHeader() { let headers = new HttpHeaders({ 'Accept': 'application/json' }); if (this.token != null) { this.log('crmtoken used: ' + this.token); headers = headers.append("Authorization", "Bearer " + this.token); } headers = headers.append("OData-MaxVersion", "4.0"); headers = headers.append("OData-Version", "4.0"); headers = headers.append("Content-Type", "application/json; charset=utf-8"); headers = headers.append("Prefer", "odata.include-annotations=\"*\""); return headers; } forceHTTPS(v) { if (this.forceHttps && v.startsWith("http://")) { return v.replace("http://", "https://"); } return v; } } XrmService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmService, deps: [{ token: i1.HttpClient }, { token: i0.Injector }, { token: i2.XrmFormService }], target: i0.ɵɵFactoryTarget.Injectable }); XrmService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.Injector }, { type: i2.XrmFormService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9raXBvbi14cm1zZXJ2aWNlL3NyYy9saWIveHJtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQWMsV0FBVyxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXBDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBR3ZELE1BQU0sT0FBTyxZQUFZO0NBR3hCO0FBZUQsTUFBTSxPQUFPLE1BQU07SUFNakIsY0FBYztRQUNaLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtZQUM5QyxHQUFHLElBQUksR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLEdBQUcsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBRyxDQUFBO1NBQ1g7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLEdBQUcsSUFBSSxJQUFJLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDeEM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQzlDLEdBQUcsSUFB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