132 lines
3.5 KiB
Go
132 lines
3.5 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
domain "github.com/haydenhargreaves/Potion/internal/domain/recipe"
|
|
)
|
|
|
|
// GetRecipeOfTheWeekHandler fetchs the current recipe of the week and returns it.
|
|
// If an error occurs, it will be returned and a recipe will not be returned.
|
|
//
|
|
// BUG: Until auth is reimplemented, there is no way to determine what user is making the
|
|
// call.
|
|
// NOTE: I believe this issue has been resolved
|
|
func (s *Server) GetRecipeOfTheWeekHandlerV2(ctx *gin.Context) {
|
|
userId := getUserId(ctx)
|
|
recipe, err := s.deps.RecipeService.GetRecipeOfTheWeek(userId)
|
|
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to get recipe of the week. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"status": http.StatusOK,
|
|
"message": "[OK] Successfully retrieved recipe of the week.",
|
|
"recipe": recipe,
|
|
})
|
|
}
|
|
|
|
func (s *Server) GetRecipeHandlerV2(ctx *gin.Context) {
|
|
id := ctx.Param("id")
|
|
parsedId, err := strconv.Atoi(id)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to parse ID parameter. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
userId := getUserId(ctx)
|
|
recipe, err := s.deps.RecipeService.GetRecipe(parsedId, userId)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to get recipe. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"status": http.StatusOK,
|
|
"message": "[OK] Successfully retrieved recipe.",
|
|
"recipe": recipe,
|
|
})
|
|
}
|
|
|
|
func (s *Server) SearchRecipeHandlerV2(ctx *gin.Context) {
|
|
var filters domain.SearchFilters
|
|
|
|
// Parse filters
|
|
if err := ctx.ShouldBindJSON(&filters); err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to parse filters. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
// This is optional, so we can do this
|
|
userId := getUserId(ctx)
|
|
|
|
// Did I really have two APIs...?
|
|
// TODO: Fix service at some point, no need to accept the favorites (bool) param
|
|
recipes, err := s.deps.RecipeService.SearchRecipes(filters, userId, filters.Favorites)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to get searched recipes. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"status": http.StatusOK,
|
|
"message": "[OK] Successfully retrieved recipes based on provided filters.",
|
|
"recipes": recipes,
|
|
})
|
|
}
|
|
|
|
func (s *Server) CreateRecipeHandlerV2(ctx *gin.Context) {
|
|
userId := getUserId(ctx)
|
|
if userId == nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": "[ERROR] User must be logged in to create a recipe.",
|
|
})
|
|
return
|
|
}
|
|
|
|
recipe, err := s.deps.RecipeService.CreateRecipe(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to create recipe. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
_, err = s.deps.EngagementService.UserCreateRecipe(*userId, recipe.Id)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to create recipe engagement. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"status": http.StatusOK,
|
|
"message": "[OK] Successfully created new recipe.",
|
|
"recipe": recipe,
|
|
})
|
|
}
|