Update webapp for /status changes
[blerg.git] / www / jssrc / blerg / API.js
index 2fb9561..ecf7cd3 100644 (file)
 var baseURL = '';
 
+// The API state is static so that any instance can use login-dependent API
+// calls
 enyo.kind({
-       name: "blerg.API",
-       loggedIn: false,
-       username: "",
-       create: function() {
-               this.inherited(arguments);
-               if (enyo.getCookie('auth') && enyo.getCookie('username')) {
-                       this.loggedIn = true;
-                       this.username = enyo.getCookie('username');
-                       // Defer the signal until everything's initialized
-                       setTimeout(function() {
-                               this.bubble('onLoginSuccessful', {username: this.username});
-                       }.bind(this), 0);
-               }
-       },
-       login: function(username, password) {
-               var req = new enyo.Ajax({
-                       url: baseURL + '/login',
-                       method: 'POST'
-               });
-               req.response(function(inSender, inResponse) {
-                       if (inResponse.status == 'success') {
-                               this.loggedIn = true;
-                               this.username = username;
-                               enyo.setCookie('username', username);
-                               this.bubble('onLoginSuccessful', {username: username});
-                       } else {
-                               enyo.setCookie('username', '', {"Max-Age": 0});
-                               this.bubble('onLoginFailed');
-                       }
-               }.bind(this));
-               req.go({
-                       username: username,
-                       password: password
-               });
-       },
-       logout: function() {
-               var req = new enyo.Ajax({
-                       url: baseURL + '/logout',
-                       method: 'POST'
-               });
-               req.response(function(inSender, inResponse) {
-                       this.loggedIn = false;
-                       enyo.setCookie('auth', '', {"Max-Age": 0});
-                       this.bubble('onLogoutSuccessful');
-               }.bind(this));
-               req.go({
-                       username: this.username
-               });
-               enyo.setCookie('username', '', {"Max-Age": 0});
-       },
-       requestFeedStatus: function() {
-               if (!this.loggedIn)
-                       throw new Error('Cannot request feed status when not logged in');
-               // TODO
-       }
+    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') && enyo.getCookie('username')) {
+            blerg.API.loggedIn = true;
+            blerg.API.username = enyo.getCookie('username');
+            // 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;
+                enyo.setCookie('username', username);
+                this.bubble('onLoginSuccessful', {username: username});
+            } else {
+                enyo.setCookie('username', '', {"Max-Age": 0});
+                this.bubble('onLoginFailed');
+            }
+        });
+        req.error(this, function() {
+            enyo.setCookie('username', '', {"Max-Age": 0});
+            this.bubble('onLoginFailed');
+        });
+        req.go();
+    },
+    logout: function() {
+        var req = new enyo.Ajax({
+            url: baseURL + '/logout',
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            blerg.API.loggedIn = false;
+            enyo.setCookie('auth', '', {"Max-Age": 0});
+            this.bubble('onLogoutSuccessful');
+        });
+        req.go();
+        enyo.setCookie('username', '', {"Max-Age": 0});
+    },
+    changePassword: function(oldpassword, newpassword) {
+        var req = new enyo.Ajax({
+            url: baseURL + '/passwd',
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username,
+                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',
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            this.bubble('onStatus', inResponse);
+        });
+        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: {
+                username: blerg.API.username,
+                clear: type
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            inResponse.type = type;
+            this.bubble('onClearStatus', inResponse);
+        });
+        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',
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            this.bubble('onItemsLoaded', {
+                type: "feed",
+                entries: inResponse
+            });
+        });
+        req.go();
+    },
+    getSubscriptionStatus: function(username) {
+        var req = new enyo.Ajax({
+            url: baseURL + '/status/' + username,
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            this.bubble('onSubscriptionStatus', {
+                username: username,
+                subscribed: inResponse.subscribed
+            });
+        });
+        req.go();
+    },
+    subscribe: function(username) {
+        var req = new enyo.Ajax({
+            url: baseURL + '/subscribe/' + username,
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            this.bubble('onSubscriptionStatus', {
+                username: username,
+                subscribed: inResponse.status == "success"
+            });
+        });
+        req.go();
+    },
+    unsubscribe: function(username) {
+        var req = new enyo.Ajax({
+            url: baseURL + '/unsubscribe/' + username,
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username
+            }
+        });
+        req.response(this, function(inSender, inResponse) {
+            this.bubble('onSubscriptionStatus', {
+                username: username,
+                subscribed: inResponse.status != "success"
+            });
+        });
+        req.go();
+    },
+    post: function(data) {
+        var req = new enyo.Ajax({
+            url: baseURL + '/put',
+            method: 'POST',
+            postBody: {
+                username: blerg.API.username,
+                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.go();
+    }
 });