From 586871eb19c8cbe07a3f0f81442826ff4d2c0a7d Mon Sep 17 00:00:00 2001 From: Keith Rozett Date: Thu, 12 May 2016 17:09:50 -0700 Subject: [PATCH 1/6] Issue #3 - Pass data in to /class/search call --- ohmage.js | 2 +- ohmage.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ohmage.js b/ohmage.js index 4d564a5..365cff8 100644 --- a/ohmage.js +++ b/ohmage.js @@ -310,7 +310,7 @@ //@args class_urn oh.class.search = function(data){ - return oh.call("/class/search") + return oh.call("/class/search", data) } oh.campaign.read = function(data){ diff --git a/ohmage.min.js b/ohmage.min.js index ac6ff36..d04d62c 100644 --- a/ohmage.min.js +++ b/ohmage.min.js @@ -1 +1 @@ -!function(e,n){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],n):"object"==typeof exports?module.exports=n(require("jquery","jquery.cookie")):e.returnExports=n(jQuery)}(this,function(e){Ohmage=function(n,r){function t(e,n,r){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;n>l?t=setTimeout(i,n-l):(t=null,r||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=r&&!t;return t||(t=setTimeout(i,n)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var n,r=!1;return function(){return r?n:(r=!0,n=e.apply(this,arguments),e=null,n)}}if(!n||!r)throw"app and client are required parameters.";n=n.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,n){return u.push({name:e,fun:n}),c},c.call=function(t,a,c){function o(n,r,t){t.status&&e.each(s,function(e,a){a(n,r,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=r,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:n+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(n,r,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!n||""==n){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,r,s)}var i=e.parseJSON(n);if("success"==i.result)u.resolve(c(i),r,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,r,s)}else{o(s,-2,a),u.reject(a,r,s)}}else u.resolve(n,r,a);return u.promise()},function(n,r,t){var a=e.Deferred();return n.status&&o("HTTP "+n.status+": "+n.responseText,-3,n),a.reject(n,r,t),a.promise()});return l.error=function(e){return s.push(function(n,r,t){return e(n,r,t),l}),l},e.each(u,function(e,n){l[n.name](n.fun)}),l},c.callform=function(n,t,a){var u=new FormData;return u.append("client",r),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,n){u.append(e,n)}),c.call(n,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,n){return c.user.auth_token({user:e,password:n})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,n){return c["class"].update({class_urn:e,user_role_list_add:n})},c["class"].removeuser=function(e,n){return c["class"].update({class_urn:e,user_list_remove:n})},c["class"].search=function(e){return c.call("/class/search")},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,n){return c.campaign.update({campaign_urn:e,class_list_add:n})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response["delete"]=function(e,n){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:n})},c.response.update=function(e,n,r){return c.call("/survey_response/update",{campaign_urn:e,survey_key:n,privacy_state:r?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(n){e("html").click(function(){c.ping()})}),c.config.read().done(function(e){console.log("This is Ohmage/"+e.application_name+" "+e.application_version+" ("+e.application_build+")")}).error(function(e,n){console.log("Ohmage seems offline: "+e)}),c}}); \ No newline at end of file +!function(e,n){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],n):"object"==typeof exports?module.exports=n(require("jquery","jquery.cookie")):e.returnExports=n(jQuery)}(this,function(e){Ohmage=function(n,r){function t(e,n,r){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;n>l?t=setTimeout(i,n-l):(t=null,r||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=r&&!t;return t||(t=setTimeout(i,n)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var n,r=!1;return function(){return r?n:(r=!0,n=e.apply(this,arguments),e=null,n)}}if(!n||!r)throw"app and client are required parameters.";n=n.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,n){return u.push({name:e,fun:n}),c},c.call=function(t,a,c){function o(n,r,t){t.status&&e.each(s,function(e,a){a(n,r,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=r,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:n+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(n,r,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!n||""==n){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,r,s)}var i=e.parseJSON(n);if("success"==i.result)u.resolve(c(i),r,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,r,s)}else{o(s,-2,a),u.reject(a,r,s)}}else u.resolve(n,r,a);return u.promise()},function(n,r,t){var a=e.Deferred();return n.status&&o("HTTP "+n.status+": "+n.responseText,-3,n),a.reject(n,r,t),a.promise()});return l.error=function(e){return s.push(function(n,r,t){return e(n,r,t),l}),l},e.each(u,function(e,n){l[n.name](n.fun)}),l},c.callform=function(n,t,a){var u=new FormData;return u.append("client",r),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,n){u.append(e,n)}),c.call(n,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,n){return c.user.auth_token({user:e,password:n})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,n){return c["class"].update({class_urn:e,user_role_list_add:n})},c["class"].removeuser=function(e,n){return c["class"].update({class_urn:e,user_list_remove:n})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,n){return c.campaign.update({campaign_urn:e,class_list_add:n})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response["delete"]=function(e,n){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:n})},c.response.update=function(e,n,r){return c.call("/survey_response/update",{campaign_urn:e,survey_key:n,privacy_state:r?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(n){e("html").click(function(){c.ping()})}),c.config.read().done(function(e){console.log("This is Ohmage/"+e.application_name+" "+e.application_version+" ("+e.application_build+")")}).error(function(e,n){console.log("Ohmage seems offline: "+e)}),c}}); \ No newline at end of file From d8bf3329c24ee40a1d2156881d6ebe41bbc481c4 Mon Sep 17 00:00:00 2001 From: Keith Rozett Date: Thu, 12 May 2016 17:37:57 -0700 Subject: [PATCH 2/6] Issue #5 - Add more customizable /survey_response/read call --- ohmage.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ohmage.js b/ohmage.js index 365cff8..325c5c1 100644 --- a/ohmage.js +++ b/ohmage.js @@ -459,6 +459,16 @@ }) } + oh.response.read_custom = function(data){ + //set defaults + data = data || {}; + data.column_list = data.column_list || "urn:ohmage:special:all"; + data.output_format = data.output_format || "json-rows"; + data.survey_id_list = data.survey_id_list || "urn:ohmage:special:all"; + data.user_list = data.user_list || "urn:ohmage:special:all"; + return oh.call("/survey_response/read", data) + } + oh.response.delete = function(urn, survey_key){ return oh.call("/survey_response/delete", { campaign_urn : urn, From b41a5d869dca25635dd0ed55a8b8ba88ff4bf832 Mon Sep 17 00:00:00 2001 From: Keith Rozett Date: Thu, 12 May 2016 17:40:01 -0700 Subject: [PATCH 3/6] Issue #5 - Add minified JS for oh.response.read_custom --- ohmage.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ohmage.min.js b/ohmage.min.js index d04d62c..0ee3d1f 100644 --- a/ohmage.min.js +++ b/ohmage.min.js @@ -1 +1 @@ -!function(e,n){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],n):"object"==typeof exports?module.exports=n(require("jquery","jquery.cookie")):e.returnExports=n(jQuery)}(this,function(e){Ohmage=function(n,r){function t(e,n,r){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;n>l?t=setTimeout(i,n-l):(t=null,r||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=r&&!t;return t||(t=setTimeout(i,n)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var n,r=!1;return function(){return r?n:(r=!0,n=e.apply(this,arguments),e=null,n)}}if(!n||!r)throw"app and client are required parameters.";n=n.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,n){return u.push({name:e,fun:n}),c},c.call=function(t,a,c){function o(n,r,t){t.status&&e.each(s,function(e,a){a(n,r,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=r,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:n+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(n,r,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!n||""==n){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,r,s)}var i=e.parseJSON(n);if("success"==i.result)u.resolve(c(i),r,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,r,s)}else{o(s,-2,a),u.reject(a,r,s)}}else u.resolve(n,r,a);return u.promise()},function(n,r,t){var a=e.Deferred();return n.status&&o("HTTP "+n.status+": "+n.responseText,-3,n),a.reject(n,r,t),a.promise()});return l.error=function(e){return s.push(function(n,r,t){return e(n,r,t),l}),l},e.each(u,function(e,n){l[n.name](n.fun)}),l},c.callform=function(n,t,a){var u=new FormData;return u.append("client",r),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,n){u.append(e,n)}),c.call(n,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,n){return c.user.auth_token({user:e,password:n})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,n){return c["class"].update({class_urn:e,user_role_list_add:n})},c["class"].removeuser=function(e,n){return c["class"].update({class_urn:e,user_list_remove:n})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,n){return c.campaign.update({campaign_urn:e,class_list_add:n})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response["delete"]=function(e,n){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:n})},c.response.update=function(e,n,r){return c.call("/survey_response/update",{campaign_urn:e,survey_key:n,privacy_state:r?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(n){e("html").click(function(){c.ping()})}),c.config.read().done(function(e){console.log("This is Ohmage/"+e.application_name+" "+e.application_version+" ("+e.application_build+")")}).error(function(e,n){console.log("Ohmage seems offline: "+e)}),c}}); \ No newline at end of file +!function(e,r){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],r):"object"==typeof exports?module.exports=r(require("jquery","jquery.cookie")):e.returnExports=r(jQuery)}(this,function(e){Ohmage=function(r,n){function t(e,r,n){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;r>l?t=setTimeout(i,r-l):(t=null,n||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=n&&!t;return t||(t=setTimeout(i,r)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var r,n=!1;return function(){return n?r:(n=!0,r=e.apply(this,arguments),e=null,r)}}if(!r||!n)throw"app and client are required parameters.";r=r.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,r){return u.push({name:e,fun:r}),c},c.call=function(t,a,c){function o(r,n,t){t.status&&e.each(s,function(e,a){a(r,n,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=n,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:r+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(r,n,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!r||""==r){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,n,s)}var i=e.parseJSON(r);if("success"==i.result)u.resolve(c(i),n,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,n,s)}else{o(s,-2,a),u.reject(a,n,s)}}else u.resolve(r,n,a);return u.promise()},function(r,n,t){var a=e.Deferred();return r.status&&o("HTTP "+r.status+": "+r.responseText,-3,r),a.reject(r,n,t),a.promise()});return l.error=function(e){return s.push(function(r,n,t){return e(r,n,t),l}),l},e.each(u,function(e,r){l[r.name](r.fun)}),l},c.callform=function(r,t,a){var u=new FormData;return u.append("client",n),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,r){u.append(e,r)}),c.call(r,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,r){return c.user.auth_token({user:e,password:r})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,r){return c["class"].update({class_urn:e,user_role_list_add:r})},c["class"].removeuser=function(e,r){return c["class"].update({class_urn:e,user_list_remove:r})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,r){return c.campaign.update({campaign_urn:e,class_list_add:r})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response.read_custom=function(e){return e=e||{},e.column_list=e.column_list||"urn:ohmage:special:all",e.output_format=e.output_format||"json-rows",e.survey_id_list=e.survey_id_list||"urn:ohmage:special:all",e.user_list=e.user_list||"urn:ohmage:special:all",c.call("/survey_response/read",e)},c.response["delete"]=function(e,r){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:r})},c.response.update=function(e,r,n){return c.call("/survey_response/update",{campaign_urn:e,survey_key:r,privacy_state:n?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(r){e("html").click(function(){c.ping()})}; \ No newline at end of file From 573aa12c6303f54289fe036485487660e3ccbb3f Mon Sep 17 00:00:00 2001 From: Keith Rozett Date: Tue, 17 May 2016 21:14:51 -0700 Subject: [PATCH 4/6] Issue #5 - Clean up a few unused variables so uglify stops complaining --- ohmage.js | 7 +++---- ohmage.min.js | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ohmage.js b/ohmage.js index 325c5c1..f8a363a 100644 --- a/ohmage.js +++ b/ohmage.js @@ -30,7 +30,6 @@ //globals var callbacks = []; - var login; //container with optional set functions var oh = {} @@ -113,7 +112,7 @@ error(response.errors[0].text, response.errors[0].code, req) filter.reject(req, textStatus, errorThrown); } else { - var msg = "JSON response did not contain result attribute." + var errorThrown = "JSON response did not contain result attribute." error(errorThrown, -2, req) filter.reject(req, textStatus, errorThrown); } @@ -494,7 +493,7 @@ }); //or: keep alive only when active - oh.keepactive = once(function(t){ + oh.keepactive = once(function(){ $('html').click(function() { oh.ping(); }); @@ -553,7 +552,7 @@ // test run call oh.config.read().done(function(x){ console.log("This is Ohmage/" + x.application_name + " " + x.application_version + " (" + x.application_build + ")") - }).error(function(msg, code){ + }).error(function(msg){ console.log("Ohmage seems offline: " + msg) }); diff --git a/ohmage.min.js b/ohmage.min.js index 0ee3d1f..4beda9b 100644 --- a/ohmage.min.js +++ b/ohmage.min.js @@ -1 +1 @@ -!function(e,r){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],r):"object"==typeof exports?module.exports=r(require("jquery","jquery.cookie")):e.returnExports=r(jQuery)}(this,function(e){Ohmage=function(r,n){function t(e,r,n){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;r>l?t=setTimeout(i,r-l):(t=null,n||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=n&&!t;return t||(t=setTimeout(i,r)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var r,n=!1;return function(){return n?r:(n=!0,r=e.apply(this,arguments),e=null,r)}}if(!r||!n)throw"app and client are required parameters.";r=r.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,r){return u.push({name:e,fun:r}),c},c.call=function(t,a,c){function o(r,n,t){t.status&&e.each(s,function(e,a){a(r,n,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=n,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:r+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(r,n,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!r||""==r){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,n,s)}var i=e.parseJSON(r);if("success"==i.result)u.resolve(c(i),n,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,n,s)}else{o(s,-2,a),u.reject(a,n,s)}}else u.resolve(r,n,a);return u.promise()},function(r,n,t){var a=e.Deferred();return r.status&&o("HTTP "+r.status+": "+r.responseText,-3,r),a.reject(r,n,t),a.promise()});return l.error=function(e){return s.push(function(r,n,t){return e(r,n,t),l}),l},e.each(u,function(e,r){l[r.name](r.fun)}),l},c.callform=function(r,t,a){var u=new FormData;return u.append("client",n),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,r){u.append(e,r)}),c.call(r,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,r){return c.user.auth_token({user:e,password:r})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,r){return c["class"].update({class_urn:e,user_role_list_add:r})},c["class"].removeuser=function(e,r){return c["class"].update({class_urn:e,user_list_remove:r})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,r){return c.campaign.update({campaign_urn:e,class_list_add:r})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response.read_custom=function(e){return e=e||{},e.column_list=e.column_list||"urn:ohmage:special:all",e.output_format=e.output_format||"json-rows",e.survey_id_list=e.survey_id_list||"urn:ohmage:special:all",e.user_list=e.user_list||"urn:ohmage:special:all",c.call("/survey_response/read",e)},c.response["delete"]=function(e,r){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:r})},c.response.update=function(e,r,n){return c.call("/survey_response/update",{campaign_urn:e,survey_key:r,privacy_state:n?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(r){e("html").click(function(){c.ping()})}; \ No newline at end of file +!function(e,r){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],r):"object"==typeof exports?module.exports=r(require("jquery","jquery.cookie")):e.returnExports=r(jQuery)}(this,function(e){Ohmage=function(r,n){function t(e,r,n){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;r>l?t=setTimeout(i,r-l):(t=null,n||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=n&&!t;return t||(t=setTimeout(i,r)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var r,n=!1;return function(){return n?r:(n=!0,r=e.apply(this,arguments),e=null,r)}}if(!r||!n)throw"app and client are required parameters.";r=r.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,r){return u.push({name:e,fun:r}),c},c.call=function(t,a,c){function o(r,n,t){t.status&&e.each(s,function(e,a){a(r,n,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=n,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:r+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(r,n,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!r||""==r){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,n,s)}var i=e.parseJSON(r);if("success"==i.result)u.resolve(c(i),n,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,n,s)}else{var s="JSON response did not contain result attribute.";o(s,-2,a),u.reject(a,n,s)}}else u.resolve(r,n,a);return u.promise()},function(r,n,t){var a=e.Deferred();return r.status&&o("HTTP "+r.status+": "+r.responseText,-3,r),a.reject(r,n,t),a.promise()});return l.error=function(e){return s.push(function(r,n,t){return e(r,n,t),l}),l},e.each(u,function(e,r){l[r.name](r.fun)}),l},c.callform=function(r,t,a){var u=new FormData;return u.append("client",n),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,r){u.append(e,r)}),c.call(r,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,r){return c.user.auth_token({user:e,password:r})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,r){return c["class"].update({class_urn:e,user_role_list_add:r})},c["class"].removeuser=function(e,r){return c["class"].update({class_urn:e,user_list_remove:r})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,r){return c.campaign.update({campaign_urn:e,class_list_add:r})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response.read_custom=function(e){return e=e||{},e.column_list=e.column_list||"urn:ohmage:special:all",e.output_format=e.output_format||"json-rows",e.survey_id_list=e.survey_id_list||"urn:ohmage:special:all",e.user_list=e.user_list||"urn:ohmage:special:all",c.call("/survey_response/read",e)},c.response["delete"]=function(e,r){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:r})},c.response.update=function(e,r,n){return c.call("/survey_response/update",{campaign_urn:e,survey_key:r,privacy_state:n?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(){e("html").click(function(){c.ping()})}),c.config.read().done(function(e){console.log("This is Ohmage/"+e.application_name+" "+e.application_version+" ("+e.application_build+")")}).error(function(e){console.log("Ohmage seems offline: "+e)}),c}}); \ No newline at end of file From 8ec871f618f221cdda7a7b3753cc8e71277ca58a Mon Sep 17 00:00:00 2001 From: Keith Rozett Date: Tue, 17 May 2016 21:33:56 -0700 Subject: [PATCH 5/6] Issue #5 - Clean up indentation --- ohmage.js | 1084 ++++++++++++++++++++++++++--------------------------- 1 file changed, 542 insertions(+), 542 deletions(-) diff --git a/ohmage.js b/ohmage.js index f8a363a..090b66f 100644 --- a/ohmage.js +++ b/ohmage.js @@ -4,8 +4,8 @@ * License: Apache 2 */ - // https://github.com/umdjs/umd/blob/master/returnExports.js - (function (root, factory) { +// https://github.com/umdjs/umd/blob/master/returnExports.js +(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD (Register as an anonymous module) define(['jquery', 'jquery.cookie'], factory); @@ -18,544 +18,544 @@ } }(this, function ($) { - Ohmage = function(app, client){ - - //validate parameters - if( ! app || ! client ) { - throw "app and client are required parameters."; - } else { - //remove trailing slash if any - app = app.replace(/\/+$/, ""); - } - - //globals - var callbacks = []; - - //container with optional set functions - var oh = {} - - oh.callback = function(name, fun){ - callbacks.push({name:name, fun:fun}) - return oh; - } - - //main ajax function - oh.call = function(path, data, datafun){ - - //support for multiple errorfuns and chaining - var errorfuns = []; - function error(x,y,z){ - //don't call on HTTP 0 (canceled) - if(z.status){ - $.each(errorfuns, function(i, val){ - val(x,y,z) - }); - } - } - - //default is to return res.result.data property - var datafun = datafun || function(x){ return x.data; } - - //input processing - var data = data || {}; - - //default parameter - data.client = client; - - //add auth_token from cookie - if($.cookie('auth_token')){ - data.auth_token = $.cookie('auth_token'); - } - - //ajax parameters - var ajaxparams = { - type: "POST", - url : app + path, - data: data, - dataType: "text", - xhrFields: { - withCredentials: true - } - } - - //ohmage multipart hack - if(data instanceof FormData){ - ajaxparams.contentType = false; - ajaxparams.cache = false; - ajaxparams.processData = false; - } - - //actual ajax - var req = $.ajax(ajaxparams).then(function(rsptxt, textStatus, req) { - //jQuery doneFilter - var filter = $.Deferred() - - //ohmage returns whatever it feels like. - if(req.getResponseHeader("content-type") == "application/json"){ - - //ohmage content-type cannot be trusted - if(!rsptxt || rsptxt == "") { - var errorThrown = "Fail: " + path + ". Ohmage returned undefined error." - error(errorThrown, -1, req) - filter.reject(req, textStatus, errorThrown); - } - - //let's assume JSON - var response = $.parseJSON(rsptxt); - - //HTTP 200 does not actually mean success - if(response.result == "success"){ - filter.resolve(datafun(response), textStatus, req); - } else if(response.result == "failure") { - //fail request with error code+msg - var errorThrown = response.errors[0].text; - error(response.errors[0].text, response.errors[0].code, req) - filter.reject(req, textStatus, errorThrown); - } else { - var errorThrown = "JSON response did not contain result attribute." - error(errorThrown, -2, req) - filter.reject(req, textStatus, errorThrown); - } - } else { - //case of HTTP 200 but not JSON. - filter.resolve(rsptxt, textStatus, req); - } - - //return to done() callback - return filter.promise(); - }, function(req, textStatus, errorThrown){ - //jQuery failFilter - var filter = $.Deferred(); - - //don't throw error when status == 0 (request canceled) - if(req.status){ - error("HTTP " + req.status + ": " + req.responseText, -3, req) - } - - filter.reject(req, textStatus, errorThrown); - - //return to fail() callback - return filter.promise(); - }) - - //add the custom 'error' cb - req.error = function(fun){ - //chainable wrapper - errorfuns.push(function(x,y,z){ - fun(x,y,z); - return req - }); - return req - } - - //trigger global callbacks - $.each(callbacks, function(i, val){ - req[val.name](val.fun); - }); - - return req - } - - //some APIs only support multipart so we need to hack around that - oh.callform = function(path, data, datafun){ - var formdata = new FormData(); - formdata.append("client", client) - formdata.append("auth_token", $.cookie('auth_token')); - $.each(data, function(key, value){ - formdata.append(key, value); - }); - return oh.call(path, formdata, datafun); - } - - //API sections - oh.config = {}; - oh.user = {}; - oh.class = {}; - oh.campaign = {}; - oh.document = {}; - oh.registration = {}; - oh.audit = {}; - oh.survey = {}; - oh.response = {}; - - //API wrappres - oh.config.read = function(){ - return oh.call("/config/read") - } - - oh.user.whoami = function(){ - return oh.call("/user/whoami", {}, function(x){return x.username}) - } - - //@args user - //@args password - oh.user.auth_token = function(data){ - return oh.call("/user/auth_token", data, function(x){return x.token}); - } - - //shorthand for above - oh.login = function(user, password){ - return oh.user.auth_token({ - user:user, - password : password - }); - } - - oh.user.logout = function(){ - return oh.call("/user/logout"); - } - - oh.user.info = function(){ - return oh.call("/user_info/read") - } - - //@args user_list - oh.user.read = function(data){ - return oh.call("/user/read", data) - } - - //@args class_urn_list - //@args first_name - //@args last_name - //@args organization - //@args personal_id - oh.user.setup = function(data){ - return oh.call("/user/setup", data) - } - - //@args user - //@args password - //@args username - //@args new_password - oh.user.change_password = function(data){ - return oh.call("/user/change_password", data) - } - - //@args username - //@args email_address - //@note more related to registration apis... - oh.user.reset_password = function(data){ - return oh.call("/user/reset_password", data) - } - - //@args registration_id - oh.user.activate = function(data){ - return oh.call("/user/activate", data) - } - - //@args user_list - //@note admin-only api - oh.user.delete = function(data){ - return oh.call("/user/delete", data); - } - - //@note api is undocumented. - //@note admin-only api - oh.user.search = function(data){ - return oh.call("/user/search", data) - } - - //@args username - //@args password - //@args admin - //@args enabled - //@args new_account - //@args campaign_creation_privilege - oh.user.create = function(data){ - return oh.call("/user/create", data) - } - - //@args see: https://github.com/ohmage/server/wiki/User-Manipulation#input-parameters-5 - //@note admin-only api - oh.user.update = function(data){ - return oh.call("/user/update", data) - } - - - //@args class_urn_list - oh.class.read = function(data){ - return oh.call("/class/read", data) - } - - //@args class_urn - //@args class_name - oh.class.create = function(data){ - return oh.call("/class/create", data) - } - - oh.class.delete = function(data){ - return oh.call("/class/delete", data) - } - - oh.class.update = function(data){ - return oh.call("/class/update", data) - } - - //shorthand - oh.class.adduser = function(class_urn, username){ - return oh.class.update({ - class_urn : class_urn, - user_role_list_add : username - }) - } - - //shorthand - oh.class.removeuser = function(class_urn, username){ - return oh.class.update({ - class_urn : class_urn, - user_list_remove : username - }) - } - - //@args class_urn - oh.class.search = function(data){ - return oh.call("/class/search", data) - } - - oh.campaign.read = function(data){ - //set a default - data = data || {}; - data.output_format = data.output_format || "short"; - return oh.call("/campaign/read", data, function(x){return x.metadata.items}); - } - - //@args xml - //@args privacy_state - //@args running_state - //@args campaign_urn - //@args campaign_name - //@args class_urn_list - oh.campaign.create = function(data){ - return oh.call("/campaign/create", data) - } - - oh.campaign.update = function(data){ - return oh.call("/campaign/update", data) - } - - //shorthand - oh.campaign.addclass = function(campaign_urn, class_urn){ - return oh.campaign.update({ - campaign_urn : campaign_urn, - class_list_add : class_urn - }) - } - - //@args campaign_urn - oh.campaign.delete = function(data){ - return oh.call("/campaign/delete", data) - } - - //@args campaign_urn - //@args description - //@args xml - //@args authored_by - //@args start_date - //@args end_date - //@args privacy_state - //@args running_state - //@note admin-only api - oh.campaign.search = function(data){ - return oh.call("/campaign/search", data) - } - - oh.campaign.readall = function(data){ - //set a default - data = data || {}; - data.output_format = data.output_format || "short"; - return oh.call("/campaign/read", data); - } - - //@args document_name - //@args privacy_state - //@args document_class_role_list - //@args document - oh.document.create = function(data){ - return oh.call("/document/create", data, function(x) {return x.document_id}) - } - - oh.document.read = function(data){ - return oh.call("/document/read", data) - } - - //shorthand for searching - oh.document.search = function(filter){ - return oh.document.read({ - document_name_search : filter - }) - } - - //@args document_id - oh.document.contents = function(data){ - return oh.call("/document/read/contents", data) - } - - //@args document_id - oh.document.delete = function(data){ - return oh.call("/document/delete", data) - } - - //@args document_id - //@args document_name - //@args privacy_state - //@args description - //@args campaign_role_list_add - //@args campaign_role_list_remove - //@args class_role_list_add - //@args class_role_list_remove - oh.document.update = function(data){ - return oh.call("/document/update", data) - } - - oh.registration.read = function(){ - return oh.call("/registration/read") - } - - //@args username - //@args password - //@args email_address - //if ohmage <= 2.16 - //@args recaptcha_challenge_field - //@args recaptcha_response_field - //if ohmage >= 2.17 - //@args recaptcha_version = "2.0" - //@args recaptcha_response_field - oh.user.register = function(data){ - return oh.call("/user/register", data) - } - - //@args request_type - //@args uri - //@args client_value - //@args device_id_value - //@args response_type - //@args error_code - //@args start_date - //@args end_date - //@note admin-only api - //@note passing no date params will result in all audits return. - // this is a phenomenally bad idea. - oh.audit.read = function(data){ - //ohmage returns audits in this call under the 'audits' object - return oh.call("/audit/read", data, function(x){ return x.audits; }) - } - - oh.survey.count = function(urn){ - data = { - campaign_urn : urn, - id : "privacy_state" - }; - return oh.call("/survey_response/function/read", data) - } - - oh.response.read = function(urn){ - return oh.call("/survey_response/read", { - campaign_urn : urn, - column_list : "urn:ohmage:special:all", - output_format : "json-rows", - survey_id_list : "urn:ohmage:special:all", - user_list : "urn:ohmage:special:all" - }) - } - - oh.response.read_custom = function(data){ - //set defaults - data = data || {}; - data.column_list = data.column_list || "urn:ohmage:special:all"; - data.output_format = data.output_format || "json-rows"; - data.survey_id_list = data.survey_id_list || "urn:ohmage:special:all"; - data.user_list = data.user_list || "urn:ohmage:special:all"; - return oh.call("/survey_response/read", data) - } - - oh.response.delete = function(urn, survey_key){ - return oh.call("/survey_response/delete", { - campaign_urn : urn, - survey_key : survey_key - }) - } - - oh.response.update = function(urn, survey_key, state){ - return oh.call("/survey_response/update", { - campaign_urn : urn, - survey_key : survey_key, - privacy_state : (state ? "shared" : "private") - }); - } - - //no more than 1 ping every 60 sec - oh.ping = debounce(oh.user.whoami, 60*1000, true); - - //ping once every t sec - oh.keepalive = once(function(t){ - t = t || 60; - setInterval(oh.ping, t*1000) - }); - - //or: keep alive only when active - oh.keepactive = once(function(){ - $('html').click(function() { - oh.ping(); - }); - }); - - // Copied from underscore.js - function debounce(func, wait, immediate) { - var timeout, args, context, timestamp, result; - - var now = function() { - return new Date().getTime(); - }; - - var later = function() { - var last = now() - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - if (!immediate) { - result = func.apply(context, args); - context = args = null; - } - } - }; - - return function() { - context = this; - args = arguments; - timestamp = now(); - var callNow = immediate && !timeout; - if (!timeout) { - timeout = setTimeout(later, wait); - } - if (callNow) { - result = func.apply(context, args); - context = args = null; - } - - return result; - }; - }; - - // Copied from underscore.js - function once(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; - }; - }; - - // test run call - oh.config.read().done(function(x){ - console.log("This is Ohmage/" + x.application_name + " " + x.application_version + " (" + x.application_build + ")") - }).error(function(msg){ - console.log("Ohmage seems offline: " + msg) - }); - - return(oh) - } + Ohmage = function(app, client){ + + //validate parameters + if( ! app || ! client ) { + throw "app and client are required parameters."; + } else { + //remove trailing slash if any + app = app.replace(/\/+$/, ""); + } + + //globals + var callbacks = []; + + //container with optional set functions + var oh = {} + + oh.callback = function(name, fun){ + callbacks.push({name:name, fun:fun}) + return oh; + } + + //main ajax function + oh.call = function(path, data, datafun){ + + //support for multiple errorfuns and chaining + var errorfuns = []; + function error(x,y,z){ + //don't call on HTTP 0 (canceled) + if(z.status){ + $.each(errorfuns, function(i, val){ + val(x,y,z) + }); + } + } + + //default is to return res.result.data property + var datafun = datafun || function(x){ return x.data; } + + //input processing + var data = data || {}; + + //default parameter + data.client = client; + + //add auth_token from cookie + if($.cookie('auth_token')){ + data.auth_token = $.cookie('auth_token'); + } + + //ajax parameters + var ajaxparams = { + type: "POST", + url : app + path, + data: data, + dataType: "text", + xhrFields: { + withCredentials: true + } + } + + //ohmage multipart hack + if(data instanceof FormData){ + ajaxparams.contentType = false; + ajaxparams.cache = false; + ajaxparams.processData = false; + } + + //actual ajax + var req = $.ajax(ajaxparams).then(function(rsptxt, textStatus, req) { + //jQuery doneFilter + var filter = $.Deferred() + + //ohmage returns whatever it feels like. + if(req.getResponseHeader("content-type") == "application/json"){ + + //ohmage content-type cannot be trusted + if(!rsptxt || rsptxt == "") { + var errorThrown = "Fail: " + path + ". Ohmage returned undefined error." + error(errorThrown, -1, req) + filter.reject(req, textStatus, errorThrown); + } + + //let's assume JSON + var response = $.parseJSON(rsptxt); + + //HTTP 200 does not actually mean success + if(response.result == "success"){ + filter.resolve(datafun(response), textStatus, req); + } else if(response.result == "failure") { + //fail request with error code+msg + var errorThrown = response.errors[0].text; + error(response.errors[0].text, response.errors[0].code, req) + filter.reject(req, textStatus, errorThrown); + } else { + var errorThrown = "JSON response did not contain result attribute." + error(errorThrown, -2, req) + filter.reject(req, textStatus, errorThrown); + } + } else { + //case of HTTP 200 but not JSON. + filter.resolve(rsptxt, textStatus, req); + } + + //return to done() callback + return filter.promise(); + }, function(req, textStatus, errorThrown){ + //jQuery failFilter + var filter = $.Deferred(); + + //don't throw error when status == 0 (request canceled) + if(req.status){ + error("HTTP " + req.status + ": " + req.responseText, -3, req) + } + + filter.reject(req, textStatus, errorThrown); + + //return to fail() callback + return filter.promise(); + }) + + //add the custom 'error' cb + req.error = function(fun){ + //chainable wrapper + errorfuns.push(function(x,y,z){ + fun(x,y,z); + return req + }); + return req + } + + //trigger global callbacks + $.each(callbacks, function(i, val){ + req[val.name](val.fun); + }); + + return req + } + + //some APIs only support multipart so we need to hack around that + oh.callform = function(path, data, datafun){ + var formdata = new FormData(); + formdata.append("client", client) + formdata.append("auth_token", $.cookie('auth_token')); + $.each(data, function(key, value){ + formdata.append(key, value); + }); + return oh.call(path, formdata, datafun); + } + + //API sections + oh.config = {}; + oh.user = {}; + oh.class = {}; + oh.campaign = {}; + oh.document = {}; + oh.registration = {}; + oh.audit = {}; + oh.survey = {}; + oh.response = {}; + + //API wrappres + oh.config.read = function(){ + return oh.call("/config/read") + } + + oh.user.whoami = function(){ + return oh.call("/user/whoami", {}, function(x){return x.username}) + } + + //@args user + //@args password + oh.user.auth_token = function(data){ + return oh.call("/user/auth_token", data, function(x){return x.token}); + } + + //shorthand for above + oh.login = function(user, password){ + return oh.user.auth_token({ + user:user, + password : password + }); + } + + oh.user.logout = function(){ + return oh.call("/user/logout"); + } + + oh.user.info = function(){ + return oh.call("/user_info/read") + } + + //@args user_list + oh.user.read = function(data){ + return oh.call("/user/read", data) + } + + //@args class_urn_list + //@args first_name + //@args last_name + //@args organization + //@args personal_id + oh.user.setup = function(data){ + return oh.call("/user/setup", data) + } + + //@args user + //@args password + //@args username + //@args new_password + oh.user.change_password = function(data){ + return oh.call("/user/change_password", data) + } + + //@args username + //@args email_address + //@note more related to registration apis... + oh.user.reset_password = function(data){ + return oh.call("/user/reset_password", data) + } + + //@args registration_id + oh.user.activate = function(data){ + return oh.call("/user/activate", data) + } + + //@args user_list + //@note admin-only api + oh.user.delete = function(data){ + return oh.call("/user/delete", data); + } + + //@note api is undocumented. + //@note admin-only api + oh.user.search = function(data){ + return oh.call("/user/search", data) + } + + //@args username + //@args password + //@args admin + //@args enabled + //@args new_account + //@args campaign_creation_privilege + oh.user.create = function(data){ + return oh.call("/user/create", data) + } + + //@args see: https://github.com/ohmage/server/wiki/User-Manipulation#input-parameters-5 + //@note admin-only api + oh.user.update = function(data){ + return oh.call("/user/update", data) + } + + + //@args class_urn_list + oh.class.read = function(data){ + return oh.call("/class/read", data) + } + + //@args class_urn + //@args class_name + oh.class.create = function(data){ + return oh.call("/class/create", data) + } + + oh.class.delete = function(data){ + return oh.call("/class/delete", data) + } + + oh.class.update = function(data){ + return oh.call("/class/update", data) + } + + //shorthand + oh.class.adduser = function(class_urn, username){ + return oh.class.update({ + class_urn : class_urn, + user_role_list_add : username + }) + } + + //shorthand + oh.class.removeuser = function(class_urn, username){ + return oh.class.update({ + class_urn : class_urn, + user_list_remove : username + }) + } + + //@args class_urn + oh.class.search = function(data){ + return oh.call("/class/search", data) + } + + oh.campaign.read = function(data){ + //set a default + data = data || {}; + data.output_format = data.output_format || "short"; + return oh.call("/campaign/read", data, function(x){return x.metadata.items}); + } + + //@args xml + //@args privacy_state + //@args running_state + //@args campaign_urn + //@args campaign_name + //@args class_urn_list + oh.campaign.create = function(data){ + return oh.call("/campaign/create", data) + } + + oh.campaign.update = function(data){ + return oh.call("/campaign/update", data) + } + + //shorthand + oh.campaign.addclass = function(campaign_urn, class_urn){ + return oh.campaign.update({ + campaign_urn : campaign_urn, + class_list_add : class_urn + }) + } + + //@args campaign_urn + oh.campaign.delete = function(data){ + return oh.call("/campaign/delete", data) + } + + //@args campaign_urn + //@args description + //@args xml + //@args authored_by + //@args start_date + //@args end_date + //@args privacy_state + //@args running_state + //@note admin-only api + oh.campaign.search = function(data){ + return oh.call("/campaign/search", data) + } + + oh.campaign.readall = function(data){ + //set a default + data = data || {}; + data.output_format = data.output_format || "short"; + return oh.call("/campaign/read", data); + } + + //@args document_name + //@args privacy_state + //@args document_class_role_list + //@args document + oh.document.create = function(data){ + return oh.call("/document/create", data, function(x) {return x.document_id}) + } + + oh.document.read = function(data){ + return oh.call("/document/read", data) + } + + //shorthand for searching + oh.document.search = function(filter){ + return oh.document.read({ + document_name_search : filter + }) + } + + //@args document_id + oh.document.contents = function(data){ + return oh.call("/document/read/contents", data) + } + + //@args document_id + oh.document.delete = function(data){ + return oh.call("/document/delete", data) + } + + //@args document_id + //@args document_name + //@args privacy_state + //@args description + //@args campaign_role_list_add + //@args campaign_role_list_remove + //@args class_role_list_add + //@args class_role_list_remove + oh.document.update = function(data){ + return oh.call("/document/update", data) + } + + oh.registration.read = function(){ + return oh.call("/registration/read") + } + + //@args username + //@args password + //@args email_address + //if ohmage <= 2.16 + //@args recaptcha_challenge_field + //@args recaptcha_response_field + //if ohmage >= 2.17 + //@args recaptcha_version = "2.0" + //@args recaptcha_response_field + oh.user.register = function(data){ + return oh.call("/user/register", data) + } + + //@args request_type + //@args uri + //@args client_value + //@args device_id_value + //@args response_type + //@args error_code + //@args start_date + //@args end_date + //@note admin-only api + //@note passing no date params will result in all audits return. + // this is a phenomenally bad idea. + oh.audit.read = function(data){ + //ohmage returns audits in this call under the 'audits' object + return oh.call("/audit/read", data, function(x){ return x.audits; }) + } + + oh.survey.count = function(urn){ + data = { + campaign_urn : urn, + id : "privacy_state" + }; + return oh.call("/survey_response/function/read", data) + } + + oh.response.read = function(urn){ + return oh.call("/survey_response/read", { + campaign_urn : urn, + column_list : "urn:ohmage:special:all", + output_format : "json-rows", + survey_id_list : "urn:ohmage:special:all", + user_list : "urn:ohmage:special:all" + }) + } + + oh.response.read_custom = function(data){ + //set defaults + data = data || {}; + data.column_list = data.column_list || "urn:ohmage:special:all"; + data.output_format = data.output_format || "json-rows"; + data.survey_id_list = data.survey_id_list || "urn:ohmage:special:all"; + data.user_list = data.user_list || "urn:ohmage:special:all"; + return oh.call("/survey_response/read", data) + } + + oh.response.delete = function(urn, survey_key){ + return oh.call("/survey_response/delete", { + campaign_urn : urn, + survey_key : survey_key + }) + } + + oh.response.update = function(urn, survey_key, state){ + return oh.call("/survey_response/update", { + campaign_urn : urn, + survey_key : survey_key, + privacy_state : (state ? "shared" : "private") + }); + } + + //no more than 1 ping every 60 sec + oh.ping = debounce(oh.user.whoami, 60*1000, true); + + //ping once every t sec + oh.keepalive = once(function(t){ + t = t || 60; + setInterval(oh.ping, t*1000) + }); + + //or: keep alive only when active + oh.keepactive = once(function(){ + $('html').click(function() { + oh.ping(); + }); + }); + + // Copied from underscore.js + function debounce(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var now = function() { + return new Date().getTime(); + }; + + var later = function() { + var last = now() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = now(); + var callNow = immediate && !timeout; + if (!timeout) { + timeout = setTimeout(later, wait); + } + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Copied from underscore.js + function once(func) { + var ran = false, memo; + return function() { + if (ran) return memo; + ran = true; + memo = func.apply(this, arguments); + func = null; + return memo; + }; + }; + + // test run call + oh.config.read().done(function(x){ + console.log("This is Ohmage/" + x.application_name + " " + x.application_version + " (" + x.application_build + ")") + }).error(function(msg){ + console.log("Ohmage seems offline: " + msg) + }); + + return(oh) + } })); From d0819e3ade083472cbcb081a86d899acf0384a5e Mon Sep 17 00:00:00 2001 From: Keith Rozett Date: Tue, 17 May 2016 21:46:58 -0700 Subject: [PATCH 6/6] Issue #6 - Replace debounce with throttle, reduce max ping by 1 sec to eliminate race condition --- ohmage.js | 58 +++++++++++++++++++++++++++------------------------ ohmage.min.js | 2 +- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/ohmage.js b/ohmage.js index 090b66f..af8789f 100644 --- a/ohmage.js +++ b/ohmage.js @@ -483,8 +483,8 @@ }); } - //no more than 1 ping every 60 sec - oh.ping = debounce(oh.user.whoami, 60*1000, true); + //no more than 1 ping every 59 sec + oh.ping = throttle(oh.user.whoami, 59*1000); //ping once every t sec oh.keepalive = once(function(t){ @@ -500,41 +500,45 @@ }); // Copied from underscore.js - function debounce(func, wait, immediate) { - var timeout, args, context, timestamp, result; - - var now = function() { - return new Date().getTime(); - }; + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; var later = function() { - var last = now() - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - if (!immediate) { - result = func.apply(context, args); - context = args = null; - } - } + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; }; - return function() { + var throttled = function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); context = this; args = arguments; - timestamp = now(); - var callNow = immediate && !timeout; - if (!timeout) { - timeout = setTimeout(later, wait); - } - if (callNow) { + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; result = func.apply(context, args); - context = args = null; + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); } - return result; }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; }; // Copied from underscore.js diff --git a/ohmage.min.js b/ohmage.min.js index 4beda9b..858b610 100644 --- a/ohmage.min.js +++ b/ohmage.min.js @@ -1 +1 @@ -!function(e,r){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],r):"object"==typeof exports?module.exports=r(require("jquery","jquery.cookie")):e.returnExports=r(jQuery)}(this,function(e){Ohmage=function(r,n){function t(e,r,n){var t,a,u,c,o,s=function(){return(new Date).getTime()},i=function(){var l=s()-c;r>l?t=setTimeout(i,r-l):(t=null,n||(o=e.apply(u,a),u=a=null))};return function(){u=this,a=arguments,c=s();var l=n&&!t;return t||(t=setTimeout(i,r)),l&&(o=e.apply(u,a),u=a=null),o}}function a(e){var r,n=!1;return function(){return n?r:(n=!0,r=e.apply(this,arguments),e=null,r)}}if(!r||!n)throw"app and client are required parameters.";r=r.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,r){return u.push({name:e,fun:r}),c},c.call=function(t,a,c){function o(r,n,t){t.status&&e.each(s,function(e,a){a(r,n,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=n,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:r+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(r,n,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!r||""==r){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,n,s)}var i=e.parseJSON(r);if("success"==i.result)u.resolve(c(i),n,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,n,s)}else{var s="JSON response did not contain result attribute.";o(s,-2,a),u.reject(a,n,s)}}else u.resolve(r,n,a);return u.promise()},function(r,n,t){var a=e.Deferred();return r.status&&o("HTTP "+r.status+": "+r.responseText,-3,r),a.reject(r,n,t),a.promise()});return l.error=function(e){return s.push(function(r,n,t){return e(r,n,t),l}),l},e.each(u,function(e,r){l[r.name](r.fun)}),l},c.callform=function(r,t,a){var u=new FormData;return u.append("client",n),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,r){u.append(e,r)}),c.call(r,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,r){return c.user.auth_token({user:e,password:r})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,r){return c["class"].update({class_urn:e,user_role_list_add:r})},c["class"].removeuser=function(e,r){return c["class"].update({class_urn:e,user_list_remove:r})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,r){return c.campaign.update({campaign_urn:e,class_list_add:r})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response.read_custom=function(e){return e=e||{},e.column_list=e.column_list||"urn:ohmage:special:all",e.output_format=e.output_format||"json-rows",e.survey_id_list=e.survey_id_list||"urn:ohmage:special:all",e.user_list=e.user_list||"urn:ohmage:special:all",c.call("/survey_response/read",e)},c.response["delete"]=function(e,r){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:r})},c.response.update=function(e,r,n){return c.call("/survey_response/update",{campaign_urn:e,survey_key:r,privacy_state:n?"shared":"private"})},c.ping=t(c.user.whoami,6e4,!0),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(){e("html").click(function(){c.ping()})}),c.config.read().done(function(e){console.log("This is Ohmage/"+e.application_name+" "+e.application_version+" ("+e.application_build+")")}).error(function(e){console.log("Ohmage seems offline: "+e)}),c}}); \ No newline at end of file +!function(e,n){"function"==typeof define&&define.amd?define(["jquery","jquery.cookie"],n):"object"==typeof exports?module.exports=n(require("jquery","jquery.cookie")):e.returnExports=n(jQuery)}(this,function(e){Ohmage=function(n,r){function t(e,n,r){var t,a,u,c,o=0;r||(r={});var s=function(){o=r.leading===!1?0:_.now(),t=null,c=e.apply(a,u),t||(a=u=null)},i=function(){var i=_.now();o||r.leading!==!1||(o=i);var l=n-(i-o);return a=this,u=arguments,0>=l||l>n?(t&&(clearTimeout(t),t=null),o=i,c=e.apply(a,u),t||(a=u=null)):t||r.trailing===!1||(t=setTimeout(s,l)),c};return i.cancel=function(){clearTimeout(t),o=0,t=a=u=null},i}function a(e){var n,r=!1;return function(){return r?n:(r=!0,n=e.apply(this,arguments),e=null,n)}}if(!n||!r)throw"app and client are required parameters.";n=n.replace(/\/+$/,"");var u=[],c={};return c.callback=function(e,n){return u.push({name:e,fun:n}),c},c.call=function(t,a,c){function o(n,r,t){t.status&&e.each(s,function(e,a){a(n,r,t)})}var s=[],c=c||function(e){return e.data},a=a||{};a.client=r,e.cookie("auth_token")&&(a.auth_token=e.cookie("auth_token"));var i={type:"POST",url:n+t,data:a,dataType:"text",xhrFields:{withCredentials:!0}};a instanceof FormData&&(i.contentType=!1,i.cache=!1,i.processData=!1);var l=e.ajax(i).then(function(n,r,a){var u=e.Deferred();if("application/json"==a.getResponseHeader("content-type")){if(!n||""==n){var s="Fail: "+t+". Ohmage returned undefined error.";o(s,-1,a),u.reject(a,r,s)}var i=e.parseJSON(n);if("success"==i.result)u.resolve(c(i),r,a);else if("failure"==i.result){var s=i.errors[0].text;o(i.errors[0].text,i.errors[0].code,a),u.reject(a,r,s)}else{var s="JSON response did not contain result attribute.";o(s,-2,a),u.reject(a,r,s)}}else u.resolve(n,r,a);return u.promise()},function(n,r,t){var a=e.Deferred();return n.status&&o("HTTP "+n.status+": "+n.responseText,-3,n),a.reject(n,r,t),a.promise()});return l.error=function(e){return s.push(function(n,r,t){return e(n,r,t),l}),l},e.each(u,function(e,n){l[n.name](n.fun)}),l},c.callform=function(n,t,a){var u=new FormData;return u.append("client",r),u.append("auth_token",e.cookie("auth_token")),e.each(t,function(e,n){u.append(e,n)}),c.call(n,u,a)},c.config={},c.user={},c["class"]={},c.campaign={},c.document={},c.registration={},c.audit={},c.survey={},c.response={},c.config.read=function(){return c.call("/config/read")},c.user.whoami=function(){return c.call("/user/whoami",{},function(e){return e.username})},c.user.auth_token=function(e){return c.call("/user/auth_token",e,function(e){return e.token})},c.login=function(e,n){return c.user.auth_token({user:e,password:n})},c.user.logout=function(){return c.call("/user/logout")},c.user.info=function(){return c.call("/user_info/read")},c.user.read=function(e){return c.call("/user/read",e)},c.user.setup=function(e){return c.call("/user/setup",e)},c.user.change_password=function(e){return c.call("/user/change_password",e)},c.user.reset_password=function(e){return c.call("/user/reset_password",e)},c.user.activate=function(e){return c.call("/user/activate",e)},c.user["delete"]=function(e){return c.call("/user/delete",e)},c.user.search=function(e){return c.call("/user/search",e)},c.user.create=function(e){return c.call("/user/create",e)},c.user.update=function(e){return c.call("/user/update",e)},c["class"].read=function(e){return c.call("/class/read",e)},c["class"].create=function(e){return c.call("/class/create",e)},c["class"]["delete"]=function(e){return c.call("/class/delete",e)},c["class"].update=function(e){return c.call("/class/update",e)},c["class"].adduser=function(e,n){return c["class"].update({class_urn:e,user_role_list_add:n})},c["class"].removeuser=function(e,n){return c["class"].update({class_urn:e,user_list_remove:n})},c["class"].search=function(e){return c.call("/class/search",e)},c.campaign.read=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e,function(e){return e.metadata.items})},c.campaign.create=function(e){return c.call("/campaign/create",e)},c.campaign.update=function(e){return c.call("/campaign/update",e)},c.campaign.addclass=function(e,n){return c.campaign.update({campaign_urn:e,class_list_add:n})},c.campaign["delete"]=function(e){return c.call("/campaign/delete",e)},c.campaign.search=function(e){return c.call("/campaign/search",e)},c.campaign.readall=function(e){return e=e||{},e.output_format=e.output_format||"short",c.call("/campaign/read",e)},c.document.create=function(e){return c.call("/document/create",e,function(e){return e.document_id})},c.document.read=function(e){return c.call("/document/read",e)},c.document.search=function(e){return c.document.read({document_name_search:e})},c.document.contents=function(e){return c.call("/document/read/contents",e)},c.document["delete"]=function(e){return c.call("/document/delete",e)},c.document.update=function(e){return c.call("/document/update",e)},c.registration.read=function(){return c.call("/registration/read")},c.user.register=function(e){return c.call("/user/register",e)},c.audit.read=function(e){return c.call("/audit/read",e,function(e){return e.audits})},c.survey.count=function(e){return data={campaign_urn:e,id:"privacy_state"},c.call("/survey_response/function/read",data)},c.response.read=function(e){return c.call("/survey_response/read",{campaign_urn:e,column_list:"urn:ohmage:special:all",output_format:"json-rows",survey_id_list:"urn:ohmage:special:all",user_list:"urn:ohmage:special:all"})},c.response.read_custom=function(e){return e=e||{},e.column_list=e.column_list||"urn:ohmage:special:all",e.output_format=e.output_format||"json-rows",e.survey_id_list=e.survey_id_list||"urn:ohmage:special:all",e.user_list=e.user_list||"urn:ohmage:special:all",c.call("/survey_response/read",e)},c.response["delete"]=function(e,n){return c.call("/survey_response/delete",{campaign_urn:e,survey_key:n})},c.response.update=function(e,n,r){return c.call("/survey_response/update",{campaign_urn:e,survey_key:n,privacy_state:r?"shared":"private"})},c.ping=t(c.user.whoami,59e3),c.keepalive=a(function(e){e=e||60,setInterval(c.ping,1e3*e)}),c.keepactive=a(function(){e("html").click(function(){c.ping()})}),c.config.read().done(function(e){console.log("This is Ohmage/"+e.application_name+" "+e.application_version+" ("+e.application_build+")")}).error(function(e){console.log("Ohmage seems offline: "+e)}),c}}); \ No newline at end of file