Api Upgrades

This commit is contained in:
Henrique Dias 2017-08-01 08:12:39 +01:00
parent 5d97fd47ba
commit cab0496c85
No known key found for this signature in database
GPG Key ID: 936F5EB68D786730
5 changed files with 174 additions and 170 deletions

View File

@ -92,7 +92,7 @@ import SwitchButton from './buttons/SwitchView'
import MoveButton from './buttons/Move' import MoveButton from './buttons/Move'
import CopyButton from './buttons/Copy' import CopyButton from './buttons/Copy'
import {mapGetters, mapState} from 'vuex' import {mapGetters, mapState} from 'vuex'
import api from '@/utils/api' import * as api from '@/utils/api'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
export default { export default {

View File

@ -7,7 +7,7 @@ import zhCN from './zh_cn.yaml'
Vue.use(VueI18n) Vue.use(VueI18n)
export default new VueI18n({ export default new VueI18n({
locale: 'en', locale: 'zh_cn',
fallbackLocale: 'en', fallbackLocale: 'en',
messages: { messages: {
'en': en, 'en': en,

View File

@ -96,7 +96,7 @@ export function put (url, content = '') {
}) })
} }
export function moveCopy (items, copy = false) { function moveCopy (items, copy = false) {
let promises = [] let promises = []
for (let item of items) { for (let item of items) {
@ -203,6 +203,92 @@ export function download (format, ...files) {
window.open(url) window.open(url)
} }
export function getCommands () {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('GET', `${store.state.baseURL}/api/commands/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve(JSON.parse(request.responseText))
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send()
})
}
export function updateCommands (commands) {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('PUT', `${store.state.baseURL}/api/commands/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve()
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send(JSON.stringify(commands))
})
}
export function getPlugins () {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('GET', `${store.state.baseURL}/api/plugins/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve(JSON.parse(request.responseText))
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send()
})
}
export function updatePlugins (data) {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('PUT', `${store.state.baseURL}/api/plugins/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve()
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send(JSON.stringify(data))
})
}
// USERS
export function getUsers () { export function getUsers () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest() let request = new window.XMLHttpRequest()
@ -312,91 +398,8 @@ export function deleteUser (id) {
}) })
} }
export function getCommands () {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('GET', `${store.state.baseURL}/api/commands/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve(JSON.parse(request.responseText))
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send()
})
}
export function updateCommands (commands) {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('PUT', `${store.state.baseURL}/api/commands/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve()
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send(JSON.stringify(commands))
})
}
export function getPlugins () {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('GET', `${store.state.baseURL}/api/plugins/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve(JSON.parse(request.responseText))
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send()
})
}
export function updatePlugins (data) {
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('PUT', `${store.state.baseURL}/api/plugins/`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
request.onload = () => {
switch (request.status) {
case 200:
resolve()
break
default:
reject(request.responseText)
break
}
}
request.onerror = (error) => reject(error)
request.send(JSON.stringify(data))
})
}
export default { export default {
removePrefix,
delete: rm, delete: rm,
fetch, fetch,
checksum, checksum,
@ -407,14 +410,15 @@ export default {
command, command,
search, search,
download, download,
getUser, // other things
newUser,
updateUser,
getUsers,
getCommands, getCommands,
updateCommands, updateCommands,
removePrefix,
getPlugins, getPlugins,
updatePlugins, updatePlugins,
// User things
newUser,
getUser,
getUsers,
updateUser,
deleteUser deleteUser
} }

View File

@ -138,10 +138,8 @@ func apiHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int,
code, err = resourceHandler(c, w, r) code, err = resourceHandler(c, w, r)
case "users": case "users":
code, err = usersHandler(c, w, r) code, err = usersHandler(c, w, r)
case "commands": case "settings":
code, err = commandsHandler(c, w, r) code, err = settingsHandler(c, w, r)
case "plugins":
code, err = pluginsHandler(c, w, r)
default: default:
code = http.StatusNotFound code = http.StatusNotFound
} }

View File

@ -2,66 +2,23 @@ package filemanager
import ( import (
"encoding/json" "encoding/json"
"errors"
"net/http" "net/http"
"reflect" "reflect"
"github.com/mitchellh/mapstructure" "github.com/mitchellh/mapstructure"
) )
func commandsHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { type modifySettingsRequest struct {
switch r.Method { *modifyRequest
case http.MethodGet: Data struct {
return commandsGetHandler(c, w, r) Commands map[string][]string `json:"commands"`
case http.MethodPut: Plugins map[string]map[string]interface{} `json:"plugins"`
return commandsPutHandler(c, w, r) } `json:"data"`
}
return http.StatusMethodNotAllowed, nil
} }
func commandsGetHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { type settingsGetRequest struct {
if !c.User.Admin { Commands map[string][]string `json:"commands"`
return http.StatusForbidden, nil Plugins map[string][]pluginOption `json:"plugins"`
}
return renderJSON(w, c.FM.Commands)
}
func commandsPutHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
if !c.User.Admin {
return http.StatusForbidden, nil
}
if r.Body == nil {
return http.StatusBadGateway, errors.New("Empty request body")
}
var commands map[string][]string
// Parses the user and checks for error.
err := json.NewDecoder(r.Body).Decode(&commands)
if err != nil {
return http.StatusBadRequest, errors.New("Invalid JSON")
}
if err := c.FM.db.Set("config", "commands", commands); err != nil {
return http.StatusInternalServerError, err
}
c.FM.Commands = commands
return http.StatusOK, nil
}
func pluginsHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
switch r.Method {
case http.MethodGet:
return pluginsGetHandler(c, w, r)
case http.MethodPut:
return pluginsPutHandler(c, w, r)
}
return http.StatusMethodNotAllowed, nil
} }
type pluginOption struct { type pluginOption struct {
@ -70,19 +27,58 @@ type pluginOption struct {
Value interface{} `json:"value"` Value interface{} `json:"value"`
} }
func pluginsGetHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { func parsePutSettingsRequest(r *http.Request) (*modifySettingsRequest, error) {
// Checks if the request body is empty.
if r.Body == nil {
return nil, errEmptyRequest
}
// Parses the request body and checks if it's well formed.
mod := &modifySettingsRequest{}
err := json.NewDecoder(r.Body).Decode(mod)
if err != nil {
return nil, err
}
// Checks if the request type is right.
if mod.What != "settings" {
return nil, errWrongDataType
}
return mod, nil
}
func settingsHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
if r.URL.Path != "" {
return http.StatusNotFound, nil
}
switch r.Method {
case http.MethodGet:
return settingsGetHandler(c, w, r)
case http.MethodPut:
return settingsPutHandler(c, w, r)
}
return http.StatusMethodNotAllowed, nil
}
func settingsGetHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
if !c.User.Admin { if !c.User.Admin {
return http.StatusForbidden, nil return http.StatusForbidden, nil
} }
plugins := map[string][]pluginOption{} result := &settingsGetRequest{
Commands: c.FM.Commands,
Plugins: map[string][]pluginOption{},
}
for name, p := range c.FM.Plugins { for name, p := range c.FM.Plugins {
plugins[name] = []pluginOption{} result.Plugins[name] = []pluginOption{}
t := reflect.TypeOf(p).Elem() t := reflect.TypeOf(p).Elem()
for i := 0; i < t.NumField(); i++ { for i := 0; i < t.NumField(); i++ {
plugins[name] = append(plugins[name], pluginOption{ result.Plugins[name] = append(result.Plugins[name], pluginOption{
Variable: t.Field(i).Name, Variable: t.Field(i).Name,
Name: t.Field(i).Tag.Get("name"), Name: t.Field(i).Tag.Get("name"),
Value: reflect.ValueOf(p).Elem().FieldByName(t.Field(i).Name).Interface(), Value: reflect.ValueOf(p).Elem().FieldByName(t.Field(i).Name).Interface(),
@ -90,37 +86,43 @@ func pluginsGetHandler(c *RequestContext, w http.ResponseWriter, r *http.Request
} }
} }
return renderJSON(w, plugins) return renderJSON(w, result)
} }
func pluginsPutHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { func settingsPutHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) {
if !c.User.Admin { if !c.User.Admin {
return http.StatusForbidden, nil return http.StatusForbidden, nil
} }
if r.Body == nil { mod, err := parsePutSettingsRequest(r)
return http.StatusBadGateway, errors.New("Empty request body")
}
var raw map[string]map[string]interface{}
// Parses the user and checks for error.
err := json.NewDecoder(r.Body).Decode(&raw)
if err != nil { if err != nil {
return http.StatusBadRequest, err return http.StatusBadRequest, err
} }
for name, plugin := range raw { if mod.Which == "commands" {
err = mapstructure.Decode(plugin, c.FM.Plugins[name]) if err := c.FM.db.Set("config", "commands", mod.Data.Commands); err != nil {
if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
err = c.FM.db.Set("plugins", name, c.FM.Plugins[name]) c.FM.Commands = mod.Data.Commands
if err != nil { return http.StatusOK, nil
return http.StatusInternalServerError, err
}
} }
return http.StatusOK, nil if mod.Which == "plugins" {
for name, plugin := range mod.Data.Plugins {
err = mapstructure.Decode(plugin, c.FM.Plugins[name])
if err != nil {
return http.StatusInternalServerError, err
}
err = c.FM.db.Set("plugins", name, c.FM.Plugins[name])
if err != nil {
return http.StatusInternalServerError, err
}
}
return http.StatusOK, nil
}
return http.StatusMethodNotAllowed, nil
} }