From 330941522f78d0db7af932b864a670305129a1d1 Mon Sep 17 00:00:00 2001 From: Florian Dupret <34862846+sephrat@users.noreply.github.com> Date: Tue, 27 Apr 2021 20:03:54 +0200 Subject: [PATCH] Move API texts to frontend + better status codes --- frontend/src/api/api-utils.js | 25 +------ frontend/src/api/backup.js | 2 +- frontend/src/api/category.js | 2 +- frontend/src/api/groups.js | 6 +- frontend/src/api/migration.js | 2 +- frontend/src/api/recipe.js | 5 +- frontend/src/api/signUps.js | 6 +- frontend/src/api/siteSettings.js | 11 ++- frontend/src/api/themes.js | 9 +-- frontend/src/api/upload.js | 2 +- frontend/src/api/users.js | 12 ++-- frontend/src/components/Login/LoginForm.vue | 3 + frontend/src/components/Login/SignUpForm.vue | 19 ++--- .../components/MealPlan/MealPlanEditor.vue | 9 ++- .../src/components/MealPlan/MealPlanNew.vue | 7 +- .../Recipe/RecipeEditor/ImageUploadBtn.vue | 8 ++- .../components/UI/Buttons/TheUploadBtn.vue | 8 ++- frontend/src/locales/messages/en-US.json | 69 ++++++++++++++++++- .../Admin/Backup/AvailableBackupCard.vue | 10 ++- .../src/pages/Admin/Backup/NewBackupCard.vue | 10 ++- .../src/pages/Admin/ManageUsers/GroupCard.vue | 25 ++++++- .../Admin/ManageUsers/GroupDashboard.vue | 8 ++- .../Admin/ManageUsers/TheSignUpTable.vue | 16 +++-- .../pages/Admin/ManageUsers/TheUserTable.vue | 54 ++++++++++++--- .../src/pages/Admin/MealPlanner/index.vue | 12 +++- .../pages/Admin/Migration/MigrationCard.vue | 12 +++- frontend/src/pages/Admin/Profile/index.vue | 24 +++++-- .../pages/Admin/Settings/CreatePageDialog.vue | 22 ++++-- .../Admin/Settings/CustomPageCreator.vue | 10 ++- .../pages/Admin/Settings/HomePageSettings.vue | 17 ++++- frontend/src/pages/Admin/Theme/ThemeCard.vue | 15 ++-- frontend/src/pages/Admin/Theme/index.vue | 19 +++-- frontend/src/pages/MealPlan/Planner.vue | 9 ++- frontend/src/pages/Recipe/NewRecipe.vue | 8 ++- frontend/src/pages/Recipe/ViewRecipe.vue | 21 +++++- mealie/routes/backup_routes.py | 59 +++++++--------- mealie/routes/groups/crud.py | 27 ++++---- mealie/routes/mealplans/crud.py | 34 ++++----- mealie/routes/migration_routes.py | 18 ++--- mealie/routes/recipe/category_routes.py | 10 +-- mealie/routes/recipe/recipe_crud_routes.py | 10 +-- mealie/routes/recipe/tag_routes.py | 8 +-- mealie/routes/site_settings/custom_pages.py | 6 +- mealie/routes/site_settings/site_settings.py | 3 - mealie/routes/theme_routes.py | 19 +++-- mealie/routes/users/auth.py | 7 +- mealie/routes/users/crud.py | 45 ++++++------ mealie/routes/users/sign_up.py | 33 ++++----- mealie/routes/utility_routes.py | 9 ++- mealie/schema/snackbar.py | 26 ------- 50 files changed, 490 insertions(+), 321 deletions(-) delete mode 100644 mealie/schema/snackbar.py diff --git a/frontend/src/api/api-utils.js b/frontend/src/api/api-utils.js index 853d5ac9f..50b9ed964 100644 --- a/frontend/src/api/api-utils.js +++ b/frontend/src/api/api-utils.js @@ -1,64 +1,45 @@ const baseURL = "/api/"; import axios from "axios"; -import utils from "@/utils"; import { store } from "../store"; axios.defaults.headers.common[ "Authorization" ] = `Bearer ${store.getters.getToken}`; -function processResponse(response) { - try { - utils.notify.show(response.data.snackbar.text, response.data.snackbar.type); - } catch (err) { - return; - } - - return; -} - const apiReq = { post: async function(url, data) { let response = await axios.post(url, data).catch(function(error) { if (error.response) { - processResponse(error.response); return error.response; } }); - processResponse(response); return response; }, put: async function(url, data) { let response = await axios.put(url, data).catch(function(error) { if (error.response) { - processResponse(error.response); - return response; + return error.response; } else return; }); - processResponse(response); return response; }, get: async function(url, data) { let response = await axios.get(url, data).catch(function(error) { if (error.response) { - processResponse(error.response); - return response; + return error.response; } else return; }); - processResponse(response); return response; }, delete: async function(url, data) { let response = await axios.delete(url, data).catch(function(error) { if (error.response) { - processResponse(error.response); - return response; + return error.response; } }); - processResponse(response); return response; }, diff --git a/frontend/src/api/backup.js b/frontend/src/api/backup.js index b6afd6e98..f7932bcac 100644 --- a/frontend/src/api/backup.js +++ b/frontend/src/api/backup.js @@ -40,7 +40,7 @@ export const backupAPI = { * @param {string} fileName */ async delete(fileName) { - await apiReq.delete(backupURLs.deleteBackup(fileName)); + return await apiReq.delete(backupURLs.deleteBackup(fileName)); }, /** * Creates a backup on the serve given a set of options diff --git a/frontend/src/api/category.js b/frontend/src/api/category.js index f60739c8d..94118fc99 100644 --- a/frontend/src/api/category.js +++ b/frontend/src/api/category.js @@ -27,7 +27,7 @@ export const categoryAPI = { async delete(category) { let response = await apiReq.delete(categoryURLs.deleteCategory(category)); store.dispatch("requestCategories"); - return response.data; + return response; }, }; diff --git a/frontend/src/api/groups.js b/frontend/src/api/groups.js index 7f67a16de..bbb7fe8dc 100644 --- a/frontend/src/api/groups.js +++ b/frontend/src/api/groups.js @@ -17,11 +17,11 @@ export const groupAPI = { }, async create(name) { let response = await apiReq.post(groupsURLs.create, { name: name }); - return response.data; + return response; }, async delete(id) { let response = await apiReq.delete(groupsURLs.delete(id)); - return response.data; + return response; }, async current() { let response = await apiReq.get(groupsURLs.current); @@ -29,6 +29,6 @@ export const groupAPI = { }, async update(data) { let response = await apiReq.put(groupsURLs.update(data.id), data); - return response.data; + return response; }, }; diff --git a/frontend/src/api/migration.js b/frontend/src/api/migration.js index e09c07cd9..f69c6e116 100644 --- a/frontend/src/api/migration.js +++ b/frontend/src/api/migration.js @@ -18,7 +18,7 @@ export const migrationAPI = { }, async delete(folder, file) { let response = await apiReq.delete(migrationURLs.delete(folder, file)); - return response.data; + return response; }, async import(folder, file) { let response = await apiReq.post(migrationURLs.import(folder, file)); diff --git a/frontend/src/api/recipe.js b/frontend/src/api/recipe.js index c86e5b4cf..881990178 100644 --- a/frontend/src/api/recipe.js +++ b/frontend/src/api/recipe.js @@ -1,7 +1,6 @@ import { baseURL } from "./api-utils"; import { apiReq } from "./api-utils"; import { store } from "../store"; -import { router } from "../main"; const prefix = baseURL + "recipes/"; @@ -72,9 +71,7 @@ export const recipeAPI = { }, async delete(recipeSlug) { - await apiReq.delete(recipeURLs.delete(recipeSlug)); - store.dispatch("requestRecentRecipes"); - router.push(`/`); + return await apiReq.delete(recipeURLs.delete(recipeSlug)); }, async allSummary(start = 0, limit = 9999) { diff --git a/frontend/src/api/signUps.js b/frontend/src/api/signUps.js index 91b982caa..b1cdad9d1 100644 --- a/frontend/src/api/signUps.js +++ b/frontend/src/api/signUps.js @@ -20,11 +20,9 @@ export const signupAPI = { return response.data; }, async deleteToken(token) { - let response = await apiReq.delete(signUpURLs.deleteToken(token)); - return response.data; + return await apiReq.delete(signUpURLs.deleteToken(token)); }, async createUser(token, data) { - let response = await apiReq.post(signUpURLs.createUser(token), data); - return response.data; + return apiReq.post(signUpURLs.createUser(token), data); }, }; diff --git a/frontend/src/api/siteSettings.js b/frontend/src/api/siteSettings.js index 1b511e8b3..fd0f413c3 100644 --- a/frontend/src/api/siteSettings.js +++ b/frontend/src/api/siteSettings.js @@ -21,7 +21,7 @@ export const siteSettingsAPI = { async update(body) { let response = await apiReq.put(settingsURLs.updateSiteSettings, body); store.dispatch("requestSiteSettings"); - return response.data; + return response; }, async getPages() { @@ -35,18 +35,15 @@ export const siteSettingsAPI = { }, async createPage(body) { - let response = await apiReq.post(settingsURLs.customPages, body); - return response.data; + return await apiReq.post(settingsURLs.customPages, body); }, async deletePage(id) { - let response = await apiReq.delete(settingsURLs.customPage(id)); - return response.data; + return await apiReq.delete(settingsURLs.customPage(id)); }, async updatePage(body) { - let response = await apiReq.put(settingsURLs.customPage(body.id), body); - return response.data; + return await apiReq.put(settingsURLs.customPage(body.id), body); }, async updateAllPages(allPages) { diff --git a/frontend/src/api/themes.js b/frontend/src/api/themes.js index d29568216..04eb90646 100644 --- a/frontend/src/api/themes.js +++ b/frontend/src/api/themes.js @@ -23,8 +23,7 @@ export const themeAPI = { }, async create(postBody) { - let response = await apiReq.post(settingsURLs.createTheme, postBody); - return response.data; + return await apiReq.post(settingsURLs.createTheme, postBody); }, async update(themeName, colors) { @@ -32,12 +31,10 @@ export const themeAPI = { name: themeName, colors: colors, }; - let response = await apiReq.put(settingsURLs.updateTheme(themeName), body); - return response.data; + return await apiReq.put(settingsURLs.updateTheme(themeName), body); }, async delete(themeName) { - let response = await apiReq.delete(settingsURLs.deleteTheme(themeName)); - return response.data; + return await apiReq.delete(settingsURLs.deleteTheme(themeName)); }, }; diff --git a/frontend/src/api/upload.js b/frontend/src/api/upload.js index d5475080e..206062b44 100644 --- a/frontend/src/api/upload.js +++ b/frontend/src/api/upload.js @@ -10,6 +10,6 @@ export const utilsAPI = { "Content-Type": "multipart/form-data", }, }); - return response.data; + return response; }, }; diff --git a/frontend/src/api/users.js b/frontend/src/api/users.js index b312e463f..3e7a5e06a 100644 --- a/frontend/src/api/users.js +++ b/frontend/src/api/users.js @@ -37,8 +37,7 @@ export const userAPI = { return response.data; }, async create(user) { - let response = await apiReq.post(usersURLs.users, user); - return response.data; + return await apiReq.post(usersURLs.users, user); }, async self() { let response = await apiReq.get(usersURLs.self); @@ -49,19 +48,16 @@ export const userAPI = { return response.data; }, async update(user) { - let response = await apiReq.put(usersURLs.userID(user.id), user); - return response.data; + return await apiReq.put(usersURLs.userID(user.id), user); }, async changePassword(id, password) { let response = await apiReq.put(usersURLs.password(id), password); return response.data; }, async delete(id) { - let response = await apiReq.delete(usersURLs.userID(id)); - return response.data; + return await apiReq.delete(usersURLs.userID(id)); }, async resetPassword(id) { - let response = await apiReq.put(usersURLs.resetPassword(id)); - return response.data; + return await apiReq.put(usersURLs.resetPassword(id)); }, }; diff --git a/frontend/src/components/Login/LoginForm.vue b/frontend/src/components/Login/LoginForm.vue index 1cb48b729..63ba2c768 100644 --- a/frontend/src/components/Login/LoginForm.vue +++ b/frontend/src/components/Login/LoginForm.vue @@ -61,6 +61,7 @@ diff --git a/frontend/src/pages/Admin/MealPlanner/index.vue b/frontend/src/pages/Admin/MealPlanner/index.vue index 3e03abdff..f240aa8f4 100644 --- a/frontend/src/pages/Admin/MealPlanner/index.vue +++ b/frontend/src/pages/Admin/MealPlanner/index.vue @@ -84,6 +84,7 @@ import { api } from "@/api"; import TimePickerDialog from "@/components/FormHelpers/TimePickerDialog"; import CategoryTagSelector from "@/components/FormHelpers/CategoryTagSelector"; +import utils from "@/utils"; export default { components: { TimePickerDialog, @@ -135,9 +136,14 @@ export default { this.groupSettings.webhookUrls.splice(index, 1); }, async saveGroupSettings() { - await api.groups.update(this.groupSettings); - await this.$store.dispatch("requestCurrentGroup"); - this.getSiteSettings(); + const response = await api.groups.update(this.groupSettings); + if (response.status != 200) { + utils.notify.error(this.$t('user.error-updating-group')); + } else { + utils.notify.success(this.$t('settings.group-settings-updated')); + await this.$store.dispatch("requestCurrentGroup"); + this.getSiteSettings(); + } }, testWebhooks() { api.settings.testWebhooks(); diff --git a/frontend/src/pages/Admin/Migration/MigrationCard.vue b/frontend/src/pages/Admin/Migration/MigrationCard.vue index 055d8de76..1462970e0 100644 --- a/frontend/src/pages/Admin/Migration/MigrationCard.vue +++ b/frontend/src/pages/Admin/Migration/MigrationCard.vue @@ -69,6 +69,7 @@ import TheUploadBtn from "@/components/UI/Buttons/TheUploadBtn"; import { api } from "@/api"; import MigrationDialog from "./MigrationDialog"; +import utils from "@/utils"; export default { props: { folder: String, @@ -86,9 +87,14 @@ export default { }; }, methods: { - deleteMigration(file_name) { - api.migrations.delete(this.folder, file_name); - this.$emit("refresh"); + async deleteMigration(file_name) { + const response = await api.migrations.delete(this.folder, file_name); + if (response.status != 200) { + utils.notify.error(this.$t('general.file-folder-not-found')); + } else { + utils.notify.success(this.$t('migration.migration-data-removed')); + this.$emit("refresh"); + } }, async importMigration(file_name) { this.loading = true; diff --git a/frontend/src/pages/Admin/Profile/index.vue b/frontend/src/pages/Admin/Profile/index.vue index 0348c53e9..3b56488ae 100644 --- a/frontend/src/pages/Admin/Profile/index.vue +++ b/frontend/src/pages/Admin/Profile/index.vue @@ -147,6 +147,7 @@ // import AvatarPicker from '@/components/AvatarPicker' import TheUploadBtn from "@/components/UI/Buttons/TheUploadBtn"; import { api } from "@/api"; +import utils from "@/utils"; import { validators } from "@/mixins/validators"; import { initials } from "@/mixins/initials"; export default { @@ -201,11 +202,16 @@ export default { }, async updateUser() { this.loading = true; - let newKey = await api.users.update(this.user); - this.$store.commit("setToken", newKey.access_token); - this.refreshProfile(); - this.loading = false; - this.$store.dispatch("requestUserData"); + const response = await api.users.update(this.user); + if(response.status != 200) { + utils.notify.error(this.$t('user.user-update-failed')); + } else { + utils.notify.success(this.$t('user.user-updated')); + this.$store.commit("setToken", response.data.access_token); + this.refreshProfile(); + this.loading = false; + this.$store.dispatch("requestUserData"); + } }, async changePassword() { this.paswordLoading = true; @@ -215,7 +221,13 @@ export default { }; if (this.$refs.passChange.validate()) { - await api.users.changePassword(this.user.id, data); + const response = await api.users.changePassword(this.user.id, data); + if (response.status != 200) { + utils.notify.error(this.$t('user.existing-password-does-not-match')); + } else { + utils.notify.success(this.$t('user.password-updated')); + this.$emit("refresh"); + } } this.paswordLoading = false; }, diff --git a/frontend/src/pages/Admin/Settings/CreatePageDialog.vue b/frontend/src/pages/Admin/Settings/CreatePageDialog.vue index 2754e58d0..1d4fddb3b 100644 --- a/frontend/src/pages/Admin/Settings/CreatePageDialog.vue +++ b/frontend/src/pages/Admin/Settings/CreatePageDialog.vue @@ -44,6 +44,7 @@