Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / plugins / launchpad / src / ssh_keys / sshKeyStore.js
diff --git a/skyquake/plugins/launchpad/src/ssh_keys/sshKeyStore.js b/skyquake/plugins/launchpad/src/ssh_keys/sshKeyStore.js
new file mode 100644 (file)
index 0000000..400c096
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * 
+ *   Copyright 2016 RIFT.IO Inc
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+import SshKeyActions from './sshKeyActions.js';
+import SshKeySource from './sshKeySource.js';
+import GUID from 'utils/guid.js';
+import AppHeaderActions from 'widgets/header/headerActions.js';
+import Alt from '../alt';
+import _ from 'lodash';
+
+
+export default class SshKeyStore {
+    constructor() {
+        this.data = {
+            keys: [],
+            entities: {}
+        };
+        this.dataCache = _.cloneDeep(this.data);
+        this.newKey = {
+          name: '',
+          key: ''
+        };
+        this.bindActions(SshKeyActions);
+        this.registerAsync(SshKeySource);
+        this.exportPublicMethods({
+            updateNewKeyValue: this.updateNewKeyValue,
+            updateSshKeyPair: this.updateSshKeyPair,
+            editSshKeyPair: this.editSshKeyPair,
+            cancelEditSshKeyPair: this.cancelEditSshKeyPair,
+            saveEditSshKeyPair: this.saveEditSshKeyPair,
+            deleteSshKeyPair: this.deleteSshKeyPair,
+            updateEditSshKeyPair: this.updateEditSshKeyPair
+        });
+    }
+    updateNewKeyValue = (k, field) => {
+        let self = this;
+        return function(e) {
+            let value = e.target.value;
+            let ref = self.newKey;
+            ref[field] = value;
+            self.setState({newKey: ref});
+        }
+    }
+    editSshKeyPair = (k) => {
+        let self = this;
+        return function(e) {
+            let data = self.data;
+            let ref = data.entities[k];
+            ref.isEditable = true;
+            self.setState({data:data});
+        }
+    }
+    cancelEditSshKeyPair = (k) => {
+        let self = this;
+        return function(e) {
+            let data = _.cloneDeep(self.data);
+            data.entities[k].key = self.dataCache.entities[k].key;
+            data.entities[k].isEditable = false;
+            self.setState({data:data});
+        }
+    }
+    saveEditSshKeyPair = (data) => {
+        let self = this;
+            return function(e) {
+                if(self.validate(data)) {
+                    self.getInstance().saveSshKey(self.trimName(data)).then(function() {})
+                } else {
+                    self.alt.actions.global.showNotification('Make sure all fields are filled in and that you are using only alphanumeric characters for the name');
+                }
+            }
+    }
+    updateEditSshKeyPair = (k) => {
+        let self = this;
+        return function(e) {
+            self.getInstance().updateSshKey(self.cleanUpKeyPayload(self.data.entities[k]))
+        }
+    }
+    deleteSshKeyPair = (k) => {
+        let self = this;
+        return function(e) {
+            if(window.confirm('Are you sure you want to delete this key?')) {
+                self.getInstance().deleteSshKey(k);
+            }
+        }
+    }
+    saveSshKeySuccess = (data) => {
+        let keys = this.data;
+        keys.keys.push(data.name);
+        keys.entities[data.name] = {
+            name: data.name,
+            key: data.key,
+            isEditable: false
+        };
+        this.setState({
+            dataCache: _.cloneDeep(keys),
+            data: keys,
+            newKey: {
+              name: '',
+              key: ''
+            }
+        })
+    }
+    updateSshKeySuccess = (data) => {
+        let keys = this.data;
+        keys.entities[data.name] = {
+            name: data.name,
+            key: data.key,
+            isEditable: false
+        };
+        this.setState({
+            dataCache: _.cloneDeep(keys),
+            data: keys,
+            newKey: {
+              name: '',
+              key: ''
+            }
+        })
+    }
+    deleteSshKeySuccess = (data) => {
+        let keys = this.data;
+        keys.keys.splice(keys.keys.indexOf(data.name), 1);
+        delete keys.entities[data.name];
+        this.setState({
+            dataCache: _.cloneDeep(keys),
+            data: keys
+        })
+    }
+    saveEditSshKeyPairSuccess = () => {
+
+    }
+    getSshKeySuccess = (data) => {
+        let flattened = this.flattenKeys(data);
+        this.setState({
+            data: flattened,
+            dataCache: _.cloneDeep(flattened)
+        })
+    }
+    updateSshKeyPair = (k, field) => {
+        let self = this;
+        return function(e) {
+            let value = e.target.value;
+            let data = self.data;
+            let ref = data.entities[k];
+            ref[field] = value;
+            self.setState({data:data});
+        }
+    }
+    flattenKeys(data) {
+        var fd = {
+            keys:[],
+            entities: {}
+        };
+        data && data.map(function(d){
+            fd.keys.push(d.name);
+            fd.entities[d.name] = _.merge({isEditable: false}, d)
+        });
+        return fd;
+    }
+    cleanUpKeyPayload(payload) {
+        return {key: payload.key, name: payload.name};
+    }
+    validate(data) {
+        for (let k in data) {
+            if((data[k].trim() == '') || ((/[^\w _-]/).test(data[k]))) {
+                return false;
+            }
+        }
+        return true;
+    }
+    trimName(data) {
+        data.name = data.name.trim();
+        return data;
+    }
+
+}