Skip to content
Snippets Groups Projects
Commit d0f4d1c2 authored by Sercan Yesildal's avatar Sercan Yesildal
Browse files

added handlers

parent d7530996
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@ package mealdb
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"strconv"
"time"
......@@ -26,24 +27,104 @@ func GetRandomMeal() (*model.Meal, error) {
if err != nil {
return nil, err
}
if response.StatusCode != http.StatusOK {
return nil, errors.New("mealdb request failed")
}
var mealResponse *MealResponse
err = json.NewDecoder(response.Body).Decode(&mealResponse)
if err != nil {
return nil, err
}
return getMeal(mealResponse)
if len(mealResponse.Meals) < 1 {
return nil, errors.New("no meals within the response")
}
currentMeal := mealResponse.Meals[0]
return createMeal(currentMeal)
}
func getMeal(mealResponse *MealResponse) (*model.Meal, error) {
meal := &model.Meal{}
func GetMeal(id int) (*model.Meal, error) {
path := fmt.Sprintf("lookup.php?i=%d", id)
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
}
if len(mealResponse.Meals) < 1 {
return nil, errors.New("no meals within the response")
}
currentMeal := mealResponse.Meals[0]
return createMeal(currentMeal)
}
func SearchMealByName(name string) ([]*model.Meal, error) {
path := fmt.Sprintf("search.php?s=%s", name)
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
}
meals := []*model.Meal{}
for _, v := range mealResponse.Meals {
meal, err := createMeal(v)
if err != nil {
continue
}
meals = append(meals, meal)
}
return meals, nil
}
func SearchMealBy(value string, filter model.Filter) ([]*model.MealOverview, error) {
path := fmt.Sprintf("filter.php?%s=%s", filter, value)
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
}
meals := []*model.MealOverview{}
for _, v := range mealResponse.Meals {
meal, err := createMealOverview(v)
if err != nil {
continue
}
meals = append(meals, meal)
}
return meals, nil
}
func createMeal(currentMeal *Meal) (*model.Meal, error) {
meal := &model.Meal{}
if currentMeal.IdMeal != nil {
id, err := strconv.Atoi(*currentMeal.IdMeal)
if err == nil {
......@@ -311,3 +392,21 @@ func getMeal(mealResponse *MealResponse) (*model.Meal, error) {
return meal, nil
}
func createMealOverview(currentMeal *Meal) (*model.MealOverview, error) {
meal := &model.MealOverview{}
if currentMeal.IdMeal != nil {
id, err := strconv.Atoi(*currentMeal.IdMeal)
if err == nil {
meal.ID = id
}
}
if currentMeal.StrMeal != nil {
meal.Name = *currentMeal.StrMeal
}
if currentMeal.StrMealThumb != nil {
meal.ImagePath = *currentMeal.StrMealThumb
}
return meal, nil
}
......@@ -3,6 +3,7 @@ package handler
import (
"net/http"
"gitlab.reutlingen-university.de/yesildas/mealplanner2go/service/meal/model"
"gitlab.reutlingen-university.de/yesildas/mealplanner2go/service/meal/service"
)
......@@ -10,6 +11,57 @@ func GetRandomMeal(w http.ResponseWriter, r *http.Request) {
meal, err := service.GetRandomMeal()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
sendJson(w, meal)
}
func GetMeal(w http.ResponseWriter, r *http.Request) {
id, err := getId(r)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
meal, err := service.GetMeal(id)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
sendJson(w, meal)
}
func SearchMealByName(w http.ResponseWriter, r *http.Request) {
meals, err := service.SearchMealByName(getValue(r))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
sendJson(w, meals)
}
func SearchMealByCategory(w http.ResponseWriter, r *http.Request) {
meals, err := service.SearchMealBy(getValue(r), model.CATEGORY)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
sendJson(w, meals)
}
func SearchMealByArea(w http.ResponseWriter, r *http.Request) {
meals, err := service.SearchMealBy(getValue(r), model.AREA)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
sendJson(w, meals)
}
func SearchMealByIngredient(w http.ResponseWriter, r *http.Request) {
meals, err := service.SearchMealBy(getValue(r), model.INGREDIENT)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
sendJson(w, meals)
}
......@@ -3,6 +3,9 @@ package handler
import (
"encoding/json"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
func sendJson(w http.ResponseWriter, value interface{}) {
......@@ -11,3 +14,17 @@ func sendJson(w http.ResponseWriter, value interface{}) {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func getId(r *http.Request) (int, error) {
vars := mux.Vars(r)
id, err := strconv.Atoi(vars["id"])
if err != nil {
return 0, err
}
return id, nil
}
func getValue(r *http.Request) string {
vars := mux.Vars(r)
return vars["value"]
}
......@@ -13,6 +13,11 @@ func main() {
port := 8000
router := mux.NewRouter()
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("/area/{value}", handler.SearchMealByArea).Methods(http.MethodGet)
router.HandleFunc("/ingredient/{value}", handler.SearchMealByIngredient).Methods(http.MethodGet)
router.HandleFunc("/{id}", handler.GetMeal).Methods(http.MethodGet)
if err := http.ListenAndServe(fmt.Sprintf(":%v", port), router); err != nil {
log.Fatal(err)
}
......
......@@ -13,3 +13,21 @@ type Meal struct {
Instructions string `json:"instructions"`
ImagePath string `json:"imagePath"`
}
type MealOverview struct {
ID int `json:"id"`
Name string `json:"name"`
ImagePath string `json:"imagePath"`
}
type FilterValues struct {
Values []string `json:"values"`
}
const (
CATEGORY Filter = "c"
AREA Filter = "a"
INGREDIENT Filter = "i"
)
type Filter string
......@@ -13,3 +13,30 @@ func GetRandomMeal() (*model.Meal, error) {
return meal, nil
}
func GetMeal(id int) (*model.Meal, error) {
meal, err := mealdb.GetMeal(id)
if err != nil {
return nil, err
}
return meal, nil
}
func SearchMealByName(name string) ([]*model.Meal, error) {
meals, err := mealdb.SearchMealByName(name)
if err != nil {
return nil, err
}
return meals, nil
}
func SearchMealBy(value string, filter model.Filter) ([]*model.MealOverview, error) {
meals, err := mealdb.SearchMealBy(value, filter)
if err != nil {
return nil, err
}
return meals, nil
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment