diff --git a/app/src/helpers/api.js b/app/src/helpers/api.js index e0604870..e212e75d 100644 --- a/app/src/helpers/api.js +++ b/app/src/helpers/api.js @@ -10,9 +10,12 @@ function handleResponse (response, type = 'json') { return response.ok ? response[type]() : handleErrors(response) } -function handleErrors (response) { +async function handleErrors (response) { if (response.status === 401) { throw new Error('Unauthorized') + } else if (response.status === 400) { + const message = await response.text() + throw new Error(message) } } @@ -39,11 +42,19 @@ export default { }) }, + post (uri, data) { + return fetch('/api/' + uri, { + ...this.options, + method: 'POST', + body: objectToParams(data) + }).then(response => handleResponse(response)) + }, + login (password) { return fetch('/api/login', { + ...this.options, method: 'POST', - body: objectToParams({ password }), - ...this.options + body: objectToParams({ password }) }).then(response => (response.ok)) }, diff --git a/app/src/helpers/dataStore.js b/app/src/helpers/dataStore.js index 3bec0efc..4cc2ce4c 100644 --- a/app/src/helpers/dataStore.js +++ b/app/src/helpers/dataStore.js @@ -14,16 +14,20 @@ export default { 'SET_USERS' (state, users) { state.users = Object.keys(users).length === 0 ? null : users }, + 'ADD_USER' (state, user) { + // FIXME will trigger an error if first created user + Vue.set(state.users, user.username, user) + }, 'SET_USERS_PARAM' (state, [username, userData]) { Vue.set(state.users_details, username, userData) } }, actions: { - 'FETCH' ({ state, commit, dispatch }, { uri, param, storeKey = uri, force = false }) { + 'FETCH' ({ state, commit }, { uri, param, storeKey = uri, force = false }) { const currentState = param ? state[storeKey][param] : state[storeKey] // if data has already been queried, simply return if (currentState !== undefined && !force) return currentState - console.log(`will query: "/${param ? `${uri}/${param}` : uri}" and will store in "${storeKey || uri}"`) + return api.get(param ? `${uri}/${param}` : uri).then(responseData => { const data = responseData[uri] ? responseData[uri] : responseData if (param) { @@ -33,6 +37,10 @@ export default { } return param ? state[storeKey][param] : state[storeKey] }) + }, + + 'POST' ({ state, commit }, { uri, param, data, storeKey }) { + return api.post(uri, data) } }, getters: { diff --git a/app/src/views/user/UserCreate.vue b/app/src/views/user/UserCreate.vue index fa6516cb..78789c04 100644 --- a/app/src/views/user/UserCreate.vue +++ b/app/src/views/user/UserCreate.vue @@ -191,7 +191,11 @@ export default { this.$store.dispatch('POST', { uri: 'users', data, param: data.username, storeKey: '' } - ).catch(error => { + ).then(responseData => { + // FIXME API doesn't return the same data as '/users' + this.$store.commit('ADD_USER', responseData) + this.$router.push({ name: 'user-list' }) + }).catch(error => { this.server.error = error.message this.server.isValid = false })