From fa049a37a12f0ff7b1af620cf18443ebd7b5d613 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 26 Mar 2018 18:26:21 +0530 Subject: [PATCH] frappe.call --- client/desk/reportpage.js | 8 +------- client/index.js | 25 +++++++++++++++++++++++++ index.js | 27 +++++++++++++++++++++++++++ utils/index.js | 11 +++++++---- 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/client/desk/reportpage.js b/client/desk/reportpage.js index a71befb3..3a5668bf 100644 --- a/client/desk/reportpage.js +++ b/client/desk/reportpage.js @@ -66,13 +66,7 @@ module.exports = class ReportPage extends Page { const filterValues = this.getFilterValues(); if (filterValues === false) return; - let response = await fetch(this.url + '?' + frappe.getQueryString(filterValues), { - method: 'GET', - headers: { - Accept: 'application/json' - } - }) - const data = await response.json(); + let data = await frappe.call({method: this.method, args: filterValues}); this.datatable.refresh(data); } diff --git a/client/index.js b/client/index.js index 1c5e64cd..be93864c 100644 --- a/client/index.js +++ b/client/index.js @@ -14,6 +14,8 @@ module.exports = { frappe.registerModels(require('../models'), 'client'); frappe.fetch = window.fetch.bind(); + + this.setCall(); frappe.db = await new HTTPClient({server: server}); this.socket = io.connect('http://localhost:8000'); // eslint-disable-line frappe.db.bindSocketClient(this.socket); @@ -24,6 +26,29 @@ module.exports = { frappe.desk = new Desk(columns); await frappe.login(); + }, + + setCall() { + frappe.call = async ({method, type='get', args}) => { + let url = `/api/method/${method}`; + let request = {}; + + if (args) { + if (type.toLowerCase()==='get') { + url += '?' + frappe.getQueryString(args); + } else { + // POST / PUT / DELETE + request.body = JSON.stringify(args); + } + } + + request.headers = { 'Accept': 'application/json' }; + request.method = type.toUpperCase(); + + let response = await fetch(url, request); + + return await response.json(); + } } }; diff --git a/index.js b/index.js index 978625c8..efed18e9 100644 --- a/index.js +++ b/index.js @@ -20,6 +20,7 @@ module.exports = { this.forms = {}; this.views = {}; this.flags = {}; + this.methods = {}; // temp params while calling routes this.params = {}; }, @@ -46,6 +47,32 @@ module.exports = { this.views[view][name] = module; }, + registerMethod({method, type, handler}) { + type = type.toLowerCase(); + this.methods[method] = handler; + if (this.app) { + // add to router if client-server + this.app[type](`/api/method/${method}`, this.asyncHandler(async function(request, response) { + let args = {}; + if (type==='get') { + args = request.query; + } else { + args = request.body; + } + const data = await handler(args); + response.json(data); + })); + } + }, + + call({method, type, args}) { + if (this.methods[method]) { + return this.methods[method](args); + } else { + throw `${method} not found`; + } + }, + addToCache(doc) { if (!this.docs) return; diff --git a/utils/index.js b/utils/index.js index c291ee9e..f9e1d019 100644 --- a/utils/index.js +++ b/utils/index.js @@ -48,10 +48,13 @@ module.exports = { getQueryString(params) { if (!params) return ''; - return Object.keys(params) - .map(k => params[k] != null ? encodeURIComponent(k) + '=' + encodeURIComponent(params[k]) : null) - .filter(v => v) - .join('&'); + let parts = []; + for (let key in params) { + if (key!=null && params[key]!=null) { + parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key])) + } + } + return parts.join('&'); }, asyncHandler(fn) {