mirror of
https://github.com/documize/community.git
synced 2025-08-09 15:35:27 +02:00
papertrail - select group option added
This commit is contained in:
parent
c1572f1d74
commit
1de04235af
4 changed files with 225 additions and 254 deletions
|
@ -13,6 +13,7 @@ import Ember from 'ember';
|
|||
import NotifierMixin from '../../../mixins/notifier';
|
||||
import TooltipMixin from '../../../mixins/tooltip';
|
||||
import SectionMixin from '../../../mixins/section';
|
||||
import netUtil from '../../../utils/net';
|
||||
|
||||
export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin, {
|
||||
sectionService: Ember.inject.service('section'),
|
||||
|
@ -34,6 +35,8 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin,
|
|||
APIToken: "",
|
||||
query: "",
|
||||
max: 10,
|
||||
group: null,
|
||||
system: null
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -48,6 +51,14 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin,
|
|||
this.destroyTooltips();
|
||||
},
|
||||
|
||||
displayError(reason) {
|
||||
if (netUtil.isAjaxAccessError(reason)) {
|
||||
this.showNotification(`Unable to authenticate`);
|
||||
} else {
|
||||
this.showNotification(`Something went wrong, try again!`);
|
||||
}
|
||||
},
|
||||
|
||||
actions: {
|
||||
isDirty() {
|
||||
return this.get('isDirty');
|
||||
|
@ -63,29 +74,70 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin,
|
|||
}
|
||||
|
||||
let page = this.get('page');
|
||||
let config = this.get('config');
|
||||
let self = this;
|
||||
|
||||
this.set('waiting', true);
|
||||
|
||||
this.get('sectionService').fetch(page, "auth", this.get('config'))
|
||||
this.get('sectionService').fetch(page, "auth", config)
|
||||
.then(function(response) {
|
||||
self.set('authenticated', true);
|
||||
self.set('items', response);
|
||||
|
||||
self.get('sectionService').fetch(page, "options", config)
|
||||
.then(function(response) {
|
||||
self.set('options', response);
|
||||
self.set('waiting', false);
|
||||
|
||||
let options = self.get('options');
|
||||
let group = _.findWhere(options.groups, {id: config.group.id});
|
||||
if (is.not.undefined(group)) {
|
||||
Ember.set(config, 'group', group);
|
||||
}
|
||||
}, function(reason) { //jshint ignore: line
|
||||
self.set('waiting', false);
|
||||
self.displayError(reason);
|
||||
});
|
||||
}, function(reason) { //jshint ignore: line
|
||||
self.set('authenticated', false);
|
||||
self.set('waiting', false);
|
||||
self.displayError(reason);
|
||||
});
|
||||
},
|
||||
|
||||
switch (reason.status) {
|
||||
case 400:
|
||||
self.showNotification(`Unable to connect to Papertrail`);
|
||||
break;
|
||||
case 403:
|
||||
self.showNotification(`Unable to authenticate`);
|
||||
break;
|
||||
default:
|
||||
self.showNotification(`Something went wrong, try again!`);
|
||||
}
|
||||
onGroupsChange(group) {
|
||||
let config = this.get('config');
|
||||
let page = this.get('page');
|
||||
let self = this;
|
||||
this.set('isDirty', true);
|
||||
this.set('config.group', group);
|
||||
this.set('waiting', true);
|
||||
|
||||
this.get('sectionService').fetch(page, "auth", config)
|
||||
.then(function(response) {
|
||||
self.set('waiting', false);
|
||||
self.set('items', response);
|
||||
}, function(reason) { //jshint ignore: line
|
||||
self.set('waiting', false);
|
||||
self.displayError(reason);
|
||||
});
|
||||
},
|
||||
|
||||
onSystemsChange(system) {
|
||||
let config = this.get('config');
|
||||
let page = this.get('page');
|
||||
let self = this;
|
||||
this.set('isDirty', true);
|
||||
this.set('config.system', system);
|
||||
this.set('waiting', true);
|
||||
|
||||
this.get('sectionService').fetch(page, "auth", config)
|
||||
.then(function(response) {
|
||||
self.set('waiting', false);
|
||||
self.set('items', response);
|
||||
}, function(reason) { //jshint ignore: line
|
||||
self.set('waiting', false);
|
||||
self.displayError(reason);
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -126,7 +178,6 @@ export default Ember.Component.extend(SectionMixin, NotifierMixin, TooltipMixin,
|
|||
}, function(reason) { //jshint ignore: line
|
||||
self.set('authenticated', false);
|
||||
self.set('waiting', false);
|
||||
console.log(reason);
|
||||
self.showNotification(`Something went wrong, try again!`);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -36,6 +36,11 @@
|
|||
<div class="tip">How many log entries do you want?</div>
|
||||
{{input id="papertrail-max" type="number" class="mousetrap" value=config.max}}
|
||||
</div>
|
||||
<div class="input-control">
|
||||
<label>Group</label>
|
||||
<div class="tip">Optional Papertrail group</div>
|
||||
{{ui-select id="group-dropdown" prompt="<group>" content=options.groups action=(action 'onGroupsChange') optionValuePath="id" optionLabelPath="name" selection=config.group}}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -64,9 +64,21 @@ type papertrailConfig struct {
|
|||
APIToken string `json:"APIToken"`
|
||||
Query string `json:"query"`
|
||||
Max int `json:"max"`
|
||||
Group papertrailOption `json:"group"`
|
||||
System papertrailOption `json:"system"`
|
||||
}
|
||||
|
||||
func (c *papertrailConfig) Clean() {
|
||||
c.APIToken = strings.TrimSpace(c.APIToken)
|
||||
c.Query = strings.TrimSpace(c.Query)
|
||||
}
|
||||
|
||||
type papertrailOption struct {
|
||||
ID int `json:"id"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type papertrailOptions struct {
|
||||
Groups []papertrailOption `json:"groups"`
|
||||
Systems []papertrailOption `json:"systems"`
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ import (
|
|||
"net/url"
|
||||
|
||||
"github.com/documize/community/documize/section/provider"
|
||||
"github.com/documize/community/wordsmith/log"
|
||||
)
|
||||
|
||||
const me = "papertrail"
|
||||
|
@ -42,7 +43,6 @@ func (*Provider) Meta() provider.TypeMeta {
|
|||
|
||||
// Render converts Papertrail data into HTML suitable for browser rendering.
|
||||
func (*Provider) Render(config, data string) string {
|
||||
|
||||
var search papertrailSearch
|
||||
var events []papertrailEvent
|
||||
var payload = papertrailRender{}
|
||||
|
@ -83,84 +83,6 @@ func (p *Provider) Command(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
switch method {
|
||||
case "auth":
|
||||
auth(w, r)
|
||||
// case "items":
|
||||
// items(w, r)
|
||||
}
|
||||
}
|
||||
|
||||
// Refresh just sends back data as-is.
|
||||
func (*Provider) Refresh(config, data string) (newData string) {
|
||||
|
||||
return data
|
||||
// var c = geminiConfig{}
|
||||
// err := json.Unmarshal([]byte(config), &c)
|
||||
//
|
||||
// if err != nil {
|
||||
// log.Error("Unable to read Gemini config", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// c.Clean()
|
||||
//
|
||||
// if len(c.URL) == 0 {
|
||||
// log.Info("Gemini.Refresh received empty URL")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if len(c.Username) == 0 {
|
||||
// log.Info("Gemini.Refresh received empty username")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if len(c.APIKey) == 0 {
|
||||
// log.Info("Gemini.Refresh received empty API key")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// req, err := http.NewRequest("GET", fmt.Sprintf("%s/api/items/card/%d", c.URL, c.WorkspaceID), nil)
|
||||
// // req.Header.Set("Content-Type", "application/json")
|
||||
//
|
||||
// creds := []byte(fmt.Sprintf("%s:%s", c.Username, c.APIKey))
|
||||
// req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString(creds))
|
||||
//
|
||||
// client := &http.Client{}
|
||||
// res, err := client.Do(req)
|
||||
//
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if res.StatusCode != http.StatusOK {
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// defer res.Body.Close()
|
||||
// var items []geminiItem
|
||||
//
|
||||
// dec := json.NewDecoder(res.Body)
|
||||
// err = dec.Decode(&items)
|
||||
//
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// j, err := json.Marshal(items)
|
||||
//
|
||||
// if err != nil {
|
||||
// log.Error("unable to marshall gemini items", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// newData = string(j)
|
||||
// return
|
||||
}
|
||||
|
||||
func auth(w http.ResponseWriter, r *http.Request) {
|
||||
defer r.Body.Close()
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
|
||||
|
@ -184,11 +106,68 @@ func auth(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var search string
|
||||
if len(config.Query) > 0 {
|
||||
search = "q=" + url.QueryEscape(config.Query)
|
||||
switch method {
|
||||
case "auth":
|
||||
auth(config, w, r)
|
||||
case "options":
|
||||
options(config, w, r)
|
||||
}
|
||||
req, err := http.NewRequest("GET", "https://papertrailapp.com/api/v1/events/search.json?"+search, nil)
|
||||
}
|
||||
|
||||
// Refresh just sends back data as-is.
|
||||
func (*Provider) Refresh(config, data string) (newData string) {
|
||||
var c = papertrailConfig{}
|
||||
err := json.Unmarshal([]byte(config), &c)
|
||||
|
||||
if err != nil {
|
||||
log.Error("unable to read Papertrail config", err)
|
||||
return
|
||||
}
|
||||
|
||||
c.Clean()
|
||||
|
||||
if len(c.APIToken) == 0 {
|
||||
log.Error("missing API token", err)
|
||||
return
|
||||
}
|
||||
|
||||
result, err := fetchEvents(c)
|
||||
|
||||
if err != nil {
|
||||
log.Error("Papertrail fetchEvents failed", err)
|
||||
return
|
||||
}
|
||||
|
||||
j, err := json.Marshal(result)
|
||||
|
||||
if err != nil {
|
||||
log.Error("unable to marshal Papaertrail events", err)
|
||||
return
|
||||
}
|
||||
|
||||
newData = string(j)
|
||||
return
|
||||
}
|
||||
|
||||
func auth(config papertrailConfig, w http.ResponseWriter, r *http.Request) {
|
||||
result, err := fetchEvents(config)
|
||||
|
||||
if err != nil {
|
||||
if err.Error() == "forbidden" {
|
||||
provider.WriteForbidden(w)
|
||||
} else {
|
||||
provider.WriteError(w, me, err)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
provider.WriteJSON(w, result)
|
||||
}
|
||||
|
||||
func options(config papertrailConfig, w http.ResponseWriter, r *http.Request) {
|
||||
// get systems
|
||||
req, err := http.NewRequest("GET", "https://papertrailapp.com/api/v1/systems.json", nil)
|
||||
req.Header.Set("X-Papertrail-Token", config.APIToken)
|
||||
|
||||
client := &http.Client{}
|
||||
|
@ -206,10 +185,10 @@ func auth(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
defer res.Body.Close()
|
||||
var result interface{}
|
||||
var systems []papertrailOption
|
||||
|
||||
dec := json.NewDecoder(res.Body)
|
||||
err = dec.Decode(&result)
|
||||
err = dec.Decode(&systems)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
|
@ -217,156 +196,80 @@ func auth(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
provider.WriteJSON(w, result)
|
||||
// get groups
|
||||
req, err = http.NewRequest("GET", "https://papertrailapp.com/api/v1/groups.json", nil)
|
||||
req.Header.Set("X-Papertrail-Token", config.APIToken)
|
||||
|
||||
client = &http.Client{}
|
||||
res, err = client.Do(req)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
provider.WriteError(w, me, err)
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// func workspace(w http.ResponseWriter, r *http.Request) {
|
||||
// defer r.Body.Close()
|
||||
// body, err := ioutil.ReadAll(r.Body)
|
||||
//
|
||||
// if err != nil {
|
||||
// provider.WriteMessage(w, "gemini", "Bad payload")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// var config = geminiConfig{}
|
||||
// err = json.Unmarshal(body, &config)
|
||||
//
|
||||
// if err != nil {
|
||||
// provider.WriteMessage(w, "gemini", "Bad payload")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// config.Clean()
|
||||
//
|
||||
// if len(config.URL) == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing URL value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if len(config.Username) == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing Username value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if len(config.APIKey) == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing APIKey value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if config.UserID == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing UserId value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// req, err := http.NewRequest("GET", fmt.Sprintf("%s/api/navigationcards/users/%d", config.URL, config.UserID), nil)
|
||||
//
|
||||
// creds := []byte(fmt.Sprintf("%s:%s", config.Username, config.APIKey))
|
||||
// req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString(creds))
|
||||
//
|
||||
// client := &http.Client{}
|
||||
// res, err := client.Do(req)
|
||||
//
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// provider.WriteError(w, "gemini", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if res.StatusCode != http.StatusOK {
|
||||
// provider.WriteForbidden(w)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// defer res.Body.Close()
|
||||
// var workspace interface{}
|
||||
//
|
||||
// dec := json.NewDecoder(res.Body)
|
||||
// err = dec.Decode(&workspace)
|
||||
//
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// provider.WriteError(w, "gemini", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// provider.WriteJSON(w, workspace)
|
||||
// }
|
||||
//
|
||||
// func items(w http.ResponseWriter, r *http.Request) {
|
||||
// defer r.Body.Close()
|
||||
// body, err := ioutil.ReadAll(r.Body)
|
||||
//
|
||||
// if err != nil {
|
||||
// provider.WriteMessage(w, "gemini", "Bad payload")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// var config = geminiConfig{}
|
||||
// err = json.Unmarshal(body, &config)
|
||||
//
|
||||
// if err != nil {
|
||||
// provider.WriteMessage(w, "gemini", "Bad payload")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// config.Clean()
|
||||
//
|
||||
// if len(config.URL) == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing URL value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if len(config.Username) == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing Username value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if len(config.APIKey) == 0 {
|
||||
// provider.WriteMessage(w, "gemini", "Missing APIKey value")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// creds := []byte(fmt.Sprintf("%s:%s", config.Username, config.APIKey))
|
||||
//
|
||||
// filter, err := json.Marshal(config.Filter)
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// provider.WriteError(w, "gemini", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// var jsonFilter = []byte(string(filter))
|
||||
// req, err := http.NewRequest("POST", fmt.Sprintf("%s/api/items/filtered", config.URL), bytes.NewBuffer(jsonFilter))
|
||||
// req.Header.Set("Content-Type", "application/json")
|
||||
// req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString(creds))
|
||||
//
|
||||
// client := &http.Client{}
|
||||
// res, err := client.Do(req)
|
||||
//
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// provider.WriteError(w, "gemini", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// if res.StatusCode != http.StatusOK {
|
||||
// provider.WriteForbidden(w)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// defer res.Body.Close()
|
||||
// var items interface{}
|
||||
//
|
||||
// dec := json.NewDecoder(res.Body)
|
||||
// err = dec.Decode(&items)
|
||||
//
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// provider.WriteError(w, "gemini", err)
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// provider.WriteJSON(w, items)
|
||||
// }
|
||||
if res.StatusCode != http.StatusOK {
|
||||
provider.WriteForbidden(w)
|
||||
return
|
||||
}
|
||||
|
||||
defer res.Body.Close()
|
||||
var groups []papertrailOption
|
||||
|
||||
dec = json.NewDecoder(res.Body)
|
||||
err = dec.Decode(&groups)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
provider.WriteError(w, me, err)
|
||||
return
|
||||
}
|
||||
|
||||
var options = papertrailOptions{}
|
||||
options.Groups = groups
|
||||
options.Systems = systems
|
||||
|
||||
provider.WriteJSON(w, options)
|
||||
}
|
||||
|
||||
func fetchEvents(config papertrailConfig) (result interface{}, err error) {
|
||||
var filter string
|
||||
if len(config.Query) > 0 {
|
||||
filter = fmt.Sprintf("q=%s", url.QueryEscape(config.Query))
|
||||
}
|
||||
if config.Group.ID > 0 {
|
||||
prefix := ""
|
||||
if len(filter) > 0 {
|
||||
prefix = "&"
|
||||
}
|
||||
filter = fmt.Sprintf("%s%sgroup_id=%d", filter, prefix, config.Group.ID)
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", "https://papertrailapp.com/api/v1/events/search.json?"+filter, nil)
|
||||
req.Header.Set("X-Papertrail-Token", config.APIToken)
|
||||
|
||||
client := &http.Client{}
|
||||
res, err := client.Do(req)
|
||||
|
||||
if err != nil {
|
||||
log.Error("message", err)
|
||||
return
|
||||
}
|
||||
|
||||
if res.StatusCode != http.StatusOK {
|
||||
log.Error("forbidden", err)
|
||||
return
|
||||
}
|
||||
|
||||
defer res.Body.Close()
|
||||
|
||||
dec := json.NewDecoder(res.Body)
|
||||
err = dec.Decode(&result)
|
||||
|
||||
if err != nil {
|
||||
log.Error("unable to read result", err)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue