This should be a nice test! Hopefully other users cannot delete my recipes. Though they're setup to soft delete.
200 lines
5.4 KiB
Go
200 lines
5.4 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
domain "github.com/haydenhargreaves/Potion/internal/domain/recipe"
|
|
domainUser "github.com/haydenhargreaves/Potion/internal/domain/user"
|
|
)
|
|
|
|
// 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,
|
|
})
|
|
}
|
|
|
|
func (s *Server) DeleteRecipeHandlerV2(ctx *gin.Context) {
|
|
s.withAuthenticatedUser(ctx, func(ctx *gin.Context, user *domainUser.User) {
|
|
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
|
|
}
|
|
|
|
_, err = s.deps.EngagementService.UserDeleteRecipe(user.Id, parsedId)
|
|
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
|
|
}
|
|
|
|
if err := s.deps.RecipeService.DeleteRecipe(user.Id, parsedId); err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to delete recipe. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"status": http.StatusOK,
|
|
"message": "[OK] Successfully deleted recipe.",
|
|
})
|
|
})
|
|
}
|
|
|
|
func (s *Server) IsRecipeOwnerV2(ctx *gin.Context) {
|
|
userId := getUserId(ctx)
|
|
|
|
id := ctx.Param("id")
|
|
parsedId, err := strconv.Atoi(id)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"owner": false,
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to parse ID parameter. %s", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
isOwner, err := s.deps.RecipeService.IsRecipeOwner(userId, parsedId)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusBadRequest, gin.H{
|
|
"owner": false,
|
|
"status": http.StatusBadRequest,
|
|
"message": fmt.Sprintf("[ERROR] Failed to determine is user is recipe owner.", err.Error()),
|
|
})
|
|
return
|
|
}
|
|
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"owner": isOwner,
|
|
"status": http.StatusOK,
|
|
"message": "[OK] Successfully determined recipe ownership status.",
|
|
})
|
|
}
|