diff options
Diffstat (limited to 'cmd/web/controller/htmx/user.go')
-rw-r--r-- | cmd/web/controller/htmx/user.go | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/cmd/web/controller/htmx/user.go b/cmd/web/controller/htmx/user.go new file mode 100644 index 0000000..b0a2605 --- /dev/null +++ b/cmd/web/controller/htmx/user.go @@ -0,0 +1,195 @@ +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 UserDetailPage(c *fiber.Ctx) error { + + var authenticatedUser model.User + var user model.User + isSelf := false + isFollowed := false + navbarActive := "none" + + isAuthenticated, userID := authentication.AuthGet(c) + + db := database.Get() + + err := db.Model(&user). + Where("username = ?", c.Params("username")). + Preload("Followers"). + Find(&user).Error + + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return helper.HTMXRedirectTo("/", "/htmx/home", c) + } + } + + if isAuthenticated { + db.Model(&authenticatedUser). + Where("id = ?", userID). + First(&authenticatedUser) + } + + if isAuthenticated && user.ID == userID { + isSelf = true + navbarActive = "profile" + } + + if isAuthenticated && !isSelf && user.FollowedBy(userID) { + isFollowed = true + } + + return c.Render("users/htmx-users-page", fiber.Map{ + "PageTitle": user.Name, + "IsSelf": isSelf, + "IsFollowed": isFollowed, + "AuthenticatedUser": authenticatedUser, + "User": user, + "NavBarActive": navbarActive, + "FiberCtx": c, + }, "layouts/app-htmx") +} + +func UserArticles(c *fiber.Ctx) error { + + var articles []model.Article + var user model.User + hasArticles := false + + _, userID := authentication.AuthGet(c) + + db := database.Get() + + err := db.Where(&user). + Where("username = ?", c.Params("username")). + First(&user).Error + + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return helper.HTMXRedirectTo("/", "/htmx/home", c) + } + } + + db.Where(&model.Article{UserID: user.ID}). + Preload("Favorites"). + Preload("Tags", func(db *gorm.DB) *gorm.DB { + return db.Order("tags.name asc") + }). + Preload("User"). + Order("created_at desc"). + Find(&articles) + + if len(articles) > 0 { + hasArticles = true + + for i := 0; i < len(articles); i++ { + articles[i].IsFavorited = articles[i].FavoritedBy(userID) + } + } + + feedNavbarItems := []fiber.Map{ + { + "Title": "Articles", + "IsActive": true, + "HXPushURL": "/users/" + user.Username, + "HXGetURL": "/htmx/users/" + user.Username, + }, + { + "Title": "Favorited Articles", + "IsActive": false, + "HXPushURL": "/users/" + user.Username + "/favorites", + "HXGetURL": "/htmx/users/" + user.Username + "/favorites", + }, + } + + return c.Render("users/htmx-users-articles", fiber.Map{ + "HasArticles": hasArticles, + "Articles": articles, + "User": user, + "FeedNavbarItems": feedNavbarItems, + }, "layouts/app-htmx") +} + +func UserArticlesFavorite(c *fiber.Ctx) error { + + var articles []model.Article + var user model.User + isSelf := false + isFollowed := false + hasArticles := false + + isAuthenticated, userID := authentication.AuthGet(c) + + db := database.Get() + + err := db.Model(&user). + Where("username = ?", c.Params("username")). + First(&user).Error + + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return helper.HTMXRedirectTo("/", "/htmx/home", c) + } + } + + db.Model(&user). + Preload("Favorites"). + Preload("Tags", func(db *gorm.DB) *gorm.DB { + return db.Order("tags.name asc") + }). + Preload("User"). + Order("created_at desc"). + Association("Favorites"). + Find(&articles) + + if len(articles) > 0 { + hasArticles = true + + for i := 0; i < len(articles); i++ { + articles[i].IsFavorited = articles[i].FavoritedBy(userID) + } + } + + if isAuthenticated && user.ID == userID { + isSelf = true + } + + if isAuthenticated && !isSelf && user.FollowedBy(userID) { + isFollowed = true + } + + feedNavbarItems := []fiber.Map{ + { + "Title": "Articles", + "IsActive": false, + "HXPushURL": "/users/" + user.Username + "/articles", + "HXGetURL": "/htmx/users/" + user.Username + "/articles", + }, + { + "Title": "Favorited Articles", + "IsActive": true, + "HXPushURL": "/users/" + user.Username + "/favorites", + "HXGetURL": "/htmx/users/" + user.Username + "/favorites", + }, + } + + return c.Render("users/htmx-users-articles", fiber.Map{ + "IsSelf": isSelf, + "IsFollowed": isFollowed, + "HasArticles": hasArticles, + "Articles": articles, + "User": user, + "FeedNavbarItems": feedNavbarItems, + "IsLoadFavorites": true, + }, "layouts/app-htmx") +} |