X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjssrc%2Fblerg%2FAPI.js;h=64b1108b0de9b2910b2d0139bae6e925dec010d0;hb=HEAD;hp=04e7ff9e669a2cacec63ded2d260450a8d50a120;hpb=21db04ef3e4f66d7b5c4c9be2be36703b18cbcaa;p=blerg.git diff --git a/www/jssrc/blerg/API.js b/www/jssrc/blerg/API.js index 04e7ff9..64b1108 100644 --- a/www/jssrc/blerg/API.js +++ b/www/jssrc/blerg/API.js @@ -1,6 +1,322 @@ +var baseURL = ''; + +// The API state is static so that any instance can use login-dependent API +// calls enyo.kind({ - name: "blerg.API", - create: function() { - this.inherited(arguments); - } + name: "blerg.API", + kind: "Component", + statics: { + apiInitialized: false, + loggedIn: false, + username: "", + }, + create: function() { + this.inherited(arguments); + if (blerg.API.apiInitialized) { + if (blerg.API.loggedIn) { + setTimeout(function() { + this.bubble('onLoginSuccessful', {username: blerg.API.username}); + }.bind(this), 0); + } + return; + } + + if (enyo.getCookie('auth')) { + blerg.API.loggedIn = true; + blerg.API.username = enyo.getCookie('auth').split('/')[0]; + // Defer the signal until everything's initialized + setTimeout(function() { + this.bubble('onLoginSuccessful', {username: blerg.API.username}); + }.bind(this), 0); + } + + blerg.API.apiInitialized = true; + }, + signup: function(username, password) { + var req = new enyo.Ajax({ + url: baseURL + '/create', + method: 'POST', + postBody: { + username: username, + password: password, + } + }); + req.response(this, function(inSender, inResponse) { + if (inResponse.status == 'success') { + this.bubble('onSignupSuccess', {username: username}); + } else { + this.bubble('onSignupFailure', {username: username}); + } + }); + req.error(this, function() { + this.bubble('onSignupFailure', {username: username}); + }); + req.go(); + }, + login: function(username, password) { + var req = new enyo.Ajax({ + url: baseURL + '/login', + method: 'POST', + postBody: { + username: username, + password: password + } + }); + req.response(this, function(inSender, inResponse) { + if (inResponse.status == 'success') { + blerg.API.loggedIn = true; + blerg.API.username = username; + this.bubble('onLoginSuccessful', {username: username}); + } else { + this.bubble('onLoginFailed'); + } + }); + req.error(this, function() { + this.bubble('onLoginFailed'); + }); + req.go(); + }, + expireClientAuthentication: function() { + blerg.API.loggedIn = false; + blerg.API.username = ''; + enyo.setCookie('auth', '', {"Max-Age": 0}); + }, + logout: function() { + var req = new enyo.Ajax({ + url: baseURL + '/logout', + method: 'POST' + }); + var logout_func = function() { + this.expireClientAuthentication(); + this.bubble('onLogoutSuccessful'); + }.bind(this); + req.response(this, logout_func); + req.error(this, logout_func); + req.go(); + }, + authenticationFailed: function() { + enyo.log("Authentication failed -- logging out"); + this.expireClientAuthentication(); + this.bubble('onAuthFailure'); + }, + changePassword: function(oldpassword, newpassword) { + var req = new enyo.Ajax({ + url: baseURL + '/passwd', + method: 'POST', + postBody: { + password: oldpassword, + new_password: newpassword + } + }); + req.response(this, function(inSender, inResponse) { + if (inResponse.status == 'success') { + this.bubble('onPasswordChangeSuccessful'); + } else { + this.bubble('onPasswordChangeFailed'); + } + }); + req.error(this, function() { + this.bubble('onPasswordChangeFailed'); + }); + req.go(); + }, + loadUserRecords: function(username, from ,to) { + var url; + if (from != undefined && to != undefined) { + url = baseURL + '/get/' + username + '/' + from + '-' + to; + } else { + url = baseURL + '/get/' + username; + } + + var req = new enyo.Ajax({ + url: url + }); + req.response(this, function(inSender, inResponse) { + this.bubble('onItemsLoaded', { + type: 'user', + username: username, + from: from, + to: to, + entries: inResponse + }); + }); + req.error(this, function(inSender, inResponse) { + if (inResponse == 404) + this.bubble('onUserNotFound'); + else + this.bubble('onAPIError', {response: inResponse}); + }); + req.go(); + }, + loadTagRecords: function(type, tag) { + var url; + switch(type) { + case 'tag': + // Apache eats the hash, even encoded. Probably a security + // feature. + url = baseURL + '/tag/H' + tag; + break; + case 'ref': + url = baseURL + '/tag/%40' + tag; + break; + default: + throw new Error("Invalid tag type: " + type); + return; + } + var req = new enyo.Ajax({ + url: url + }); + req.response(this, function(inSender, inResponse) { + this.bubble('onItemsLoaded', { + type: 'tag', + tagType: type, + tag: tag, + entries: inResponse + }); + }); + req.error(this, function() { + this.bubble('onItemsLoaded', { + type: 'tag', + tagType: type, + tag: tag, + entries: [] + }); + }); + req.go(); + }, + getStatus: function() { + if (!blerg.API.loggedIn) + throw new Error('Cannot request feed status when not logged in'); + + var req = new enyo.Ajax({ + url: baseURL + '/status' + }); + req.response(this, function(inSender, inResponse) { + this.bubble('onStatus', inResponse); + }); + req.error(this, function() { + if (req.xhrResponse.status == 403) { + this.authenticationFailed(); + } + }); + req.go(); + }, + clearStatus: function(type) { + if (!blerg.API.loggedIn) + throw new Error('Cannot request feed status when not logged in'); + + if (!(type == 'feed' || type == 'mentioned')) + throw new Error('Invalid status clear type: ' + type); + + var req = new enyo.Ajax({ + url: baseURL + '/status', + method: 'POST', + postBody: { + clear: type + } + }); + req.response(this, function(inSender, inResponse) { + inResponse.type = type; + this.bubble('onClearStatus', inResponse); + }); + req.error(this, function() { + if (req.xhrResponse.status == 403) { + this.authenticationFailed(); + } + }); + req.go(); + }, + loadFeed: function() { + if (!blerg.API.loggedIn) + throw new Error('Cannot request feed status when not logged in'); + + var req = new enyo.Ajax({ + url: baseURL + '/feed' + }); + req.response(this, function(inSender, inResponse) { + this.bubble('onItemsLoaded', { + type: "feed", + entries: inResponse + }); + }); + req.error(this, function() { + if (req.xhrResponse.status == 403) { + this.authenticationFailed(); + } + }); + req.go(); + }, + getSubscriptionStatus: function(username) { + var req = new enyo.Ajax({ + url: baseURL + '/status/' + username + }); + req.response(this, function(inSender, inResponse) { + this.bubble('onSubscriptionStatus', { + username: username, + subscribed: inResponse.subscribed + }); + }); + req.error(this, function() { + if (req.xhrResponse.status == 403) { + this.authenticationFailed(); + } + }); + req.go(); + }, + subscription: function(username, v) { + var subv = v ? true : false; + var req = new enyo.Ajax({ + url: baseURL + '/subscribe/' + username, + method: 'POST', + postBody: { + subscribed: subv + } + }); + req.response(this, function(inSender, inResponse) { + this.bubble('onSubscriptionStatus', { + username: username, + subscribed: inResponse.status == "success" && subv + }); + }); + req.error(this, function() { + if (req.xhrResponse.status == 403) { + this.authenticationFailed(); + } + }); + req.go(); + }, + subscribe: function(username) { + this.subscription(username, true); + }, + unsubscribe: function(username) { + this.subscription(username, false); + }, + post: function(data) { + var req = new enyo.Ajax({ + url: baseURL + '/put', + method: 'POST', + postBody: { + data: data + } + }); + req.response(this, function(inSender, inResponse) { + if (inResponse && inResponse.status == 'success') { + this.bubble('onPostSuccessful', { + username: blerg.API.username, + data: data + }); + } else { + this.bubble('onPostFailed', { + username: blerg.API.username, + data: data + }); + } + }); + req.error(this, function() { + if (req.xhrResponse.status == 403) { + this.authenticationFailed(); + } + }); + req.go(); + } });