From cab0496c85434b617f915a5f963981e23bc73733 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 1 Aug 2017 08:12:39 +0100 Subject: [PATCH] Api Upgrades --- assets/src/components/Header.vue | 2 +- assets/src/i18n/index.js | 2 +- assets/src/utils/api.js | 184 ++++++++++++++++--------------- http.go | 6 +- settings.go | 150 ++++++++++++------------- 5 files changed, 174 insertions(+), 170 deletions(-) diff --git a/assets/src/components/Header.vue b/assets/src/components/Header.vue index a8f9d764..656d8361 100644 --- a/assets/src/components/Header.vue +++ b/assets/src/components/Header.vue @@ -92,7 +92,7 @@ import SwitchButton from './buttons/SwitchView' import MoveButton from './buttons/Move' import CopyButton from './buttons/Copy' import {mapGetters, mapState} from 'vuex' -import api from '@/utils/api' +import * as api from '@/utils/api' import buttons from '@/utils/buttons' export default { diff --git a/assets/src/i18n/index.js b/assets/src/i18n/index.js index 13dc6b07..86bf60ed 100644 --- a/assets/src/i18n/index.js +++ b/assets/src/i18n/index.js @@ -7,7 +7,7 @@ import zhCN from './zh_cn.yaml' Vue.use(VueI18n) export default new VueI18n({ - locale: 'en', + locale: 'zh_cn', fallbackLocale: 'en', messages: { 'en': en, diff --git a/assets/src/utils/api.js b/assets/src/utils/api.js index 92a9ac34..c33a7c36 100644 --- a/assets/src/utils/api.js +++ b/assets/src/utils/api.js @@ -96,7 +96,7 @@ export function put (url, content = '') { }) } -export function moveCopy (items, copy = false) { +function moveCopy (items, copy = false) { let promises = [] for (let item of items) { @@ -203,6 +203,92 @@ export function download (format, ...files) { 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 () { return new Promise((resolve, reject) => { 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 { + removePrefix, delete: rm, fetch, checksum, @@ -407,14 +410,15 @@ export default { command, search, download, - getUser, - newUser, - updateUser, - getUsers, + // other things getCommands, updateCommands, - removePrefix, getPlugins, updatePlugins, + // User things + newUser, + getUser, + getUsers, + updateUser, deleteUser } diff --git a/http.go b/http.go index 55810311..e6c33591 100644 --- a/http.go +++ b/http.go @@ -138,10 +138,8 @@ func apiHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, code, err = resourceHandler(c, w, r) case "users": code, err = usersHandler(c, w, r) - case "commands": - code, err = commandsHandler(c, w, r) - case "plugins": - code, err = pluginsHandler(c, w, r) + case "settings": + code, err = settingsHandler(c, w, r) default: code = http.StatusNotFound } diff --git a/settings.go b/settings.go index e5e5c317..1ffc6a63 100644 --- a/settings.go +++ b/settings.go @@ -2,66 +2,23 @@ package filemanager import ( "encoding/json" - "errors" "net/http" "reflect" "github.com/mitchellh/mapstructure" ) -func commandsHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { - switch r.Method { - case http.MethodGet: - return commandsGetHandler(c, w, r) - case http.MethodPut: - return commandsPutHandler(c, w, r) - } - - return http.StatusMethodNotAllowed, nil +type modifySettingsRequest struct { + *modifyRequest + Data struct { + Commands map[string][]string `json:"commands"` + Plugins map[string]map[string]interface{} `json:"plugins"` + } `json:"data"` } -func commandsGetHandler(c *RequestContext, w http.ResponseWriter, r *http.Request) (int, error) { - if !c.User.Admin { - return http.StatusForbidden, nil - } - - 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 settingsGetRequest struct { + Commands map[string][]string `json:"commands"` + Plugins map[string][]pluginOption `json:"plugins"` } type pluginOption struct { @@ -70,19 +27,58 @@ type pluginOption struct { 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 { 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 { - plugins[name] = []pluginOption{} + result.Plugins[name] = []pluginOption{} t := reflect.TypeOf(p).Elem() 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, Name: t.Field(i).Tag.Get("name"), 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 { return http.StatusForbidden, nil } - if r.Body == nil { - 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) + mod, err := parsePutSettingsRequest(r) if err != nil { return http.StatusBadRequest, err } - for name, plugin := range raw { - err = mapstructure.Decode(plugin, c.FM.Plugins[name]) - if err != nil { + if mod.Which == "commands" { + if err := c.FM.db.Set("config", "commands", mod.Data.Commands); err != nil { return http.StatusInternalServerError, err } - err = c.FM.db.Set("plugins", name, c.FM.Plugins[name]) - if err != nil { - return http.StatusInternalServerError, err - } + c.FM.Commands = mod.Data.Commands + return http.StatusOK, nil } - 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 }