From dbea03e0c49be4d030a9068a550981fd9d043b36 Mon Sep 17 00:00:00 2001
From: Sercan Yesildal <sercan.yesildal@gmail.com>
Date: Sun, 9 Jul 2023 19:41:13 +0200
Subject: [PATCH] filter added

---
 service/meal/db/mealdb/client.go | 40 ++++++++++++++++++++++++++++++++
 service/meal/db/mealdb/model.go  |  2 ++
 service/meal/handler/meal.go     | 27 +++++++++++++++++++++
 service/meal/main.go             |  4 ++++
 service/meal/model/meal.go       |  4 ++--
 service/meal/service/meal.go     |  9 +++++++
 6 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/service/meal/db/mealdb/client.go b/service/meal/db/mealdb/client.go
index 0a3de13..1796d8e 100644
--- a/service/meal/db/mealdb/client.go
+++ b/service/meal/db/mealdb/client.go
@@ -123,6 +123,46 @@ func SearchMealBy(value string, filter model.Filter) ([]*model.MealOverview, err
 	return meals, nil
 }
 
+func GetFilter(filter model.Filter) (*model.FilterOverview, error) {
+	path := fmt.Sprintf("list.php?%s=list", filter)
+	request, err := http.NewRequest(http.MethodGet, baseUrl+path, nil)
+	if err != nil {
+		return nil, err
+	}
+	response, err := client.Do(request)
+	if err != nil {
+		return nil, err
+	}
+	var mealResponse *MealResponse
+	err = json.NewDecoder(response.Body).Decode(&mealResponse)
+	if err != nil {
+		return nil, err
+	}
+	filterOverview := &model.FilterOverview{}
+	switch filter {
+	case model.CATEGORY:
+		for _, v := range mealResponse.Meals {
+			if v.StrCategory != nil {
+				filterOverview.ValidValues = append(filterOverview.ValidValues, *v.StrCategory)
+			}
+		}
+	case model.AREA:
+		for _, v := range mealResponse.Meals {
+			if v.StrArea != nil {
+				filterOverview.ValidValues = append(filterOverview.ValidValues, *v.StrArea)
+			}
+		}
+	case model.INGREDIENT:
+		for _, v := range mealResponse.Meals {
+			if v.StrIngredient != nil {
+				filterOverview.ValidValues = append(filterOverview.ValidValues, *v.StrIngredient)
+			}
+		}
+	}
+
+	return filterOverview, nil
+}
+
 func createMeal(currentMeal *Meal) (*model.Meal, error) {
 	meal := &model.Meal{}
 	if currentMeal.IdMeal != nil {
diff --git a/service/meal/db/mealdb/model.go b/service/meal/db/mealdb/model.go
index 4584377..4cd7116 100644
--- a/service/meal/db/mealdb/model.go
+++ b/service/meal/db/mealdb/model.go
@@ -8,6 +8,8 @@ type Meal struct {
 	IdMeal          *string
 	StrMeal         *string
 	StrCategory     *string
+	StrArea         *string
+	StrIngredient   *string
 	StrInstructions *string
 	StrMealThumb    *string
 	StrIngredient1  *string
diff --git a/service/meal/handler/meal.go b/service/meal/handler/meal.go
index 069c55b..13b1612 100644
--- a/service/meal/handler/meal.go
+++ b/service/meal/handler/meal.go
@@ -65,3 +65,30 @@ func SearchMealByIngredient(w http.ResponseWriter, r *http.Request) {
 	}
 	sendJson(w, meals)
 }
+
+func GetCategoryOverview(w http.ResponseWriter, r *http.Request) {
+	categoryOverview, err := service.GetFilter(model.CATEGORY)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	sendJson(w, categoryOverview)
+}
+
+func GetAreaOverview(w http.ResponseWriter, r *http.Request) {
+	areaOverview, err := service.GetFilter(model.AREA)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	sendJson(w, areaOverview)
+}
+
+func GetIngredientOverview(w http.ResponseWriter, r *http.Request) {
+	ingredientOverview, err := service.GetFilter(model.INGREDIENT)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	sendJson(w, ingredientOverview)
+}
diff --git a/service/meal/main.go b/service/meal/main.go
index 3427f29..04b06cc 100644
--- a/service/meal/main.go
+++ b/service/meal/main.go
@@ -15,9 +15,13 @@ func main() {
 	router.HandleFunc("/random", handler.GetRandomMeal).Methods(http.MethodGet)
 	router.HandleFunc("/search/{value}", handler.SearchMealByName).Methods(http.MethodGet)
 	router.HandleFunc("/category/{value}", handler.SearchMealByCategory).Methods(http.MethodGet)
+	router.HandleFunc("/category", handler.GetCategoryOverview).Methods(http.MethodGet)
 	router.HandleFunc("/area/{value}", handler.SearchMealByArea).Methods(http.MethodGet)
+	router.HandleFunc("/area", handler.GetAreaOverview).Methods(http.MethodGet)
 	router.HandleFunc("/ingredient/{value}", handler.SearchMealByIngredient).Methods(http.MethodGet)
+	router.HandleFunc("/ingredient", handler.GetIngredientOverview).Methods(http.MethodGet)
 	router.HandleFunc("/{id}", handler.GetMeal).Methods(http.MethodGet)
+	fmt.Printf("Server is listening on port :%v\n", port)
 	if err := http.ListenAndServe(fmt.Sprintf(":%v", port), router); err != nil {
 		log.Fatal(err)
 	}
diff --git a/service/meal/model/meal.go b/service/meal/model/meal.go
index 92c65d0..d83cf19 100644
--- a/service/meal/model/meal.go
+++ b/service/meal/model/meal.go
@@ -20,8 +20,8 @@ type MealOverview struct {
 	ImagePath string `json:"imagePath"`
 }
 
-type FilterValues struct {
-	Values []string `json:"values"`
+type FilterOverview struct {
+	ValidValues []string `json:"validValues"`
 }
 
 const (
diff --git a/service/meal/service/meal.go b/service/meal/service/meal.go
index 2f51a74..b3a17fe 100644
--- a/service/meal/service/meal.go
+++ b/service/meal/service/meal.go
@@ -40,3 +40,12 @@ func SearchMealBy(value string, filter model.Filter) ([]*model.MealOverview, err
 
 	return meals, nil
 }
+
+func GetFilter(filter model.Filter) (*model.FilterOverview, error) {
+	filterOverview, err := mealdb.GetFilter(filter)
+	if err != nil {
+		return nil, err
+	}
+
+	return filterOverview, nil
+}
-- 
GitLab