aboutsummaryrefslogtreecommitdiff
path: root/cmd/web/controller/htmx/article-action.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/web/controller/htmx/article-action.go')
-rw-r--r--cmd/web/controller/htmx/article-action.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/cmd/web/controller/htmx/article-action.go b/cmd/web/controller/htmx/article-action.go
new file mode 100644
index 0000000..a7b1f23
--- /dev/null
+++ b/cmd/web/controller/htmx/article-action.go
@@ -0,0 +1,105 @@
+package HTMXController
+
+import (
+ "errors"
+ "projecty/cmd/web/model"
+ "projecty/internal/authentication"
+ "projecty/internal/database"
+ "projecty/internal/helper"
+
+ "github.com/gofiber/fiber/v2"
+ "gorm.io/gorm"
+)
+
+func ArticleFavoriteAction(c *fiber.Ctx) error {
+
+ var article model.Article
+ var authenticatedUser model.User
+
+ isArticleFavorited := false
+
+ isAuthenticated, userID := authentication.AuthGet(c)
+ if !isAuthenticated {
+ return helper.HTMXRedirectTo("/sign-in", "/htmx/sign-in", c)
+
+ }
+
+ db := database.Get()
+
+ err := db.Model(&article).
+ Where("slug = ?", c.Params("slug")).
+ Preload("Favorites").
+ Find(&article).Error
+
+ if err != nil {
+ if errors.Is(err, gorm.ErrRecordNotFound) {
+ return helper.HTMXRedirectTo("/sign-in", "/htmx/sign-in", c)
+ }
+ }
+
+ authenticatedUser.ID = userID
+
+ if article.FavoritedBy(userID) {
+ db.Model(&article).Association("Favorites").Delete(&authenticatedUser)
+ } else {
+ db.Model(&article).Association("Favorites").Append(&authenticatedUser)
+ isArticleFavorited = true
+ }
+
+ return c.Render("articles/partials/favorite-button", fiber.Map{
+ "Article": article,
+ "Slug": article.Slug,
+ "IsArticleFavorited": isArticleFavorited,
+ "IsOob": true,
+ }, "layouts/app-htmx")
+}
+
+func ArticleFollowAction(c *fiber.Ctx) error {
+
+ var article model.Article
+ var authenticatedUser model.User
+
+ isFollowed := false
+
+ isAuthenticated, userID := authentication.AuthGet(c)
+ if !isAuthenticated {
+ return helper.HTMXRedirectTo("/sign-in", "/htmx/sign-in", c)
+ }
+
+ db := database.Get()
+
+ err := db.Model(&article).
+ Where("slug = ?", c.Params("slug")).
+ Preload("Favorites").
+ Preload("User.Followers").
+ Find(&article).Error
+
+ if err != nil {
+ if errors.Is(err, gorm.ErrRecordNotFound) {
+ return helper.HTMXRedirectTo("/sign-in", "/htmx/sign-in", c)
+ }
+ }
+
+ authenticatedUser.ID = userID
+
+ if article.User.FollowedBy(userID) {
+
+ f := model.Follow{
+ FollowerID: article.UserID,
+ FollowingID: userID,
+ }
+
+ db.Model(&article.User).Association("Followers").Find(&f)
+ db.Delete(&f)
+
+ } else {
+ db.Model(&article.User).Association("Followers").Append(&model.Follow{FollowerID: article.UserID, FollowingID: userID})
+ isFollowed = true
+ }
+
+ return c.Render("articles/partials/follow-button", fiber.Map{
+ "Article": article,
+ "IsFollowed": isFollowed,
+ "IsOob": true,
+ }, "layouts/app-htmx")
+}