diff --git a/internal/app/handlers/auth_handler.go b/internal/app/handlers/auth_handler.go index 2da9eff..ebdf7bc 100644 --- a/internal/app/handlers/auth_handler.go +++ b/internal/app/handlers/auth_handler.go @@ -61,5 +61,7 @@ func GoogleCallback(ctx *gin.Context) { func Logout(ctx *gin.Context) { // TODO: Use same values as the GoogleCallback function ctx.SetCookie("jwt_token", "", -1, "/", "", false, true) // TODO: Update settings + ctx.SetCookie("search-filters", "", -1, "/", "", false, true) + ctx.Redirect(http.StatusSeeOther, domain.WEB_HOME) } diff --git a/internal/app/handlers/page_handler.go b/internal/app/handlers/page_handler.go index e9e0f7a..cf90ba2 100644 --- a/internal/app/handlers/page_handler.go +++ b/internal/app/handlers/page_handler.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "os" "strconv" "github.com/a-h/templ" @@ -82,19 +83,6 @@ func FavoritesPage(ctx *gin.Context) { } } - // Else, get the user's favorites - // BUG: Depreciated, not displaying a list, using search to drive this page as well - // deps := ctx.MustGet("deps").(*domainServer.InjectedDependencies) - // userId := ctx.MustGet("userId").(int) - // recipes, err := deps.RecipeService.GetUserFavoriteRecipes(userId) - // if err != nil { - // ctx.JSON(http.StatusInternalServerError, gin.H{ - // "status": http.StatusInternalServerError, - // "message": fmt.Sprintf("Error getting favorites. %s\n", err.Error()), - // }) - // return - // } - ctx.HTML(http.StatusOK, "", layouts.AppLayout(title, page)) } @@ -200,24 +188,8 @@ func RecipePage(ctx *gin.Context) { return } - // Add engagement - // BUG: Don't want to do this here - // if loggedIn { - // if _, err = deps.EngagementService.UserViewRecipe(*userId, recipe.Id); err != nil { - // fmt.Printf("ERROR: %s\n", err.Error()) - // ctx.JSON(400, err.Error()) - // return - // } - // } else { - // if _, err = deps.EngagementService.ViewRecipe(recipe.Id); err != nil { - // fmt.Printf("ERROR: %s\n", err.Error()) - // ctx.JSON(400, err.Error()) - // return - // } - // } - title := "Potion - View Recipe" - page := pages.RecipePage(*recipe, *user, loggedIn) + page := pages.RecipePage(*recipe, *user, loggedIn, os.Getenv("DOMAIN")) ctx.HTML(http.StatusOK, "", layouts.AppLayout(title, page)) } diff --git a/internal/app/handlers/recipe_handler.go b/internal/app/handlers/recipe_handler.go index a37ffc2..681e36f 100644 --- a/internal/app/handlers/recipe_handler.go +++ b/internal/app/handlers/recipe_handler.go @@ -121,6 +121,10 @@ func SearchRecipesFavorites(ctx *gin.Context) { // TODO: Error here if they're not logged in? // Get user data (they should be logged in) + if !domain.IsLoggedIn(ctx) { + ctx.JSON(http.StatusOK, gin.H{"error": "User is not logged in. User will be nil."}) + } + userId := ctx.MustGet("userId").(int) recipes, err := deps.RecipeService.SearchRecipes(filters, &userId, true) diff --git a/internal/app/server/server.go b/internal/app/server/server.go index 9863e17..a921e6d 100644 --- a/internal/app/server/server.go +++ b/internal/app/server/server.go @@ -188,22 +188,6 @@ func (s *Server) Setup() *Server { router_api.GET("/user/recipes", handlers.GetUserRecipes) router_api.GET("/user/favorites", handlers.GetUserFavoriteRecipes) - router_api.GET("/user/temp", func(ctx *gin.Context) { - recipes, err := recipeService.GetUserMadeRecipes(3, 6) - - if err != nil { - ctx.JSON(http.StatusBadRequest, gin.H{ - "recipes": recipes, - "error": err.Error(), - }) - } else { - ctx.JSON(http.StatusBadRequest, gin.H{ - "recipes": recipes, - "error": "", - }) - } - }) - // Engagement endpoints router_api.POST("/engagement/view/:id", handlers.EngagementViewRecipe) router_api.POST("/engagement/share/:id", handlers.EngagementShareRecipe) diff --git a/internal/infrastructure/database/repository/user_repository.go b/internal/infrastructure/database/repository/user_repository.go index 1bf0b97..b593d3d 100644 --- a/internal/infrastructure/database/repository/user_repository.go +++ b/internal/infrastructure/database/repository/user_repository.go @@ -2,6 +2,7 @@ package repository import ( "database/sql" + "fmt" domain "github.com/haydenhargreaves/Potion/internal/domain/user" _ "github.com/lib/pq" @@ -35,6 +36,10 @@ func (r *UserRepository) CreateGoogleUser(googleUserInfo *domain.GoogleUserInfo, return domain.User{}, err } + if googleUserInfo == nil { + return domain.User{}, fmt.Errorf("Google user info provided was nil") + } + var user domain.User query := `INSERT INTO users (GoogleId, Name, Email, ImageUrl, GoogleRefreshToken) diff --git a/internal/templates/components/navbar_templ.go b/internal/templates/components/navbar_templ.go index 0ae98db..9a3c7c2 100644 --- a/internal/templates/components/navbar_templ.go +++ b/internal/templates/components/navbar_templ.go @@ -211,7 +211,7 @@ func Navbar(current string) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\">

Potion

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "\">

Potion

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/internal/templates/pages/favorites.templ b/internal/templates/pages/favorites.templ index 230931c..7ddc99e 100644 --- a/internal/templates/pages/favorites.templ +++ b/internal/templates/pages/favorites.templ @@ -6,68 +6,73 @@ import "github.com/haydenhargreaves/Potion/internal/domain/recipe" import domainServer "github.com/haydenhargreaves/Potion/internal/domain/server" templ FavoriteList(recipes []domain.Recipe) { -
- for _, recipe := range recipes { - @favoriteResult(recipe) - } - if len(recipes) == 0 || recipes == nil { -

No results

- } else { -

End of results

- } -
+
+ for _, recipe := range recipes { + @favoriteResult(recipe) + } + if len(recipes) == 0 || recipes == nil { +

No results

+ } else { +

End of results

+ } +
} templ favoriteResult(recipe domain.Recipe) { -
- -
-
-
-

- { recipe.Title } -

-
- - @timeIconSm() - { recipe.Duration.Total } min - - - for _ = range(recipe.Difficulty) { - @starIconSm(true) - } - for _ = range(5 - recipe.Difficulty) { - @starIconSm(false) - } - - - @servingIconSm() - Serves { recipe.Serves } - -
-
- -
-

{ recipe.Description }

-
-
+
+ +
+
+
+

+ { recipe.Title } +

+
+ + @timeIconSm() + { recipe.Duration.Total } min + + + for _ = range(recipe.Difficulty) { + @starIconSm(true) + } + for _ = range(5 - recipe.Difficulty) { + @starIconSm(false) + } + + + @servingIconSm() + Serves { recipe.Serves } + +
+
+ +
+

{ recipe.Description }

+
+
} templ FavoritesPage(filters domain.SearchFilters) { -@components.Navbar("favorites") -
-
- @components.BannerText("Favorites") - @components.SearchBar(filters, false, true, true) -
- @FavoriteList(nil) -
-
+ @components.Navbar("favorites") +
+
+ @components.BannerText("Favorites") + @components.SearchBar(filters, false, true, true) +
+ @FavoriteList(nil) +
+
} diff --git a/internal/templates/pages/favorites_templ.go b/internal/templates/pages/favorites_templ.go index 7f56398..790cfd8 100644 --- a/internal/templates/pages/favorites_templ.go +++ b/internal/templates/pages/favorites_templ.go @@ -91,7 +91,7 @@ func favoriteResult(recipe domain.Recipe) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf(domainServer.API_ENGAGEMENT_VIEW, recipe.Id)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 22, Col: 71} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 23, Col: 68} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -104,7 +104,7 @@ func favoriteResult(recipe domain.Recipe) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(recipe.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 29, Col: 24} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 33, Col: 20} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -117,7 +117,7 @@ func favoriteResult(recipe domain.Recipe) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(recipe.Category) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 29, Col: 95} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 33, Col: 91} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -134,7 +134,7 @@ func favoriteResult(recipe domain.Recipe) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(recipe.Duration.Total) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 34, Col: 35} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 38, Col: 30} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -171,7 +171,7 @@ func favoriteResult(recipe domain.Recipe) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(recipe.Serves) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 46, Col: 34} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 50, Col: 29} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -184,7 +184,7 @@ func favoriteResult(recipe domain.Recipe) templ.Component { var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(recipe.Description) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 58, Col: 73} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/favorites.templ`, Line: 63, Col: 72} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { diff --git a/internal/templates/pages/recipe.templ b/internal/templates/pages/recipe.templ index 3f4a99f..44b6b8c 100644 --- a/internal/templates/pages/recipe.templ +++ b/internal/templates/pages/recipe.templ @@ -291,7 +291,7 @@ templ buttonSection(favorited bool, id int, loggedIn bool) { } -templ RecipePage(recipe domain.Recipe, user domainUser.User, loggedIn bool) { +templ RecipePage(recipe domain.Recipe, user domainUser.User, loggedIn bool, domain string) { @components.Navbar("")
@@ -312,10 +312,10 @@ templ RecipePage(recipe domain.Recipe, user domainUser.User, loggedIn bool) { @tagList(recipe.Tags, recipe.Created, recipe.Modified)
- @scripts(recipe.Id) + @scripts(recipe.Id, domain) } -templ scripts(id int) { +templ scripts(id int, domain string) { ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 62, "/v1/web/recipe/") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Var36, templ_7745c5c3_Err := templruntime.ScriptContentInsideStringLiteral(id) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/templates/pages/recipe.templ`, Line: 326, Col: 51} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var36) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "\"\n navigator.clipboard.writeText(url).then(() => {\n button.outerHTML = `\n \n `;\n\n setTimeout(() => {\n const newButton = document.getElementById(\"share-button\");\n newButton.outerHTML = before;\n }, 2000);\n });\n } else {\n console.warn(\"Clipboard API not available.\");\n\n button.outerHTML = `\n \n `;\n\n setTimeout(() => {\n const newButton = document.getElementById(\"share-button\");\n newButton.outerHTML = before;\n }, 2000);\n }\n }\n\n function makeButtonHandler() {\n const button = document.getElementById(\"make-button\");\n\n button.outerHTML = `\n \n \n \n \n \n \n Made This!\n \n `;\n }\n\n function favoriteButtonHandler() {\n const button = document.getElementById(\"favorite-button\");\n\n console.log(button.classList);\n console.log(button.classList.contains(\"border-blue-300\"));\n\n const toggleClasses = [\n \"border-gray-300\", \"hover:bg-gray-50\", \"hover:border-blue-300\",\n \"border-blue-300\", \"bg-blue-50\", \"hover:bg-blue-100\", \"hover:border-blue-500\"\n ];\n\n for (const cls of toggleClasses) {\n console.log(\"toggling class \" + cls);\n button.classList.toggle(cls);\n }\n\n if (!button.classList.contains(\"border-blue-300\")) {\n button.innerHTML = `\n \n \n \n Favorite\n `;\n\n } else {\n button.innerHTML = `\n \n \n \n Unfavorite\n `;\n }\n\n }\n\n") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err }