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 @@