From 4aa0285d00558ccec3e5a5f6978dfda820d866d6 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sun, 10 Feb 2019 15:40:05 +0000
Subject: [PATCH] Test button of BorgRepoConfig...

---
 borgbutler-webapp/src/components/views/repos/RepoConfigPanel.jsx                             |   61 ++++++++++++++++++++++++++++--
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.java |   18 +++++++++
 2 files changed, 75 insertions(+), 4 deletions(-)

diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.java
index b2c0875..d80f327 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/BorgRepoConfigsRest.java
@@ -1,8 +1,12 @@
 package de.micromata.borgbutler.server.rest;
 
+import de.micromata.borgbutler.BorgCommandResult;
+import de.micromata.borgbutler.BorgCommands;
 import de.micromata.borgbutler.cache.ButlerCache;
 import de.micromata.borgbutler.config.BorgRepoConfig;
 import de.micromata.borgbutler.config.ConfigurationHandler;
+import de.micromata.borgbutler.data.Repository;
+import de.micromata.borgbutler.jobs.JobResult;
 import de.micromata.borgbutler.json.JsonUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,4 +45,18 @@
         repoConfig.copyFrom(newRepoConfig);
         ConfigurationHandler.getInstance().save();
     }
+
+    /**
+     * @param jsonRepoConfig All configuration value of the repo to check.
+     * @return Result of borg (tbd.).
+     */
+    @POST
+    @Path("check")
+    @Produces(MediaType.APPLICATION_JSON)
+    public String checkConfig(String jsonRepoConfig) {
+        log.info("Testing repo config: " + jsonRepoConfig);
+        BorgRepoConfig repoConfig = JsonUtils.fromJson(BorgRepoConfig.class, jsonRepoConfig);
+        BorgCommandResult<Repository> result = BorgCommands.info(repoConfig);
+        return result.getStatus() == JobResult.Status.OK ? "OK" : result.getError();
+    }
 }
diff --git a/borgbutler-webapp/src/components/views/repos/RepoConfigPanel.jsx b/borgbutler-webapp/src/components/views/repos/RepoConfigPanel.jsx
index cf92052..4603d4b 100644
--- a/borgbutler-webapp/src/components/views/repos/RepoConfigPanel.jsx
+++ b/borgbutler-webapp/src/components/views/repos/RepoConfigPanel.jsx
@@ -1,5 +1,5 @@
 import React from 'react';
-import {FormGroup} from 'reactstrap';
+import {Alert, FormGroup} from 'reactstrap';
 import {FormButton, FormField} from '../../general/forms/FormComponents';
 import {getRestServiceUrl} from '../../../utilities/global';
 import I18n from "../../general/translation/I18n";
@@ -15,13 +15,16 @@
         super(props);
         this.state = {
             loading: false,
-            repoConfig: undefined
+            repoConfig: undefined,
+            testStatus: undefined,
+            testResult: undefined
         };
 
         this.fetch = this.fetch.bind(this);
         this.setRepoValue = this.setRepoValue.bind(this);
         this.onSave = this.onSave.bind(this);
         this.onCancel = this.onCancel.bind(this);
+        this.onTest = this.onTest.bind(this);
     }
 
     componentDidMount = () => this.fetch();
@@ -80,6 +83,34 @@
         }
     }
 
+    onTest(event) {
+        this.setState({
+            testStatus: 'fetching',
+            testResult: undefined
+        });
+        fetch(getRestServiceUrl("repoConfig/check"), {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json'
+            },
+            body: JSON.stringify(this.state.repoConfig)
+        })
+            .then(response => response.text())
+            .then(result => {
+                //console.log("test-result: " + result);
+                this.setState({
+                    testStatus: result === 'OK' ? 'OK' : 'error',
+                    testResult: result
+                })
+            })
+            .catch((error) => {
+                console.log("error", error);
+                this.setState({
+                    testStatus: 'exception'
+                });
+            });
+    }
+
     async onCancel() {
         const response = this.fetch();
         if (response) await response;
@@ -93,10 +124,29 @@
         let repoError = '';
         if (this.props.repoError) {
             repoError = <ErrorAlert
-                title={'Cannot access repository'}
+                title={'Internal error'}
                 description={'Repo not available or mis-configured (please refer the log files for more details).'}
             />
         }
+        let testResult = '';
+        if (!this.state.testStatus) {
+            // No test available.
+        } else if (this.state.testStatus === 'exception') {
+            testResult = <ErrorAlert title={'Unknown error'} description={'Internal error while calling Rest API.'}/>;
+        } else if (this.state.testStatus === 'OK') {
+            testResult = <Alert color={'success'}>
+                OK
+            </Alert>;
+        } else if (this.state.testStatus === 'fetching') {
+            testResult = <Alert color={'warning'}>
+                Testing...
+            </Alert>;
+        } else {
+            testResult = <ErrorAlert
+                title={'Error while testing repo configuration'}
+                description={this.state.testResult}
+            />
+        }
         if (this.state.isFetching) {
             content = <React.Fragment>Loading...</React.Fragment>;
         } else if (this.state.failed) {
@@ -126,6 +176,9 @@
                         <FormButton onClick={this.onCancel}
                                     hintKey="configuration.cancel.hint"><I18n name={'common.cancel'}/>
                         </FormButton>
+                        <FormButton onClick={this.onTest} disabled={this.state.testResult === 'fetching'} bsStyle="info"
+                                    hint={'Tries to connect to the repo and to get info from.'}>Test
+                        </FormButton>
                         <FormButton onClick={this.onSave} bsStyle="primary"
                                     hintKey="configuration.save.hint"><I18n name={'common.save'}/>
                         </FormButton>
@@ -134,7 +187,7 @@
                 <LoadingOverlay active={this.state.loading}/>
             </React.Fragment>;
         }
-        return <React.Fragment>{content}{repoError}</React.Fragment>;
+        return <React.Fragment>{content}{testResult}{repoError}</React.Fragment>;
     }
 }
 

--
Gitblit v1.10.0