From 82054b47b64e339d94d2aec96c20e8dd70e1e3bd Mon Sep 17 00:00:00 2001
From: Sercan Yesildal <sercan.yesildal@gmail.com>
Date: Mon, 10 Jul 2023 18:55:22 +0200
Subject: [PATCH] fav feature added

---
 service/planner/db/client.go     | 55 ++++++++++++++++++++++++++++++++
 service/planner/db/init.sql      |  9 ++++++
 service/planner/handler/meal.go  | 37 +++++++++++++++++++++
 service/planner/handler/utils.go |  9 ++++++
 service/planner/main.go          |  2 ++
 service/planner/model/user.go    |  1 +
 service/planner/service/meal.go  | 18 +++++++++++
 7 files changed, 131 insertions(+)

diff --git a/service/planner/db/client.go b/service/planner/db/client.go
index 2a8e4b4..7a55e50 100644
--- a/service/planner/db/client.go
+++ b/service/planner/db/client.go
@@ -148,6 +148,20 @@ func GetUser(id int) (*model.User, error) {
 		user.ShoppingDates = append(user.ShoppingDates, date)
 	}
 
+	queryFavoriteMeals, err := udb.Query("SELECT mealId FROM favoriteMeal WHERE userId = ?;", id)
+	if err != nil {
+		return nil, err
+	}
+	defer queryFavoriteMeals.Close()
+	for queryFavoriteMeals.Next() {
+		var mealId int
+		err = queryFavoriteMeals.Scan(&mealId)
+		if err != nil {
+			continue
+		}
+		user.FavoriteMeal = append(user.FavoriteMeal, mealId)
+	}
+
 	return user, nil
 }
 
@@ -422,6 +436,47 @@ func DeleteUserMeal(id int) error {
 	return nil
 }
 
+func CreateFavoriteMeal(userId int, mealId int) error {
+	udb, err := sql.Open(driverName, cfg.FormatDSN())
+	if err != nil {
+		return err
+	}
+	defer udb.Close()
+
+	queryCheck, err := udb.Query("SELECT * FROM favoriteMeal WHERE userId = ? AND mealId = ?;", userId, mealId)
+	if err != nil {
+		return err
+	}
+	defer queryCheck.Close()
+	if queryCheck.Next() {
+		return errors.New("favorite meal already added")
+	}
+
+	query, err := udb.Query("INSERT INTO favoriteMeal (userId, mealId) VALUES (?, ?);", userId, mealId)
+	if err != nil {
+		return err
+	}
+	query.Close()
+
+	return nil
+}
+
+func DeleteFavoriteMeal(userId int, mealId int) error {
+	udb, err := sql.Open(driverName, cfg.FormatDSN())
+	if err != nil {
+		return err
+	}
+	defer udb.Close()
+
+	query, err := udb.Query("DELETE FROM favoriteMeal WHERE userId = ? AND mealId = ?;", userId, mealId)
+	if err != nil {
+		return err
+	}
+	query.Close()
+
+	return nil
+}
+
 func CreateGroupMeal(groupId int, mealId int, date string) error {
 	udb, err := sql.Open(driverName, cfg.FormatDSN())
 	if err != nil {
diff --git a/service/planner/db/init.sql b/service/planner/db/init.sql
index 710a1ce..b1e6939 100644
--- a/service/planner/db/init.sql
+++ b/service/planner/db/init.sql
@@ -28,6 +28,15 @@ CREATE TABLE
         FOREIGN KEY (`userId`) REFERENCES userAccount(`id`)
     );
 
+CREATE TABLE
+    IF NOT EXISTS `favoriteMeal` (
+        `id` int NOT NULL AUTO_INCREMENT,
+        `userId` int NOT NULL,
+        `mealId` int NOT NULL,
+        PRIMARY KEY (`id`),
+        FOREIGN KEY (`userId`) REFERENCES userAccount(`id`)
+    );
+
 CREATE TABLE
     IF NOT EXISTS `groupMeal` (
         `id` int NOT NULL AUTO_INCREMENT,
diff --git a/service/planner/handler/meal.go b/service/planner/handler/meal.go
index 793190e..46784f3 100644
--- a/service/planner/handler/meal.go
+++ b/service/planner/handler/meal.go
@@ -81,3 +81,40 @@ func DeleteGroupMeal(w http.ResponseWriter, r *http.Request) {
 	}
 	sendJson(w, nil)
 }
+
+func CreateFavoriteMeal(w http.ResponseWriter, r *http.Request) {
+	userId, err := getUserId(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	mealId, err := getMealId(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	if err := service.CreateFavoriteMeal(userId, mealId); err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	sendJson(w, nil)
+}
+
+func DeleteFavoriteMeal(w http.ResponseWriter, r *http.Request) {
+	userId, err := getUserId(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	mealId, err := getMealId(r)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	err = service.DeleteFavoriteMeal(userId, mealId)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	sendJson(w, nil)
+}
diff --git a/service/planner/handler/utils.go b/service/planner/handler/utils.go
index 60cefdc..02ca54a 100644
--- a/service/planner/handler/utils.go
+++ b/service/planner/handler/utils.go
@@ -42,6 +42,15 @@ func getGroupId(r *http.Request) (int, error) {
 	return id, nil
 }
 
+func getMealId(r *http.Request) (int, error) {
+	vars := mux.Vars(r)
+	id, err := strconv.Atoi(vars["mealId"])
+	if err != nil {
+		return 0, err
+	}
+	return id, nil
+}
+
 func getValue(r *http.Request) string {
 	vars := mux.Vars(r)
 	return vars["value"]
diff --git a/service/planner/main.go b/service/planner/main.go
index f17e725..ad739ae 100644
--- a/service/planner/main.go
+++ b/service/planner/main.go
@@ -38,6 +38,8 @@ func main() {
 	router.HandleFunc("/user/date", handler.CreateShoppingDate).Methods(http.MethodPost)
 	router.HandleFunc("/user/meal/{id}", handler.DeleteUserMeal).Methods(http.MethodDelete)
 	router.HandleFunc("/user/meal", handler.CreateUserMeal).Methods(http.MethodPost)
+	router.HandleFunc("/user/{userId}/{mealId}", handler.CreateFavoriteMeal).Methods(http.MethodPost)
+	router.HandleFunc("/user/{userId}/{mealId}", handler.DeleteFavoriteMeal).Methods(http.MethodDelete)
 	router.HandleFunc("/user/{id}", handler.GetUser).Methods(http.MethodGet)
 	router.HandleFunc("/user/{id}", handler.UpdateUser).Methods(http.MethodPut)
 	router.HandleFunc("/user/{id}", handler.DeleteUser).Methods(http.MethodDelete)
diff --git a/service/planner/model/user.go b/service/planner/model/user.go
index 58d6325..571e717 100644
--- a/service/planner/model/user.go
+++ b/service/planner/model/user.go
@@ -6,6 +6,7 @@ type User struct {
 	FirstName     string               `json:"firstName"`
 	LastName      string               `json:"lastName"`
 	GroupIds      []int                `json:"groupIds"`
+	FavoriteMeal  []int                `json:"favoriteMeals"`
 	Meals         []UserMealWithId     `json:"meals"`
 	ShoppingDates []ShoppingDateWithId `json:"shoppingDates"`
 }
diff --git a/service/planner/service/meal.go b/service/planner/service/meal.go
index 5bc1d17..f3352e5 100644
--- a/service/planner/service/meal.go
+++ b/service/planner/service/meal.go
@@ -40,3 +40,21 @@ func DeleteGroupMeal(id int) error {
 
 	return nil
 }
+
+func CreateFavoriteMeal(userId int, mealId int) error {
+	err := db.CreateFavoriteMeal(userId, mealId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func DeleteFavoriteMeal(userId int, mealId int) error {
+	err := db.DeleteFavoriteMeal(userId, mealId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
-- 
GitLab